178 lines
5.4 KiB
JavaScript
178 lines
5.4 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 === '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 }
|
|
});
|
|
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 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' });
|
|
}
|
|
}
|
|
}
|
|
}); |