微信SDK接通

This commit is contained in:
2026-07-01 19:56:44 +08:00
parent a1cbfc7241
commit aea1513836
38 changed files with 1610 additions and 92 deletions
+83
View File
@@ -0,0 +1,83 @@
import type { WechatJsapiPrepayParams } from '@dukang/shared-types';
import { getRuntimePlatform } from './env';
import { ensureJssdkReady } from './jssdk';
function invokeBridgePay(params: WechatJsapiPrepayParams): Promise<void> {
return new Promise((resolve, reject) => {
const bridge = window.WeixinJSBridge;
if (!bridge) {
reject(new Error('WeixinJSBridge 不可用'));
return;
}
bridge.invoke(
'getBrandWCPayRequest',
{
appId: params.appId,
timeStamp: params.timeStamp,
nonceStr: params.nonceStr,
package: params.package,
signType: params.signType,
paySign: params.paySign,
},
(res) => {
const msg = res.err_msg ?? '';
if (msg.includes('ok')) resolve();
else if (msg.includes('cancel')) reject(new Error('用户取消支付'));
else reject(new Error(msg || '支付失败'));
},
);
});
}
/** 调起微信支付 */
export async function invokeWechatPay(
prepay: WechatJsapiPrepayParams,
config?: { apiBase?: string; clientApp?: string },
): Promise<void> {
const platform = getRuntimePlatform();
if (platform === 'mini' && window.wx?.requestPayment) {
return new Promise((resolve, reject) => {
window.wx!.requestPayment!({
timeStamp: prepay.timeStamp,
nonceStr: prepay.nonceStr,
package: prepay.package,
signType: prepay.signType,
paySign: prepay.paySign,
success: () => resolve(),
fail: (err) => reject(new Error(err.errMsg || '支付失败')),
});
});
}
if (platform === 'wechat-h5') {
if (config?.clientApp) {
await ensureJssdkReady({
apiBase: config.apiBase ?? '/api/v1',
clientApp: config.clientApp,
});
}
if (window.wx?.chooseWXPay) {
return new Promise((resolve, reject) => {
window.wx!.chooseWXPay!({
...prepay,
success: () => resolve(),
fail: (err) => reject(new Error(err.errMsg || '支付失败')),
cancel: () => reject(new Error('用户取消支付')),
});
});
}
if (window.WeixinJSBridge) {
return invokeBridgePay(prepay);
}
if (typeof document !== 'undefined') {
await new Promise<void>((resolve) => {
if (window.WeixinJSBridge) resolve();
else document.addEventListener('WeixinJSBridgeReady', () => resolve(), { once: true });
});
return invokeBridgePay(prepay);
}
}
throw new Error('当前环境不支持微信支付');
}