payment: 统一支付逻辑,移除冗余文件。移除 payUtils.js、huaweiPay.js 、payCore.js冗余依赖,重构 payment.vue 支付逻辑:统一调用/api/pay/pay,新增华为支付支持。
This commit is contained in:
@@ -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
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user