payment: 统一支付逻辑,移除冗余文件。移除 payUtils.js、huaweiPay.js 、payCore.js冗余依赖,重构 payment.vue 支付逻辑:统一调用/api/pay/pay,新增华为支付支持。

This commit is contained in:
Zhukj
2025-12-12 09:23:01 +08:00
parent b633125cc3
commit bb8eee51d3
4 changed files with 332 additions and 613 deletions

View File

@@ -56,9 +56,6 @@ import {
} from 'common/js/wx-jssdk.js';
// #endif
// 引入统一支付工具类(真实调用)
import { invokeWechatPay, invokeAlipay, invokeHuaweiPay } from '../../common/js/payCore.js';
export default {
name: 'payment',
components: {
@@ -119,6 +116,7 @@ export default {
//重置是否已完成没有完成不能调用api/pay/pay
resetPayComplete: true,
repeatFlag: false,
flag: false // 保留文件1的flag变量用于支付失败处理
};
},
created(e) {
@@ -268,92 +266,208 @@ export default {
// #ifdef H5
pay() {
var payType = this.payTypeList[this.payIndex];
// 保留文件2的线下支付逻辑
if (!payType || payType.type === 'offlinepay') {
// 线下支付仍使用原有逻辑
this.payOffline();
return;
}
// 使用统一支付工具类进行真实支付调用
this.invokeUnifiedPay(payType.type);
},
/**
* 统一支付调用方法(恢复真实后端调用)
*/
async invokeUnifiedPay(payType) {
try {
let payResult;
const amount = this.payMoney;
const outTradeNo = this.payInfo.out_trade_no;
const subject = '订单支付';
// 恢复真实支付方法调用(对接后端)
switch (payType) {
case 'wechatpay':
payResult = await invokeWechatPay(outTradeNo, amount, subject);
break;
case 'alipay':
payResult = await invokeAlipay(outTradeNo, amount, subject);
break;
case 'huaweipay':
payResult = await invokeHuaweiPay(outTradeNo, amount, subject);
break;
default:
throw new Error('不支持的支付方式');
}
// 验证支付结果
if (!payResult) {
throw new Error('支付结果为空');
}
if (typeof payResult.code === 'undefined') {
throw new Error('缺少code属性');
}
// 真实调起逻辑
if (payResult.code === 0 && payResult.data?.payUrl) {
// 关闭支付中弹窗
uni.hideLoading();
const systemInfo = uni.getSystemInfoSync();
// H5端直接跳转
if (systemInfo.platform === 'web') {
window.location.href = payResult.data.payUrl;
this.checkPayStatus();
} else {
// 小程序/快应用跳WebView
this.showPayWebView(payResult.data.payUrl);
}
} else if (payResult.code === 0) {
// 关闭支付中弹窗
uni.hideLoading();
this.paySuccess();
} else {
throw new Error(payResult.msg || '支付失败');
}
} catch (error) {
// 关闭支付中弹窗
// 保留文件2的流程控制
if (!this.resetPayComplete) {
uni.hideLoading();
this.repeatFlag = false;
this.$util.showToast({
title: error.message || '支付失败'
title: '支付取消中,请稍后再试!'
});
this.repeatFlag = false;
return;
}
},
/**
* 显示支付WebView真实跳转逻辑
*/
showPayWebView(payUrl) {
this.$util.redirectTo('/pages/Pay/Pay', {
payUrl: payUrl,
outTradeNo: this.payInfo.out_trade_no
// 复用文件1的核心逻辑调用后端/api/pay/pay接口
var return_url = '';
if (this.payInfo.event == 'BlindboxGoodsOrderPayNotify') {
return_url = '/pages_promotion/blindbox/index?outTradeNo=';
} else {
return_url = '/pages_tool/pay/result?code=';
}
this.$api.sendRequest({
url: '/api/pay/pay',
data: {
out_trade_no: this.payInfo.out_trade_no,
pay_type: payType.type,
return_url: encodeURIComponent(this.$config.h5Domain + return_url + this.payInfo.out_trade_no),
is_balance: this.isBalance
},
success: res => {
uni.hideLoading();
this.repeatFlag = false; // 重置文件2的防重复标记
if (res.code >= 0) {
if (res.data.pay_success) {
this.paySuccess();
return;
}
switch (payType.type) {
// 保留文件1的微信支付逻辑新增空值判断
case 'wechatpay':
if (this.$util.isWeiXin()) {
if (uni.getSystemInfoSync().platform == 'ios') {
var url = uni.getStorageSync('initUrl');
} else {
var url = location.href;
}
// 获取jssdk配置
this.$api.sendRequest({
url: '/wechat/api/wechat/jssdkconfig',
data: {
url: url
},
success: jssdkRes => {
var wxJS = new Weixin(),
payData = res.data.data;
// 新增空值判断避免读取undefined属性
if (!payData) {
this.$util.showToast({ title: '微信支付参数获取失败' });
this.close();
return;
}
wxJS.init(jssdkRes.data);
wxJS.pay({
timestamp: payData.timestamp ? payData.timestamp : payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: payData.signType,
paySign: payData.paySign
},
res => {
if (res.errMsg == 'chooseWXPay:ok') {
this.paySuccess();
} else {
this.$util.showToast({
title: res.errMsg
});
setTimeout(() => {
this.close();
}, 1500)
}
},
res => {
this.$util.showToast({
title: '您已取消支付'
});
this.resetpay();
}
);
}
});
} else {
// 新增判断res.data.url是否存在
if (!res.data.url) {
this.$util.showToast({ title: '微信支付链接获取失败' });
this.close();
return;
}
location.href = res.data.url;
this.checkPayStatus();
}
break;
// 保留文件1的支付宝支付逻辑
case 'alipay':
if (this.$util.isWeiXin()) {
// 新增判断res.data.data是否存在
if (!res.data.data) {
this.$util.showToast({ title: '支付宝支付参数获取失败' });
this.close();
return;
}
var wx_alipay = encodeURIComponent(res.data.data);
this.$util.redirectTo('/pages_tool/pay/wx_pay', {
wx_alipay: wx_alipay,
out_trade_no: this.payInfo.out_trade_no
}, '', 'redirectTo');
} else {
// 新增判断res.data.data是否存在
if (!res.data.data) {
this.$util.showToast({ title: '支付宝支付链接获取失败' });
this.close();
return;
}
location.href = res.data.data;
this.checkPayStatus();
}
break;
// 新增华为支付分支处理沿用文件1范式补充空值判断
case 'huaweipay':
// 新增先判断res.data.data是否存在
if (!res.data.data) {
this.$util.showToast({ title: '华为支付参数获取失败' });
this.close();
return;
}
const systemInfo = uni.getSystemInfoSync();
const isHuaweiQuickApp = systemInfo.platform === 'quickapp-huawei';
// 华为快应用尝试原生SDK唤起
if (isHuaweiQuickApp && res.data.data.orderInfo) {
try {
const huaweiPay = require('@service.pay.huawei');
huaweiPay.pay({
orderInfo: res.data.data.orderInfo,
success: () => {
this.paySuccess();
},
fail: (err) => {
// 原生失败跳H5链接
if (res.data.data.payUrl) {
location.href = res.data.data.payUrl;
this.checkPayStatus();
} else {
this.$util.showToast({
title: `华为支付失败:${err.message}`
});
this.close();
}
}
});
} catch (sdkErr) {
// SDK加载失败跳H5
if (res.data.data.payUrl) {
location.href = res.data.data.payUrl;
this.checkPayStatus();
} else {
this.$util.showToast({
title: '华为支付SDK加载失败'
});
this.close();
}
}
} else if (res.data.data.payUrl) {
// 非华为快应用直接跳H5链接
location.href = res.data.data.payUrl;
this.checkPayStatus();
} else {
this.$util.showToast({
title: '未获取到华为支付链接'
});
this.close();
}
break;
}
} else {
this.$util.showToast({
title: res.message
});
}
},
fail: res => {
uni.hideLoading();
this.repeatFlag = false; // 重置文件2的防重复标记
this.$util.showToast({
title: 'request:fail'
});
}
});
},
/**
* 线下支付处理(保留原有逻辑)
* 线下支付处理(保留文件2原有逻辑)
*/
payOffline() {
this.$util.redirectTo('/pages_tool/pay/offlinepay', {
@@ -385,8 +499,8 @@ export default {
// #ifdef MP
pay() {
var payType = this.payTypeList[this.payIndex];
// 保留文件2的线下支付逻辑
if (!payType || payType.type === 'offlinepay') {
// 线下支付仍使用原有逻辑
this.$util.redirectTo('/pages_tool/pay/offlinepay', {
outTradeNo: this.payInfo.out_trade_no
});
@@ -394,8 +508,147 @@ export default {
return;
}
// 小程序端真实调用统一支付工具类
this.invokeUnifiedPay(payType.type);
// 保留文件2的流程控制
if (!this.resetPayComplete) {
uni.hideLoading();
this.$util.showToast({
title: '支付取消中,请稍后再试!'
});
this.repeatFlag = false;
return;
}
// 复用文件1的小程序端核心逻辑调用/api/pay/pay
this.$api.sendRequest({
url: '/api/pay/pay',
data: {
out_trade_no: this.payInfo.out_trade_no,
pay_type: payType.type,
scene: uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync().scene,
is_balance: this.isBalance
},
success: res => {
uni.hideLoading();
this.repeatFlag = false; // 重置文件2的防重复标记
if (res.code >= 0) {
if (res.data.pay_success) {
this.paySuccess();
return;
}
var payData = res.data.data;
switch (payType.type) {
// 保留文件1的微信支付逻辑新增空值判断
case 'wechatpay':
// 新增:空值判断
if (!payData) {
this.$util.showToast({ title: '微信支付参数获取失败' });
this.close();
return;
}
var scene = uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync().scene;
if ([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1) {
uni.requestOrderPayment({
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: payData.signType,
paySign: payData.paySign,
success: res => {
this.paySuccess();
},
fail: res => {
this.handlePayFail(res);
}
});
return;
}
uni.requestPayment({
provider: 'wxpay',
...payData,
success: res => {
this.paySuccess();
},
fail: res => {
this.handlePayFail(res);
}
});
break;
// 保留文件1的支付宝支付逻辑新增空值判断
case 'alipay':
// 新增:空值判断
if (!payData) {
this.$util.showToast({ title: '支付宝支付参数获取失败' });
this.close();
return;
}
uni.requestPayment({
provider: 'alipay',
...payData,
success: res => {
this.paySuccess();
},
fail: res => {
this.handlePayFail(res);
}
});
break;
// 新增华为支付小程序端逻辑(补充空值判断)
case 'huaweipay':
// 新增:空值判断
if (!payData) {
this.$util.showToast({ title: '华为支付参数获取失败' });
this.close();
return;
}
if (payData.payUrl) {
// 小程序端跳WebView页面
this.$util.redirectTo('/pages/Pay/Pay', {
payUrl: payData.payUrl,
outTradeNo: this.payInfo.out_trade_no
});
} else {
this.$util.showToast({
title: '未获取到华为支付链接'
});
this.close();
}
break;
}
} else {
this.$util.showToast({
title: res.message
});
}
},
fail: res => {
uni.hideLoading();
this.repeatFlag = false; // 重置文件2的防重复标记
this.$util.showToast({
title: 'request:fail'
});
}
});
},
/**
* 统一处理支付失败复用文件1逻辑
*/
handlePayFail(res) {
this.flag = false;
if (res.errMsg.includes('cancel')) {
this.$util.showToast({
title: '您已取消支付'
});
this.resetpay();
} else {
uni.showModal({
content: '支付失败,失败原因: ' + res.errMsg,
showCancel: false
});
setTimeout(() => {
this.close();
}, 1500)
}
},
// #endif
/**