Files
xingque/pages/penalty/components/fakuan-pay/fakuan-pay.js

224 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// components/fakuan-list/fakuan-pay/fakuan-pay.js
import request from '../../../../utils/request.js'; // 路径保持您原来的样子
Component({
properties: {
visible: { type: Boolean, value: false, observer: 'onVisibleChange' },
fadan: { type: Object, value: null } // { id, fakuanjine }
},
data: {
step: 'method', // method / balance / confirm / loading
balanceOptions: [],
selectedBalance: null,
loadingText: '',
payLoading: false,
dingdanid: '' // 微信支付内部订单ID
},
methods: {
onVisibleChange(val) {
if (val) {
// 每次打开重置为支付方式选择
this.setData({ step: 'method', balanceOptions: [], selectedBalance: null });
}
},
close() {
this.setData({ visible: false });
this.triggerEvent('close');
},
// 选择支付方式
async chooseMethod(e) {
const method = e.currentTarget.dataset.method;
if (method === 'wx') {
this.wxPay();
} else if (method === 'alipay') {
this.alipayPay();
} else if (method === 'balance') {
this.fetchBalanceOptions();
}
},
// ========== 微信支付流程 ==========
async wxPay() {
this.setData({ step: 'loading', loadingText: '发起支付中...' });
try {
const res = await request({
url: '/yonghu/fkjn',
method: 'POST',
data: { fadan_id: this.properties.fadan.id, pay_method: 'wechat' }
});
if (res.data.code !== 200) throw new Error(res.data.msg || '下单失败');
// 🔥 唯一修改点:后端返回格式 { code:200, payParams:{...}, dingdanid:'...' }
const payParams = res.data.payParams;
const dingdanid = res.data.dingdanid;
this.setData({ dingdanid });
await this.requestWxPayment(payParams);
} catch (e) {
this.setData({ step: 'method' });
wx.showToast({ title: e.message, icon: 'none' });
}
},
// ========== 支付宝扫码支付流程 ==========
async alipayPay() {
this.setData({ step: 'loading', loadingText: '生成支付宝二维码...' });
try {
const res = await request({
url: '/yonghu/fkjn',
method: 'POST',
data: { fadan_id: this.properties.fadan.id, pay_method: 'alipay' }
});
if (res.data.code !== 200) throw new Error(res.data.msg || '下单失败');
const payParams = res.data.payParams;
const dingdanid = res.data.dingdanid;
this.setData({ dingdanid, step: 'method' });
this.triggerAlipayPayment(payParams, dingdanid);
} catch (e) {
this.setData({ step: 'method' });
wx.showToast({ title: e.message, icon: 'none' });
}
},
// 跳转支付宝二维码页(轮询 /yonghu/fkzffc
triggerAlipayPayment(payParams, orderId) {
const qrImage = payParams && payParams.qr_image ? payParams.qr_image : '';
if (!qrImage) {
wx.showToast({ title: '支付宝二维码生成失败', icon: 'none' });
return;
}
const app = getApp();
app.globalData.alipayQrImage = qrImage;
const pollUrl = encodeURIComponent('/yonghu/fkzffc');
const self = this;
wx.navigateTo({
url: `/pages/alipay-webview/alipay-webview?orderId=${orderId}&pollUrl=${pollUrl}`,
events: {
onAlipaySuccess: () => {
// 复用微信流成功逻辑:通知父组件刷新罚单列表并关闭弹窗
self.triggerEvent('success');
self.close();
wx.showToast({ title: '缴纳成功', icon: 'success' });
}
}
});
},
async requestWxPayment(payParams) {
return new Promise((resolve, reject) => {
if (!payParams || !payParams.timeStamp || !payParams.paySign) {
wx.showToast({ title: '支付参数错误', icon: 'none' });
reject(new Error('支付参数错误'));
return;
}
wx.requestPayment({
timeStamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: payParams.signType || 'MD5',
paySign: payParams.paySign,
success: () => {
this.pollPayStatus();
resolve();
},
fail: (err) => {
this.setData({ step: 'method' });
this.notifyPayFail();
reject(err);
}
});
});
},
async pollPayStatus() {
this.setData({ step: 'loading', loadingText: '确认支付结果...' });
for (let i = 0; i < 10; i++) {
try {
const res = await request({
url: '/yonghu/fkzffc',
method: 'POST',
data: { dingdanid: this.data.dingdanid }
});
if (res.data.code === 200) {
this.triggerEvent('success');
this.close();
wx.showToast({ title: '缴纳成功', icon: 'success' });
return;
}
} catch (e) {}
await new Promise(r => setTimeout(r, 2000));
}
this.setData({ step: 'method' });
wx.showToast({ title: '支付确认超时', icon: 'none' });
},
async notifyPayFail() {
try {
await request({
url: '/yonghu/fkzfsb',
method: 'POST',
data: { dingdanid: this.data.dingdanid }
});
} catch (e) {}
},
// ========== 佣金抵扣流程 ==========
async fetchBalanceOptions() {
this.setData({ step: 'loading', loadingText: '获取可抵扣身份...' });
try {
const res = await request({
url: '/shangpin/czhqdy',
method: 'POST',
data: {
leixing: 4,
fadan_id: this.properties.fadan.id,
jine: this.properties.fadan.fakuanjine
}
});
if (res.data.code !== 200) throw new Error(res.data.msg || '获取失败');
this.setData({ balanceOptions: res.data.data, step: 'balance' });
} catch (e) {
this.setData({ step: 'method' });
wx.showToast({ title: e.message, icon: 'none' });
}
},
selectBalance(e) {
const id = e.currentTarget.dataset.id;
const info = this.data.balanceOptions.find(opt => opt.id === id);
if (!info) return;
this.setData({ selectedBalance: info, step: 'confirm' });
},
backToMethod() {
this.setData({ step: 'method' });
},
async confirmBalance() {
if (!this.data.selectedBalance) return;
this.setData({ step: 'loading', loadingText: '抵扣扣款中...' });
try {
const res = await request({
url: '/shangpin/dsqrgmdh',
method: 'POST',
data: {
leixing: 4,
shenfen_id: this.data.selectedBalance.id,
fadan_id: this.properties.fadan.id
}
});
if (res.data.code !== 200) throw new Error(res.data.msg || '抵扣失败');
this.triggerEvent('success');
this.close();
wx.showToast({ title: '缴纳成功', icon: 'success' });
} catch (e) {
this.setData({ step: 'method' });
wx.showToast({ title: e.message, icon: 'none' });
}
}
}
});