224 lines
7.1 KiB
JavaScript
224 lines
7.1 KiB
JavaScript
// 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' });
|
||
}
|
||
}
|
||
}
|
||
}); |