/** * 华为支付核心工具类 * 适配端:华为快应用(原生支付)、微信小程序(H5支付)、H5端(H5支付) * 核心:统一封装支付调用逻辑,返回H5支付链接适配web-view组件 */ /** * 华为支付调用封装 * @param {String} outTradeNo 前端生成的唯一订单号 * @param {Number} amount 支付金额(单位:元,保留2位小数) * @param {String} subject 订单标题 * @param {String} payType 支付类型(默认huaweipay) * @returns {Promise} 支付结果(含H5支付链接) */ export function invokeHuaweiPay(outTradeNo, amount, subject, payType = 'huaweipay') { return new Promise(async (resolve, reject) => { try { // 1. 显示加载中提示 uni.showLoading({ title: '发起支付...' }); // 2. 调用后端生成订单 const orderRes = await uni.request({ url: getApiUrl() + '/api/huawei/pay/createOrder', method: 'POST', data: { out_trade_no: outTradeNo, total_amount: amount, subject: subject, pay_type: payType } }); // 3. 校验后端返回结果 if (orderRes.data.code !== 0) { uni.hideLoading(); reject(new Error(orderRes.data.msg || '生成支付订单失败')); return; } // 4. 区分运行端处理 const systemInfo = uni.getSystemInfoSync(); const accountInfo = uni.getAccountInfoSync(); const isHuaweiQuickApp = systemInfo.platform === 'quickapp-huawei'; // 华为快应用 const isWechatMini = accountInfo?.miniProgram?.appId?.includes('wx'); // 微信小程序 const isH5 = systemInfo.platform === 'web' || !accountInfo?.miniProgram; // H5端 if (isHuaweiQuickApp) { // 4.1 华为快应用:原生唤起支付控件 // 注意:这里需要根据实际的华为快应用支付SDK调用 try { // 示例代码,实际需要根据华为快应用文档调整 const huaweiPay = require('@service.pay.huawei'); huaweiPay.pay({ orderInfo: orderRes.data.data.orderInfo, success: (payRes) => { uni.hideLoading(); resolve({ code: 0, msg: '华为支付控件唤起成功', data: payRes }); }, fail: (err) => { uni.hideLoading(); const errMsg = err.message || err.code || '未知错误'; reject(new Error(`支付失败:${errMsg}`)); } }); } catch (sdkError) { // SDK不存在,降级到H5支付 if (orderRes.data.data.payUrl) { uni.hideLoading(); resolve({ code: 0, msg: '跳转华为支付H5页面', data: { payUrl: orderRes.data.data.payUrl } }); } else { uni.hideLoading(); reject(new Error('华为支付SDK不可用且无H5支付链接')); } } } else if (isWechatMini || isH5) { // 4.2 微信小程序/H5端:返回H5支付链接(适配web-view) if (!orderRes.data.data.payUrl) { uni.hideLoading(); reject(new Error('未获取到华为支付H5跳转链接')); return; } uni.hideLoading(); resolve({ code: 0, msg: '跳转华为支付H5页面', data: { payUrl: orderRes.data.data.payUrl } }); } else { // 4.3 其他端:提示不支持 uni.hideLoading(); reject(new Error('当前环境暂不支持华为支付')); } } catch (err) { uni.hideLoading(); reject(new Error(`支付异常:${err.message || '网络请求失败'}`)); } }); } /** * 校验支付最终状态(统一适配所有支付方式) * @param {String} outTradeNo 前端生成的订单号 * @returns {Promise} 校验结果(包含订单实际支付状态) */ export function checkPayStatus(outTradeNo) { return new Promise(async (resolve, reject) => { try { // 统一调用后端状态校验接口(适配所有支付类型) const checkRes = await uni.request({ url: getApiUrl() + '/api/pay/checkStatus', method: 'POST', data: { out_trade_no: outTradeNo } }); resolve(checkRes.data); } catch (err) { reject(new Error(`校验支付状态失败:${err.message || '网络请求失败'}`)); } }); } /** * 获取API基础URL */ function getApiUrl() { // 尝试获取配置的API地址 try { // #ifdef H5 const config = require('@/common/js/config.js').default; return config.baseUrl || ''; // #endif // #ifndef H5 const config = require('@/common/js/config.js').default; return config.baseUrl || ''; // #endif } catch (e) { console.warn('获取API配置失败,使用空字符串'); return ''; } }