mall + pay:

1. 修复支付宝沙箱地址的调整
2. 收银台的前端 URL 支付走整个网页跳转
3. 收银台的支付成功后,增加 returnUrl 回跳
4. 修复 PayNotifyTask 首次通知时,可能会失败的情况;原因:租户未传递;
This commit is contained in:
YunaiV
2023-07-12 00:04:19 +08:00
parent f1c4c7964a
commit 0ac599a3d9
9 changed files with 81 additions and 154 deletions

View File

@ -36,6 +36,9 @@ export default {
return router.push(lastPath || '/');
});
}
if (typeof obj === "function") {
return store.dispatch('tagsView/delView', router.currentRoute).then(obj);
}
return store.dispatch('tagsView/delView', obj);
},
// 关闭所有tab页签

View File

@ -41,17 +41,17 @@
</el-radio-group>
</el-form-item>
<div v-if="form.aliPayConfig.mode === 1">
<el-form-item label-width="180px" label="商户私钥" prop="aliPayConfig.privateKey">
<el-form-item label-width="180px" label="应用私钥" prop="aliPayConfig.privateKey">
<el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey"
placeholder="请输入商户私钥" clearable :style="{width: '100%'}">
placeholder="请输入应用私钥" clearable :style="{width: '100%'}">
</el-input>
</el-form-item>
<el-form-item label-width="180px" label="支付宝公钥字符串" prop="aliPayConfig.alipayPublicKey">
<el-form-item label-width="180px" label="支付宝公钥" prop="aliPayConfig.alipayPublicKey">
<el-input
type="textarea"
:autosize="{minRows: 8, maxRows: 8}"
v-model="form.aliPayConfig.alipayPublicKey"
placeholder="请输入支付宝公钥字符串" clearable
placeholder="请输入支付宝公钥" clearable
:style="{width: '100%'}">
</el-input>
</el-form-item>

View File

