From b19e3c0ba4db231b82b2655efe0b73a81571fb84 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期一, 17 三月 2025 14:30:37 +0800
Subject: [PATCH] fix: 修改支付方式选择

---
 packages/components/src/hooks/selectPayType.ts |  181 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 181 insertions(+), 0 deletions(-)

diff --git a/packages/components/src/hooks/selectPayType.ts b/packages/components/src/hooks/selectPayType.ts
new file mode 100644
index 0000000..c2a4931
--- /dev/null
+++ b/packages/components/src/hooks/selectPayType.ts
@@ -0,0 +1,181 @@
+import {
+  useLifeRechargeContext,
+  SetLifePayOrderPayTypeInput,
+  LifeRechargeConstants,
+  GetPayOrderForJsAPIInput,
+} from '@life-payment/core-vue';
+import { useQuery } from '@tanstack/vue-query';
+import { reactive, MaybeRef, unref } from 'vue';
+import Taro from '@tarojs/taro';
+
+type UseSelectPayTypeOptions = {
+  openId?: MaybeRef<string>;
+  isInWeChat?: MaybeRef<boolean>;
+  isH5?: MaybeRef<boolean>;
+  appId?: MaybeRef<string>;
+};
+
+export function useSelectPayType(options: UseSelectPayTypeOptions = {}) {
+  const { openId, isInWeChat, isH5, appId } = options;
+
+  const { blLifeRecharge } = useLifeRechargeContext();
+
+  const state = reactive({
+    show: false,
+    msg: '',
+  });
+
+  async function invokeAliPay(orderNo: string) {
+    try {
+      let res = await setLifePayOrderPayType(
+        blLifeRecharge.constants.LifePayTypeEnum.AliPay,
+        orderNo
+      );
+      if (res) {
+        location.href = res;
+      }
+    } catch (error) {}
+  }
+
+  async function setLifePayOrderPayType(
+    lifePayType: LifeRechargeConstants.LifePayTypeEnum,
+    orderNo: string
+  ) {
+    try {
+      let params: SetLifePayOrderPayTypeInput = {
+        orderNo: orderNo,
+        lifePayType: lifePayType,
+      };
+      return await blLifeRecharge.services.setLifePayOrderPayType(params);
+    } catch (error) {}
+  }
+
+  async function invokeWeixinPay(orderNo: string) {
+    if (unref(isH5)) {
+      if (unref(isInWeChat)) {
+        handleWeixinPayByJsApi(orderNo);
+      } else {
+        // try {
+        //   let res = await setLifePayOrderPayType(blLifeRecharge.constants.LifePayTypeEnum.WxPay);
+        //   if (res) {
+        //     location.href = res;
+        //   }
+        // } catch (error) {}
+        state.msg = '璇峰湪寰俊涓墦寮�';
+        state.show = true;
+      }
+    } else if (Taro.getEnv() === Taro.ENV_TYPE.WEAPP) {
+      handleWeixinPayByMini(orderNo);
+    }
+  }
+
+  async function handleWeixinPayByMini(orderNo: string) {
+    try {
+      let res = await getPayOrderForJsAPI(orderNo);
+
+      if (res) {
+        Taro.requestPayment({
+          timeStamp: res.timestamp,
+          nonceStr: res.nonceStr,
+          package: res.package,
+          signType: res.signType as any,
+          paySign: res.paySign,
+          success: function (res) {
+            console.log('res: ', res);
+            // if(res.errMsg)
+          },
+          fail: function (res) {},
+        });
+      }
+    } catch (error) {}
+  }
+
+  async function getPayOrderForJsAPI(orderNo: string) {
+    try {
+      let params: GetPayOrderForJsAPIInput = {
+        orderNo: orderNo,
+        lifePayType: blLifeRecharge.constants.LifePayTypeEnum.WxPay,
+        openId: unref(openId),
+        attach: Date.now().toString(),
+        payAppId: unref(appId),
+      };
+      let res = await blLifeRecharge.services.getPayOrderForJsAPI(params);
+      return res;
+    } catch (error) {}
+  }
+
+  async function handleWeixinPayByJsApi(orderNo: string) {
+    try {
+      let res = await getPayOrderForJsAPI(orderNo);
+
+      if (res) {
+        //@ts-ignore
+        if (WeixinJSBridge) {
+          //@ts-ignore
+          WeixinJSBridge.invoke(
+            'getBrandWCPayRequest',
+            {
+              appId: unref(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锛屼絾骞朵笉淇濊瘉瀹冪粷瀵瑰彲闈狅紝鍟嗘埛闇�杩涗竴姝ヨ皟鐢ㄥ悗绔煡鍗曠‘璁ゆ敮浠樼粨鏋溿��
+              } else if (res.err_msg == 'system:access_denied') {
+                state.msg = '璇峰湪鎵嬫満寰俊涓墦寮�';
+                state.show = true;
+              } else {
+                // state.msg = res.err_msg;
+                // state.show = true;
+              }
+            }
+          );
+        }
+      }
+    } catch (error) {}
+  }
+
+  return {
+    invokeAliPay,
+    invokeWeixinPay,
+    state,
+  };
+}
+
+type UseGetPayStatusByOrderNoOptions = {
+  orderNo?: MaybeRef<string>;
+  enabled?: MaybeRef<boolean>;
+  onPaySuccess?: (orderNo: string) => any;
+};
+
+export function useGetPayStatusByOrderNo(options: UseGetPayStatusByOrderNoOptions = {}) {
+  const { orderNo, enabled, onPaySuccess } = options;
+
+  const { blLifeRecharge } = useLifeRechargeContext();
+
+  useQuery({
+    queryKey: ['platformServicePayServices/getPayStatusByOrderNo', orderNo],
+    queryFn: async () => {
+      return await blLifeRecharge.services.getPayStatusByOrderNo(
+        {
+          orderNo: unref(orderNo),
+        },
+        {
+          showLoading: false,
+        }
+      );
+    },
+    onSuccess(data) {
+      if (data !== blLifeRecharge.constants.LifePayStatusEnum.鏈敮浠�) {
+        onPaySuccess?.(unref(orderNo));
+      }
+    },
+    refetchInterval: 1000 * 3,
+    enabled: enabled,
+  });
+}

--
Gitblit v1.9.1