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) {
|
throw 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) {
|
throw 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) {
|
throw 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) {
|
throw error;
|
}
|
}
|
|
async function handleWeixinPayByJsApi(orderNo: string) {
|
try {
|
let res = await getPayOrderForJsAPI(orderNo);
|
|
if (res) {
|
if (WeixinJSBridge) {
|
WeixinJSBridge.invoke(
|
'getBrandWCPayRequest',
|
{
|
appId: unref(appId), //公众号ID,由商户传入
|
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将在用户支付成功后返回ok,但并不保证它绝对可靠,商户需进一步调用后端查单确认支付结果。
|
} else if (res.err_msg == 'system:access_denied') {
|
state.msg = '请在手机微信中打开';
|
state.show = true;
|
} else {
|
// state.msg = res.err_msg;
|
// state.show = true;
|
}
|
}
|
);
|
}
|
}
|
} catch (error) {
|
throw 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,
|
});
|
}
|