@ -48,15 +48,6 @@
<qrcode-vue :value="qrCode.url" size="310" level="L" />
</el-dialog>
<!-- 展示形式IFrame -->
<el-dialog :title="iframe.title" :visible.sync="iframe.visible" width="800px" height="800px" append-to-body
:close-on-press-escape="false">
<iframe :src="iframe.url" width="100%" />
</el-dialog>
<!-- 展示形式Form -->
<div ref="formRef" v-html="form.value" />
<!-- 展示形式BarCode 条形码 -->
<el-dialog :title="barCode.title" :visible.sync="barCode.visible" width="500px" append-to-body
:close-on-press-escape="false">
@ -146,14 +137,6 @@ export default {
title: '',
visible: false,
},
iframe: { // 展示形式iframe
url: '',
title: '',
visible: false
},
form: { // 展示形式form
html: '',
},
barCode: { // 展示形式:条形码
channelCode: '',
value: '',
@ -175,21 +158,24 @@ export default {
// 1.1 未传递订单编号
if (!this.id) {
this.$message.error('未传递支付单号,无法查看对应的支付信息');
this.goBackToList();
this.goReturnUrl('cancel');
return;
}
getOrder(this.id).then(response => {
// 1.2 无法查询到支付信息
if (!response.data) {
this.$message.error('支付订单不存在,请检查!');
this.goBackToList();
this.goReturnUrl('cancel');
return;
}
// 1.3 订单已支付
// TODO 芋艿:已支付
if (response.data.status !== PayOrderStatusEnum.WAITING.status) {
this.$message.error('支付订单不处于待支付状态,请检查!');
this.goBackToList();
// 1.3 如果已支付、或者已关闭,则直接跳转
if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
this.$message.success('支付成功');
this.goReturnUrl('success');
return;
} else if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
this.$message.error('无法支付,原因:订单已关闭');
this.goReturnUrl('close');
return;
}
@ -218,15 +204,12 @@ export default {
submitOrder({
id: this.id,
channelCode: channelCode,
returnUrl: location.href, // 支付成功后,支付渠道跳转回当前页;再由当前页,跳转回 {@link returnUrl} 对应的地址
...this.buildSubmitParam(channelCode)
}).then(response => {
const data = response.data
if (data.displayMode === PayDisplayModeEnum.IFRAME.mode) {
this.displayIFrame(channelCode, data)
} else if (data.displayMode === PayDisplayModeEnum.URL.mode) {
if (data.displayMode === PayDisplayModeEnum.URL.mode) {
this.displayUrl(channelCode, data)
} else if (data.displayMode === PayDisplayModeEnum.FORM.mode) {
this.displayForm(channelCode, data)
} else if (data.displayMode === PayDisplayModeEnum.QR_CODE.mode) {
this.displayQrCode(channelCode, data)
}
@ -239,53 +222,7 @@ export default {
},
/** 构建提交支付的额外参数 */
buildSubmitParam(channelCode) {
// ① 支付宝 PC 支付时,有多种展示形态
if (channelCode === PayChannelEnum.ALIPAY_PC.code) {
// 情况【前置模式】:将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体支持的枚举值有以下几种:
// 0订单码-简约前置模式,对应 iframe 宽度不能小于 600px高度不能小于 300px
// return {
// "channelExtras": {
// "qr_pay_mode": "0"
// }
// }
// 1订单码-前置模式对应iframe 宽度不能小于 300px高度不能小于 600px
// return {
// "channelExtras": {
// "qr_pay_mode": "1"
// }
// }
// 3订单码-迷你前置模式,对应 iframe 宽度不能小于 75px高度不能小于 75px
// return {
// "channelExtras": {
// "qr_pay_mode": "3"
// }
// }
// 4订单码-可定义宽度的嵌入式二维码,商户可根据需要设定二维码的大小
// return {
// "channelExtras": {
// "qr_pay_mode": "4"
// }
// }
// 情况【跳转模式】:跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。支持传入的枚举值有
return {
"channelExtras": {
"qr_pay_mode": "2"
}
}
// 情况【表单模式】:直接提交当前页面到支付宝
// return {
// displayMode: PayDisplayModeEnum.FORM.mode
// }
}
// ② 支付宝 Wap 支付时,引导手机扫码支付
if (channelCode === PayChannelEnum.ALIPAY_WAP.code) {
return {
displayMode: PayDisplayModeEnum.QR_CODE.mode
}
}
// ③ 支付宝 BarCode 支付时,需要传递 authCode 条形码
// ① 支付宝 BarCode 支付时,需要传递 authCode 条形码
if (channelCode === PayChannelEnum.ALIPAY_BAR.code) {
return {
"channelExtras": {
@ -295,37 +232,12 @@ export default {
}
return {}
},
/** 提交支付后IFrame 内置 URL 的展示形式 */
displayIFrame(channelCode, data) {
// TODO 芋艿:目前有点奇怪,支付宝总是会显示“支付环境存在风险”
this.iframe = {
title: '支付窗口',
url: data.displayContent,
visible: true
}
this.submitLoading = false
},
/** 提交支付后URL 的展示形式 */
displayUrl(channelCode, data) {
// window.open(data.displayContent)window
// window.open(data.displayContent)
location.href = data.displayContent
this.submitLoading = false
},
/** 提交支付后Form 的展示形式 */
displayForm(channelCode, data) {
// 渲染支付页面
this.form = {
value: data.displayContent
}
// 防抖避免重复支付
this.$nextTick(() => {
// 提交支付表单
this.$refs.formRef.children[0].submit();
setTimeout(() => {
this.submitLoading = false
}, 1000);
});
},
/** 提交支付后(支付宝扫码支付) */
displayQrCode(channelCode, data) {
let title = '请使用手机浏览器“扫一扫”';
@ -354,13 +266,13 @@ export default {
if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
this.clearQueryInterval();
this.$message.success('支付成功!');
this.goBackToList();
this.goReturnUrl();
}
// 已取消
if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
this.clearQueryInterval();
this.$message.error('支付已关闭!');
this.goBackToList();
this.goReturnUrl();
}
})
}, 1000 * 2)
@ -377,14 +289,34 @@ export default {
clearInterval(this.interval)
this.interval = undefined
},
/** 回到列表 **/
goBackToList() {
this.$tab.closePage();
this.$router.go(-1);
// TODO 芋艿:需要优化;
// this.$router.push({
// path: this.returnUrl
// });
/**
* 回到业务的 URL
*
* @param payResult 支付结果
* ① success支付成功
* ② cancel取消支付
* ③ close支付已关闭
*/
goReturnUrl(payResult) {
// 未配置的情况下,只能关闭
if (!this.returnUrl) {
this.$tab.closePage();
return
}
const url = this.returnUrl.indexOf('?') >= 0
? this.returnUrl + '&payResult=' + payResult
: this.returnUrl + '?payResult=' + payResult
// 如果有配置,且是 http 开头,则浏览器跳转
if (this.returnUrl.indexOf('http') === 0) {
location.href = url;
} else {
this.$tab.closePage(() => {
this.$router.push({
path: url
});
});
}
}
}
};