Commit 352eac48 by renyizhao

优化支付

parent bc9d5ca2
...@@ -150,8 +150,13 @@ ...@@ -150,8 +150,13 @@
</el-checkbox> </el-checkbox>
</div> </div>
<template #footer> <template #footer>
<el-button @click="safetyDialog.visible = false">取消</el-button> <el-button :disabled="safetyDialog.submitting" @click="safetyDialog.visible = false">取消</el-button>
<el-button type="primary" :disabled="!safetyDialog.checked" @click="confirmRecharge">确认充值</el-button> <el-button
type="primary"
:disabled="!safetyDialog.checked"
:loading="safetyDialog.submitting"
@click="confirmRecharge"
>确认充值</el-button>
</template> </template>
</el-dialog> </el-dialog>
...@@ -296,7 +301,8 @@ function handleRecharge() { ...@@ -296,7 +301,8 @@ function handleRecharge() {
} }
// 确认充值 // 确认充值
function confirmRecharge() { async function confirmRecharge() {
if (safetyDialog.value.submitting) return; // 防双击
if (!safetyDialog.value.checked) { if (!safetyDialog.value.checked) {
proxy.$modal.msgError("请先勾选同意安全使用条款"); proxy.$modal.msgError("请先勾选同意安全使用条款");
return; return;
...@@ -305,11 +311,21 @@ function confirmRecharge() { ...@@ -305,11 +311,21 @@ function confirmRecharge() {
// 记录用户已同意安全承诺 // 记录用户已同意安全承诺
localStorage.setItem(STORAGE_KEY_SAFETY_AGREED, 'true'); localStorage.setItem(STORAGE_KEY_SAFETY_AGREED, 'true');
// 进入提交态:弹窗不关,按钮转 loading,直到二维码生成成功才关闭
safetyDialog.value.submitting = true;
try {
await doRecharge(); // 成功(QR 已展示)后再走下面
safetyDialog.value.visible = false; safetyDialog.value.visible = false;
doRecharge(); } catch (e) {
// 失败时弹窗保留,方便用户直接重试;错误提示由 doRecharge 内 msgError 处理
} finally {
safetyDialog.value.submitting = false;
}
} }
function doRecharge() { function doRecharge() {
// 返回 Promise:resolve = 二维码已展示,reject = 出错(弹窗保留)
return new Promise((resolve, reject) => {
rechargeLoading.value = true; rechargeLoading.value = true;
qrCode.value.url = ""; qrCode.value.url = "";
...@@ -321,27 +337,34 @@ function doRecharge() { ...@@ -321,27 +337,34 @@ function doRecharge() {
// 生成二维码 // 生成二维码
if (response.data.qrCodeUrl) { if (response.data.qrCodeUrl) {
QRCode.toDataURL(response.data.qrCodeUrl, { errorCorrectionLevel: 'L', margin: 2, width: 200 }, (err, url) => { QRCode.toDataURL(response.data.qrCodeUrl, { errorCorrectionLevel: 'L', margin: 2, width: 200 }, (err, url) => {
rechargeLoading.value = false;
if (err) { if (err) {
proxy.$modal.msgError("生成二维码失败"); proxy.$modal.msgError("生成二维码失败");
rechargeLoading.value = false; reject(err);
return; return;
} }
qrCode.value.url = url; qrCode.value.url = url;
qrCode.value.visible = true; qrCode.value.visible = true;
// 开始轮询 // 开始轮询
createQueryInterval(currentRechargeId.value); createQueryInterval(currentRechargeId.value);
proxy.$modal.msgSuccess("充值订单已创建");
resolve();
}); });
} else { } else {
rechargeLoading.value = false;
proxy.$modal.msgError("获取支付链接失败"); proxy.$modal.msgError("获取支付链接失败");
reject(new Error("no qrCodeUrl"));
} }
proxy.$modal.msgSuccess("充值订单已创建");
} else { } else {
rechargeLoading.value = false;
proxy.$modal.msgError("创建充值订单失败"); proxy.$modal.msgError("创建充值订单失败");
reject(new Error("invalid response"));
} }
rechargeLoading.value = false;
}).catch(error => { }).catch(error => {
rechargeLoading.value = false; rechargeLoading.value = false;
proxy.$modal.msgError("充值失败: " + (error.message || "未知错误")); proxy.$modal.msgError("充值失败: " + (error.message || "未知错误"));
reject(error);
});
}); });
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment