From 73ac6d02a2223f19201426f3c366661d4a8e41bf Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期二, 25 二月 2025 17:14:37 +0800 Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/LifePaymentFront --- apps/taro/src/index.html | 1 apps/taro/src/constants/enum.ts | 2 apps/taro/src/hooks/user.ts | 50 ++++++++++++ apps/taro/types/global.d.ts | 4 + apps/taro/src/pages/home/index.vue | 4 + apps/taro/src/stores/modules/user.ts | 15 +++ packages/components/src/views/SelectPayTypeView/SelectPayTypeView.vue | 53 ++++++++++++- apps/taro/config/dev.js | 1 apps/taro/src/subpackages/recharge/selectPayType/InnerPage.vue | 10 ++ packages/core/src/lifeRechargeServices.ts | 58 ++++++++++++++ apps/taro/config/staging.js | 1 apps/taro/config/prod.js | 1 12 files changed, 193 insertions(+), 7 deletions(-) diff --git a/apps/taro/config/dev.js b/apps/taro/config/dev.js index 92c0394..172be07 100644 --- a/apps/taro/config/dev.js +++ b/apps/taro/config/dev.js @@ -7,6 +7,7 @@ OSS_URL: '"https://waterdroptest2.oss-cn-hangzhou.aliyuncs.com/"', WEMAP_KEY: 'T2UBZ-N563J-ZCHFF-XDOXN-VCH7S-CJB2T', + WXPayAppId: 'wxf940ff1d35a98493', }, defineConstants: {}, mini: {}, diff --git a/apps/taro/config/prod.js b/apps/taro/config/prod.js index 3099e80..11beb0c 100644 --- a/apps/taro/config/prod.js +++ b/apps/taro/config/prod.js @@ -10,6 +10,7 @@ OSS_URL: '"https://parkmanagement.oss-cn-hangzhou.aliyuncs.com"', WEMAP_KEY: 'DYRBZ-ZGPCF-X3OJN-N2AA3-JWUCE-HEBXJ', + WXPayAppId: 'wxf940ff1d35a98493', }, defineConstants: {}, mini: {}, diff --git a/apps/taro/config/staging.js b/apps/taro/config/staging.js index 37ffd64..7b1cd87 100644 --- a/apps/taro/config/staging.js +++ b/apps/taro/config/staging.js @@ -12,6 +12,7 @@ APP_ENV: '"staging"', WEMAP_KEY: 'T2UBZ-N563J-ZCHFF-XDOXN-VCH7S-CJB2T', + WXPayAppId: 'wxf940ff1d35a98493', }, h5: { output: { diff --git a/apps/taro/src/constants/enum.ts b/apps/taro/src/constants/enum.ts index 6d77347..109f31d 100644 --- a/apps/taro/src/constants/enum.ts +++ b/apps/taro/src/constants/enum.ts @@ -2,3 +2,5 @@ toDetail = 'toDetail', back = 'back', } + +export const WXPayAppId = process.env.WXPayAppId; diff --git a/apps/taro/src/hooks/user.ts b/apps/taro/src/hooks/user.ts index f1308ee..3dd00bb 100644 --- a/apps/taro/src/hooks/user.ts +++ b/apps/taro/src/hooks/user.ts @@ -7,12 +7,20 @@ import { useRefeshDidShow } from './infiniteLoading'; import { LoginFormTabs } from '@/subpackages/login/constants'; import { useLoginedJump } from './login'; +import { useLifeRechargeContext, APIgetLifePayWxIndentityParams } from '@life-payment/core-vue'; export function useUser() { const userStore = useUserStore(); - const { userDetail, userInfo, locationCity, virtualUserId, virtualPhoneNumber } = - storeToRefs(userStore); + const { + userDetail, + userInfo, + locationCity, + virtualUserId, + virtualPhoneNumber, + wxCode, + wxOpenId, + } = storeToRefs(userStore); function updateUserInfo() { return userStore.getCurrentUserInfo(); @@ -25,6 +33,8 @@ locationCity, virtualUserId, virtualPhoneNumber, + wxCode, + wxOpenId, }; } @@ -62,6 +72,42 @@ return { isAuth }; } +export function useInitWeixinJSBridge() { + const { wxCode } = useUser(); + + const userStore = useUserStore(); + const router = Taro.useRouter(); + + const code = router.params.code ?? ''; + + const { blLifeRecharge } = useLifeRechargeContext(); + + Taro.useReady(async () => { + if (!code && !!WeixinJSBridge && !wxCode) { + location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf940ff1d35a98493&redirect_uri=${location.href}&response_type=code&scope=snsapi_base#wechat_redirect`; + } + if (!!code && !wxCode) { + try { + userStore.setWxCode(router.params.code ?? ''); + let res = await getLifePayWxIndentity(); + userStore.setWxOpenId(res.openId); + } catch (error) {} + } + + async function getLifePayWxIndentity() { + try { + let params: APIgetLifePayWxIndentityParams = { + code: code, + }; + let res = await blLifeRecharge.services.getLifePayWxIndentity(params, { + showLoading: false, + }); + return res; + } catch (error) {} + } + }); +} + export function useGoLogin() { const router = Taro.useRouter(); const { redirectParams } = useLoginedJump(); diff --git a/apps/taro/src/index.html b/apps/taro/src/index.html index 49a37be..f4a4633 100644 --- a/apps/taro/src/index.html +++ b/apps/taro/src/index.html @@ -12,6 +12,7 @@ <script> <%= htmlWebpackPlugin.options.script %> </script> + <script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script> </head> <body> <div id="app"></div> diff --git a/apps/taro/src/pages/home/index.vue b/apps/taro/src/pages/home/index.vue index aba6441..23f4464 100644 --- a/apps/taro/src/pages/home/index.vue +++ b/apps/taro/src/pages/home/index.vue @@ -17,6 +17,10 @@ import { OrderInputType } from '@life-payment/constants'; import { RechargeGrid } from '@life-payment/components'; +const userStore = useUserStore(); + +const router = Taro.useRouter(); + const goPhoneBillRecharge = useAccessLogin(() => { Taro.navigateTo({ url: `${RouterPath.phoneBillRecharge}`, diff --git a/apps/taro/src/stores/modules/user.ts b/apps/taro/src/stores/modules/user.ts index cab0747..f6d8ac5 100644 --- a/apps/taro/src/stores/modules/user.ts +++ b/apps/taro/src/stores/modules/user.ts @@ -36,6 +36,9 @@ virtualUserId?: string; virtualPhoneNumber?: string; + + wxCode?: string; + wxOpenId?: string; } const goAuthorization = debounce( @@ -73,6 +76,9 @@ virtualUserId: storageVirtualUser?.virtualUserId ?? '', virtualPhoneNumber: storageVirtualUser?.virtualPhoneNumber ?? '', + + wxCode: '', + wxOpenId: '', }; }, getters: { @@ -235,6 +241,13 @@ setUserDetail(detail); }, + setWxCode(code: string) { + this.wxCode = code; + }, + setWxOpenId(openId: string) { + this.wxOpenId = openId; + }, + resetState() { this.userInfo = null; this.token = ''; @@ -242,6 +255,8 @@ this.userDetail = null; this.virtualUserId = ''; this.virtualPhoneNumber = ''; + this.wxCode = ''; + this.wxOpenId = ''; removeUserInfo(); removeUserDetail(); removeStorageVirtualUserId(); diff --git a/apps/taro/src/subpackages/recharge/selectPayType/InnerPage.vue b/apps/taro/src/subpackages/recharge/selectPayType/InnerPage.vue index 2d6676d..e214be7 100644 --- a/apps/taro/src/subpackages/recharge/selectPayType/InnerPage.vue +++ b/apps/taro/src/subpackages/recharge/selectPayType/InnerPage.vue @@ -7,6 +7,10 @@ @paySuccess="handePaySuccess" :showAliPay="!isInWeChat" :showWeixinPay="!isInAlipay" + :openId="wxOpenId" + :isInWeChat="isInWeChat" + :isH5="isH5" + :appId="WXPayAppId" /> </ContentScrollView> </template> @@ -15,7 +19,9 @@ import { SelectPayTypeView } from '@life-payment/components'; import { LifeRechargeConstants } from '@life-payment/core-vue'; import Taro from '@tarojs/taro'; -import { isInAlipay, isInWeChat } from '@/utils/env'; +import { isInAlipay, isInWeChat, isH5 } from '@/utils/env'; +import { useUser } from '@/hooks'; +import { WXPayAppId } from '@/constants'; defineOptions({ name: 'selectPayType', @@ -25,6 +31,8 @@ const orderNo = router.params?.orderNo ?? ''; const lifePayOrderType = Number(router.params?.lifePayOrderType ?? ''); +const { wxOpenId } = useUser(); + function handePaySuccess( orderNo: string, lifePayOrderType: LifeRechargeConstants.LifePayOrderTypeEnum diff --git a/apps/taro/types/global.d.ts b/apps/taro/types/global.d.ts index 95c11a5..6c54fae 100644 --- a/apps/taro/types/global.d.ts +++ b/apps/taro/types/global.d.ts @@ -32,6 +32,9 @@ } } + interface Window { + WeixinJSBridge: any + } } declare namespace NodeJS { @@ -47,6 +50,7 @@ OSS_URL: string; TEST_OSS_URL: string; WEMAP_KEY: string; + WXPayAppId: string; } } diff --git a/packages/components/src/views/SelectPayTypeView/SelectPayTypeView.vue b/packages/components/src/views/SelectPayTypeView/SelectPayTypeView.vue index 93705f7..4309f0c 100644 --- a/packages/components/src/views/SelectPayTypeView/SelectPayTypeView.vue +++ b/packages/components/src/views/SelectPayTypeView/SelectPayTypeView.vue @@ -4,7 +4,7 @@ <img class="select-pay-type-view-item-icon" :src="IconAliPay" /> <div class="select-pay-type-view-item-text">鏀粯瀹濇敮浠�</div> </div> - <div class="select-pay-type-view-item" v-if="showWeixinPay" @click="handleWeixinPay"> + <div class="select-pay-type-view-item" v-if="showWeixinPay" @click="handleWeixinPayByJsApi"> <img class="select-pay-type-view-item-icon" :src="IconWeixin" /> <div class="select-pay-type-view-item-text">寰俊鏀粯</div> </div> @@ -18,6 +18,7 @@ useLifeRechargeContext, SetLifePayOrderPayTypeInput, LifeRechargeConstants, + GetPayOrderForJsAPIInput, } from '@life-payment/core-vue'; import { useQuery } from '@tanstack/vue-query'; @@ -30,6 +31,10 @@ lifePayOrderType?: LifeRechargeConstants.LifePayOrderTypeEnum; showAliPay?: boolean; showWeixinPay?: boolean; + openId?: string; + isInWeChat?: boolean; + isH5?: boolean; + appId?: string; }; const props = withDefaults(defineProps<Props>(), { @@ -43,6 +48,7 @@ orderNo: string, lifePayOrderType: LifeRechargeConstants.LifePayOrderTypeEnum ): void; + (e: 'payOrderForJsAPISuccess'): void; }>(); const { blLifeRecharge } = useLifeRechargeContext(); @@ -57,10 +63,49 @@ } async function handleWeixinPay() { + if (props.isH5) { + if (props.isInWeChat) { + handleWeixinPayByJsApi(); + } else { + try { + let res = await setLifePayOrderPayType(blLifeRecharge.constants.LifePayTypeEnum.WxPay); + if (res) { + location.href = res; + } + } catch (error) {} + } + } +} + +async function handleWeixinPayByJsApi() { try { - let res = await setLifePayOrderPayType(blLifeRecharge.constants.LifePayTypeEnum.WxPay); - if (res) { - location.href = res; + let params: GetPayOrderForJsAPIInput = { + orderNo: props.orderNo, + lifePayType: blLifeRecharge.constants.LifePayTypeEnum.WxPay, + openId: props.openId, + attach: Date.now().toString(), + }; + let res = await blLifeRecharge.services.getPayOrderForJsAPI(params); + //@ts-ignore + if (res && WeixinJSBridge) { + //@ts-ignore + WeixinJSBridge.invoke( + 'getBrandWCPayRequest', + { + appId: props.appId, //鍏紬鍙稩D锛岀敱鍟嗘埛浼犲叆 + timeStamp: res.timestamp, //鏃堕棿鎴筹紝鑷�1970骞翠互鏉ョ殑绉掓暟 + nonceStr: res.nonceStr, //闅忔満涓� + package: res.package, + signType: res.signType, //寰俊绛惧悕鏂瑰紡锛� + paySign: res.paySign, //寰俊绛惧悕 + }, + function (res) { + if (res.err_msg == 'get_brand_wcpay_request:ok') { + // 浣跨敤浠ヤ笂鏂瑰紡鍒ゆ柇鍓嶇杩斿洖,寰俊鍥㈤槦閮戦噸鎻愮ず锛� + //res.err_msg灏嗗湪鐢ㄦ埛鏀粯鎴愬姛鍚庤繑鍥瀘k锛屼絾骞朵笉淇濊瘉瀹冪粷瀵瑰彲闈狅紝鍟嗘埛闇�杩涗竴姝ヨ皟鐢ㄥ悗绔煡鍗曠‘璁ゆ敮浠樼粨鏋溿�� + } + } + ); } } catch (error) {} } diff --git a/packages/core/src/lifeRechargeServices.ts b/packages/core/src/lifeRechargeServices.ts index 3a52b29..4127822 100644 --- a/packages/core/src/lifeRechargeServices.ts +++ b/packages/core/src/lifeRechargeServices.ts @@ -143,6 +143,33 @@ ...(options || {}), }); } + + /** 鑾峰彇鐢熸椿缂磋垂鐢ㄦ埛韬唤浼氳瘽淇℃伅 GET /api/Account/GetLifePayWxIndentity */ + async getLifePayWxIndentity( + // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄) + params: APIgetLifePayWxIndentityParams, + options?: RequestConfig + ) { + return this.request<WxMiniAppIndentityInfo>('/api/Account/GetLifePayWxIndentity', { + method: 'GET', + params: { + ...params, + }, + ...(options || {}), + }); + } + + /** 鑾峰彇寰俊鏀粯鐨凧SAPI POST /api/LifePay/GetPayOrderForJsAPI */ + async getPayOrderForJsAPI(body: GetPayOrderForJsAPIInput, options?: RequestConfig) { + return this.request<ModelPaymentMiniPay>('/api/LifePay/GetPayOrderForJsAPI', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + data: body, + ...(options || {}), + }); + } } export interface PhoneMesssageCodeLoginInput { @@ -347,3 +374,34 @@ cityParentId?: string; ciytId?: string; } +export interface APIgetLifePayWxIndentityParams { + /** 鐢ㄦ埛鐧诲綍鍑瘉 */ + code?: string; +} + +export interface WxMiniAppIndentityInfo { + /** 浼氳瘽瀵嗛挜 */ + sessionKey?: string; + /** 灏忕▼搴廜penId */ + openId?: string; + /** 鐢ㄦ埛鍚嶏紙璇ュ�间负绌哄垯闇�鎵嬫満鎺堟潈鐧诲綍锛屼笉涓虹┖鍒欏凡鏈夎灏忕▼搴忕敤鎴凤級 */ + userName?: string; + unionId?: string; +} + +export interface GetPayOrderForJsAPIInput { + orderNo: string; + lifePayType?: LifeRechargeConstants.LifePayTypeEnum; + openId?: string; + attach?: string; +} + +export interface ModelPaymentMiniPay { + nonceStr?: string; + package?: string; + signType?: string; + paySign?: string; + timestamp?: string; + timeExpire?: string; + message?: string; +} -- Gitblit v1.9.1