feat:新添加华为支付
This commit is contained in:
152
common/js/huaweiPay.js
Normal file
152
common/js/huaweiPay.js
Normal file
@@ -0,0 +1,152 @@
|
||||
/**
|
||||
* 华为支付核心工具类
|
||||
* 适配端:华为快应用(原生支付)、微信小程序(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 '';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user