Sfoglia il codice sorgente

添加绑定微信逻辑

shmily1213 1 mese fa
parent
commit
34f3855ab4

+ 12 - 2
src/api/modules/login.ts

@@ -12,12 +12,22 @@ export function login(params: LoginRequestDTO) {
   return flyio.post('/front/user/userLogin', params) as Promise<ApiResponse<MobileLoginResponseDTO>>;
 }
 
+/**
+ * 微信登录
+ * @param params 
+ * @returns 
+ */
 export function wxLogin(params: WxLoginRequestDTO) {
-  return flyio.post('/front/user/loginByCode', params) as Promise<ApiResponse<any>>;
+  return flyio.post('/front/user/loginByCode', params) as Promise<ApiResponse<MobileLoginResponseDTO>>;
 }
 
+/**
+ * 绑定微信
+ * @param code 
+ * @returns 
+ */
 export function bindOpenId(code: string) {
-  return flyio.post('/front/user/loginByCode', { loginCode: code }) as Promise<ApiResponse<any>>;
+  return flyio.post('/front/user/bindOpenId', { loginCode: code }) as Promise<ApiResponse<any>>;
 }
 
 /**

+ 1 - 0
src/hooks/usePay.ts

@@ -82,6 +82,7 @@ export const usePay = () => {
         }
       }
     } catch (error) {
+      console.error(error);
       loading.value = false;
       uni.$ie.showToast('下单失败,请稍后再试');
     }

+ 2 - 2
src/manifest.json

@@ -2,8 +2,8 @@
     "name" : "单招一卡通",
     "appid" : "__UNI__37DEDFB",
     "description" : "单招一卡通,升学一路通!",
-    "versionName" : "4.0.0",
-    "versionCode" : "400",
+    "versionName" : "4.0.1",
+    "versionCode" : "401",
     "transformPx" : false,
     "app-plus" : {
         "usingComponents" : true,

+ 1 - 0
src/pagesSystem/pages/bind-profile/bind-profile.vue

@@ -448,6 +448,7 @@ const gatherInfo = () => {
     mobile: registerInfo.mobile,
     username: registerInfo.username,
     password: registerInfo.password,
+    openId: registerInfo.openId,
   }
   // 注册时,如果以游客身份使用过,则从临时信息中获取省份和考试类型
   if (scene === EnumBindScene.REGISTER) {

+ 1 - 1
src/pagesSystem/pages/login/login.vue

@@ -50,7 +50,7 @@
             </view>
           </uv-button>
           <uv-button v-else :custom-style="customBtnStyle" :hover-effect="false" :disabled="!isAgree" type="primary"
-            text="手机号快捷登录" icon-color="white" open-type="getPhoneNumber|agreePrivacyAuthorization"
+            icon-color="white" open-type="getPhoneNumber|agreePrivacyAuthorization"
             @getphonenumber="handleGetPhoneNumber" @agreeprivacyauthorization="handleAgreePrivacyAuthorization"
             @click="handleWxLogin">
             <view class="mt-40 flex items-center justify-center gap-10">

+ 39 - 1
src/pagesSystem/pages/pay/pay.vue

@@ -26,7 +26,7 @@
         <uv-radio-group v-model="payType" placement="column" iconPlacement="right" shape="square" size="24"
           iconSize="18">
           <uv-radio :name="payType">
-            <view class="flex items-center" slot="label">
+            <view class="flex items-center">
               <image class="channel-icon" mode="widthFix" src="@/static/image/wechat-pay.png" />
               <text>微信支付</text>
             </view>
@@ -37,18 +37,56 @@
         <ie-button type="primary" :loading="loading" @click="handlePay">{{ `确认支付 ¥${formatPrice}` }}</ie-button>
       </view>
     </view>
+    <ie-popup ref="popupRef" mode="center">
+      <view class="w-[70vw] px-50 pt-50 pb-80">
+        <view class="text-center text-30 text-fore-title font-bold mb-50">请先绑定微信</view>
+        <uv-button type="primary" icon-color="white" @click="handleBindWechat" icon-size="24"
+          icon="weixin-fill">点击绑定微信</uv-button>
+      </view>
+    </ie-popup>
   </ie-page>
 </template>
 <script lang="ts" setup>
 import { usePay } from '@/hooks/usePay';
 import { useUserStore } from '@/store/userStore';
+import { bindOpenId } from '@/api/modules/login';
 
 const userStore = useUserStore();
 const { ready, formatPrice, pay, setCallback, loading } = usePay();
 const isIOS = ref(false);
 const payType = ref('wechat');
 
+
+async function getWxCode() {
+  const { code, errMsg } = await uni.login();
+  if (errMsg === 'login:ok' && code) {
+    return code;
+  }
+  return null;
+}
+
+const popupRef = ref();
+const handleBindWechat = async (e: any) => {
+  uni.$ie.showLoading();
+  const code = await getWxCode();
+  if (code) {
+    bindOpenId(code).then(async res => {
+      popupRef.value?.close();
+      await userStore.getUserInfo();
+      uni.$ie.hideLoading();
+      handlePay();
+    }).catch(err => {
+      console.error(err);
+      uni.$ie.hideLoading();
+    });
+  }
+}
+
 const handlePay = () => {
+  if (!userStore.isBindWechat) {
+    popupRef.value?.open();
+    return;
+  }
   loading.value = true
   setCallback({
     onSuccess: () => {

+ 3 - 0
src/store/userStore.ts

@@ -127,6 +127,9 @@ export const useUserStore = defineStore('ie-user', {
     },
     isVHS(): boolean {
       return this.getExamType === EnumExamType.VHS;
+    },
+    isBindWechat(): boolean {
+      return !!this.userInfo.wxOpenId;
     }
   },
   actions: {

+ 1 - 0
src/types/user.ts

@@ -162,6 +162,7 @@ export interface UserInfo {
   campusClassName?: string;
   campusName?: string;
   classSelect: number; // 0: 不可修改班级 1: 可修改班级
+  wxOpenId?: string;
 }
 
 export interface VipCardInfo {