Commit e6f414b918c8661adebe7622156e5604b3e137db

Authored by YunaiV
1 parent aff9886a

pay: 接入支付宝 Wap 支付

yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/AbstractPayClient.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl; 1 package cn.iocoder.yudao.framework.pay.core.client.impl;
2 2
  3 +import cn.hutool.core.date.DatePattern;
  4 +import cn.hutool.core.date.DateUtil;
  5 +import cn.hutool.core.date.LocalDateTimeUtil;
  6 +import cn.iocoder.yudao.framework.common.util.date.DateUtils;
  7 +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
3 import cn.iocoder.yudao.framework.pay.core.client.AbstractPayCodeMapping; 8 import cn.iocoder.yudao.framework.pay.core.client.AbstractPayCodeMapping;
4 import cn.iocoder.yudao.framework.pay.core.client.PayClient; 9 import cn.iocoder.yudao.framework.pay.core.client.PayClient;
5 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig; 10 import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
@@ -11,6 +16,9 @@ import lombok.extern.slf4j.Slf4j; @@ -11,6 +16,9 @@ import lombok.extern.slf4j.Slf4j;
11 16
12 import javax.validation.Validation; 17 import javax.validation.Validation;
13 18
  19 +import java.time.LocalDateTime;
  20 +
  21 +import static cn.hutool.core.date.DatePattern.NORM_DATETIME_MS_FORMATTER;
14 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString; 22 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
15 23
16 /** 24 /**
@@ -69,11 +77,6 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen @@ -69,11 +77,6 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen
69 this.init(); 77 this.init();
70 } 78 }
71 79
72 - // TODO 芋艿:后续抽取到工具类里  
73 - protected Double calculateAmount(Integer amount) {  
74 - return amount / 100.0;  
75 - }  
76 -  
77 @Override 80 @Override
78 public Long getId() { 81 public Long getId() {
79 return channelId; 82 return channelId;
@@ -113,4 +116,14 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen @@ -113,4 +116,14 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen
113 116
114 protected abstract PayCommonResult<PayRefundUnifiedRespDTO> doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable; 117 protected abstract PayCommonResult<PayRefundUnifiedRespDTO> doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable;
115 118
  119 +
  120 + protected String formatAmount(Integer amount) {
  121 + return String.valueOf(amount / 100.0);
  122 + }
  123 +
  124 + protected String formatTime(LocalDateTime time) {
  125 + // "yyyy-MM-dd HH:mm:ss"
  126 + return LocalDateTimeUtil.format(time, NORM_DATETIME_MS_FORMATTER);
  127 + }
  128 +
116 } 129 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AbstractAlipayClient.java
@@ -112,7 +112,7 @@ public abstract class AbstractAlipayClient extends AbstractPayClient&lt;AlipayPayCl @@ -112,7 +112,7 @@ public abstract class AbstractAlipayClient extends AbstractPayClient&lt;AlipayPayCl
112 model.setOutTradeNo(reqDTO.getPayTradeNo()); 112 model.setOutTradeNo(reqDTO.getPayTradeNo());
113 113
114 model.setOutRequestNo(reqDTO.getMerchantRefundId()); 114 model.setOutRequestNo(reqDTO.getMerchantRefundId());
115 - model.setRefundAmount(calculateAmount(reqDTO.getAmount() / 2).toString()); 115 + model.setRefundAmount(formatAmount(reqDTO.getAmount() / 2).toString());
116 model.setRefundReason(reqDTO.getReason()); 116 model.setRefundReason(reqDTO.getReason());
117 117
118 AlipayTradeRefundRequest refundRequest = new AlipayTradeRefundRequest(); 118 AlipayTradeRefundRequest refundRequest = new AlipayTradeRefundRequest();
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; 1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
2 2
3 -import cn.hutool.core.lang.Pair;  
4 import cn.hutool.core.map.MapUtil; 3 import cn.hutool.core.map.MapUtil;
5 -import cn.hutool.core.util.ObjectUtil;  
6 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
7 import cn.hutool.http.Method; 5 import cn.hutool.http.Method;
8 -import cn.iocoder.yudao.framework.common.util.collection.MapUtils;  
9 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 6 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
10 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 7 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
11 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; 8 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
@@ -18,12 +15,11 @@ import com.alipay.api.request.AlipayTradePagePayRequest; @@ -18,12 +15,11 @@ import com.alipay.api.request.AlipayTradePagePayRequest;
18 import com.alipay.api.response.AlipayTradePagePayResponse; 15 import com.alipay.api.response.AlipayTradePagePayResponse;
19 import lombok.extern.slf4j.Slf4j; 16 import lombok.extern.slf4j.Slf4j;
20 17
21 -import java.util.HashMap;  
22 import java.util.Objects; 18 import java.util.Objects;
23 19
24 -  
25 /** 20 /**
26 - * 支付宝【PC网站支付】的 PayClient 实现类 21 + * 支付宝【PC 网站支付】的 PayClient 实现类
  22 + *
27 * 文档:https://opendocs.alipay.com/open/270/105898 23 * 文档:https://opendocs.alipay.com/open/270/105898
28 * 24 *
29 * @author XGD 25 * @author XGD
@@ -32,7 +28,8 @@ import java.util.Objects; @@ -32,7 +28,8 @@ import java.util.Objects;
32 public class AlipayPcPayClient extends AbstractAlipayClient { 28 public class AlipayPcPayClient extends AbstractAlipayClient {
33 29
34 public AlipayPcPayClient(Long channelId, AlipayPayClientConfig config) { 30 public AlipayPcPayClient(Long channelId, AlipayPayClientConfig config) {
35 - super(channelId, PayChannelEnum.ALIPAY_PC.getCode(), config, new AlipayPayCodeMapping()); 31 + super(channelId, PayChannelEnum.ALIPAY_PC.getCode(), config,
  32 + new AlipayPayCodeMapping());
36 } 33 }
37 34
38 @Override 35 @Override
@@ -42,8 +39,10 @@ public class AlipayPcPayClient extends AbstractAlipayClient { @@ -42,8 +39,10 @@ public class AlipayPcPayClient extends AbstractAlipayClient {
42 // ① 通用的参数 39 // ① 通用的参数
43 model.setOutTradeNo(reqDTO.getMerchantOrderId()); 40 model.setOutTradeNo(reqDTO.getMerchantOrderId());
44 model.setSubject(reqDTO.getSubject()); 41 model.setSubject(reqDTO.getSubject());
45 - model.setTotalAmount(String.valueOf(calculateAmount(reqDTO.getAmount())));  
46 - model.setProductCode("FAST_INSTANT_TRADE_PAY"); // 销售产品码. 目前电脑支付场景下仅支持 FAST_INSTANT_TRADE_PAY 42 + model.setBody(reqDTO.getBody());
  43 + model.setTotalAmount(formatAmount(reqDTO.getAmount()));
  44 + model.setTimeExpire(formatTime(reqDTO.getExpireTime()));
  45 + model.setProductCode("FAST_INSTANT_TRADE_PAY"); // 销售产品码. 目前 PC 支付场景下仅支持 FAST_INSTANT_TRADE_PAY
47 // ② 个性化的参数 46 // ② 个性化的参数
48 // 参考 https://www.pingxx.com/api/支付渠道 extra 参数说明.html 的 alipay_pc_direct 部分 47 // 参考 https://www.pingxx.com/api/支付渠道 extra 参数说明.html 的 alipay_pc_direct 部分
49 model.setQrPayMode(MapUtil.getStr(reqDTO.getChannelExtras(), "qr_pay_mode")); 48 model.setQrPayMode(MapUtil.getStr(reqDTO.getChannelExtras(), "qr_pay_mode"));
@@ -71,10 +70,8 @@ public class AlipayPcPayClient extends AbstractAlipayClient { @@ -71,10 +70,8 @@ public class AlipayPcPayClient extends AbstractAlipayClient {
71 } 70 }
72 71
73 // 2.2 处理结果 72 // 2.2 处理结果
74 - System.out.println(response.getBody());  
75 PayOrderUnifiedRespDTO respDTO = new PayOrderUnifiedRespDTO() 73 PayOrderUnifiedRespDTO respDTO = new PayOrderUnifiedRespDTO()
76 .setDisplayMode(displayMode).setDisplayContent(response.getBody()); 74 .setDisplayMode(displayMode).setDisplayContent(response.getBody());
77 - // 响应为表单格式,前端可嵌入响应的页面或关闭当前支付窗口  
78 return PayCommonResult.build(StrUtil.blankToDefault(response.getCode(),"10000"), 75 return PayCommonResult.build(StrUtil.blankToDefault(response.getCode(),"10000"),
79 response.getMsg(), respDTO, codeMapping); 76 response.getMsg(), respDTO, codeMapping);
80 } 77 }
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
@@ -31,7 +31,7 @@ public class AlipayQrPayClient extends AbstractAlipayClient { @@ -31,7 +31,7 @@ public class AlipayQrPayClient extends AbstractAlipayClient {
31 model.setOutTradeNo(reqDTO.getMerchantOrderId()); 31 model.setOutTradeNo(reqDTO.getMerchantOrderId());
32 model.setSubject(reqDTO.getSubject()); 32 model.setSubject(reqDTO.getSubject());
33 model.setBody(reqDTO.getBody()); 33 model.setBody(reqDTO.getBody());
34 - model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString()); // 单位:元 34 + model.setTotalAmount(formatAmount(reqDTO.getAmount()).toString()); // 单位:元
35 // TODO 芋艿:userIp + expireTime 35 // TODO 芋艿:userIp + expireTime
36 // 构建 AlipayTradePrecreateRequest 36 // 构建 AlipayTradePrecreateRequest
37 AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest(); 37 AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay; 1 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
2 2
3 -import cn.hutool.core.date.DateUtil; 3 +import cn.hutool.core.util.ObjectUtil;
  4 +import cn.hutool.core.util.StrUtil;
4 import cn.hutool.http.Method; 5 import cn.hutool.http.Method;
5 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult; 6 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
6 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO; 7 import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
  8 +import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedRespDTO;
7 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum; 9 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
  10 +import cn.iocoder.yudao.framework.pay.core.enums.PayDisplayModeEnum;
8 import com.alipay.api.AlipayApiException; 11 import com.alipay.api.AlipayApiException;
9 import com.alipay.api.domain.AlipayTradeWapPayModel; 12 import com.alipay.api.domain.AlipayTradeWapPayModel;
10 import com.alipay.api.request.AlipayTradeWapPayRequest; 13 import com.alipay.api.request.AlipayTradeWapPayRequest;
@@ -14,7 +17,8 @@ import lombok.extern.slf4j.Slf4j; @@ -14,7 +17,8 @@ import lombok.extern.slf4j.Slf4j;
14 import java.util.Objects; 17 import java.util.Objects;
15 18
16 /** 19 /**
17 - * 支付宝【手机网站】的 PayClient 实现类 20 + * 支付宝【手机 网站】的 PayClient 实现类
  21 + *
18 * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay 22 * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay
19 * 23 *
20 * @author 芋道源码 24 * @author 芋道源码
@@ -22,31 +26,32 @@ import java.util.Objects; @@ -22,31 +26,32 @@ import java.util.Objects;
22 @Slf4j 26 @Slf4j
23 public class AlipayWapPayClient extends AbstractAlipayClient { 27 public class AlipayWapPayClient extends AbstractAlipayClient {
24 28
25 -  
26 public AlipayWapPayClient(Long channelId, AlipayPayClientConfig config) { 29 public AlipayWapPayClient(Long channelId, AlipayPayClientConfig config) {
27 - super(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config, new AlipayPayCodeMapping()); 30 + super(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config,
  31 + new AlipayPayCodeMapping());
28 } 32 }
29 33
30 @Override 34 @Override
31 - public PayCommonResult<AlipayTradeWapPayResponse> doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) {  
32 - // 构建 AlipayTradeWapPayModel 请求 35 + public PayCommonResult<PayOrderUnifiedRespDTO> doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) {
  36 + // 1.1 构建 AlipayTradeWapPayModel 请求
33 AlipayTradeWapPayModel model = new AlipayTradeWapPayModel(); 37 AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
  38 + // ① 通用的参数
34 model.setOutTradeNo(reqDTO.getMerchantOrderId()); 39 model.setOutTradeNo(reqDTO.getMerchantOrderId());
35 model.setSubject(reqDTO.getSubject()); 40 model.setSubject(reqDTO.getSubject());
36 model.setBody(reqDTO.getBody()); 41 model.setBody(reqDTO.getBody());
37 - model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString());  
38 - model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整  
39 - //TODO 芋艿:这里咋整 jason @芋艿 可以去掉吧,  
40 - // TODO 芋艿 似乎这里不用传sellerId  
41 - // https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay  
42 - //model.setSellerId("2088102147948060");  
43 - model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss"));  
44 - // TODO 芋艿:userIp  
45 - // 构建 AlipayTradeWapPayRequest 42 + model.setTotalAmount(formatAmount(reqDTO.getAmount()));
  43 + model.setProductCode("QUICK_WAP_PAY"); // 销售产品码. 目前 Wap 支付场景下仅支持 QUICK_WAP_PAY
  44 + // ② 个性化的参数【无】
  45 + // ③ 支付宝 Wap 支付只有一种展示,考虑到前端可能希望二维码扫描后,手机打开
  46 + String displayMode = ObjectUtil.defaultIfNull(reqDTO.getDisplayMode(),
  47 + PayDisplayModeEnum.URL.getMode());
  48 +
  49 + // 1.2 构建 AlipayTradeWapPayRequest 请求
46 AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest(); 50 AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
47 request.setBizModel(model); 51 request.setBizModel(model);
48 request.setNotifyUrl(reqDTO.getNotifyUrl()); 52 request.setNotifyUrl(reqDTO.getNotifyUrl());
49 - request.setReturnUrl(reqDTO.getReturnUrl()); 53 + request.setReturnUrl(reqDTO.getReturnUrl()); // TODO 芋艿,待搞
  54 + model.setQuitUrl(reqDTO.getReturnUrl()); // TODO 芋艿,待搞
50 55
51 // 执行请求 56 // 执行请求
52 AlipayTradeWapPayResponse response; 57 AlipayTradeWapPayResponse response;
@@ -57,21 +62,11 @@ public class AlipayWapPayClient extends AbstractAlipayClient { @@ -57,21 +62,11 @@ public class AlipayWapPayClient extends AbstractAlipayClient {
57 } 62 }
58 System.out.println(response.getBody()); 63 System.out.println(response.getBody());
59 64
60 - // TODO 芋艿:sub Code  
61 - if(response.isSuccess() && Objects.isNull(response.getCode()) && Objects.nonNull(response.getBody())){  
62 - //成功alipay wap 成功 code 为 null , body 为form 表单  
63 - return PayCommonResult.build("-9999", "Success", response, codeMapping);  
64 - }else {  
65 - return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);  
66 - } 65 + // 2.2 处理结果
  66 + PayOrderUnifiedRespDTO respDTO = new PayOrderUnifiedRespDTO()
  67 + .setDisplayMode(displayMode).setDisplayContent(response.getBody());
  68 + return PayCommonResult.build(StrUtil.blankToDefault(response.getCode(),"10000"),
  69 + response.getMsg(), respDTO, codeMapping);
67 } 70 }
68 71
69 -  
70 -  
71 -  
72 -  
73 -  
74 -  
75 -  
76 -  
77 } 72 }
yudao-ui-admin/src/utils/constants.js
@@ -162,6 +162,9 @@ export const PayDisplayModeEnum = { @@ -162,6 +162,9 @@ export const PayDisplayModeEnum = {
162 }, 162 },
163 FORM: { 163 FORM: {
164 "mode": "form" 164 "mode": "form"
  165 + },
  166 + QR_CODE: {
  167 + "mode": "qr_code"
165 } 168 }
166 } 169 }
167 170
yudao-ui-admin/src/views/pay/order/submit.vue
@@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
44 <!-- 展示形式:二维码 URL --> 44 <!-- 展示形式:二维码 URL -->
45 <el-dialog :title="qrCode.title" :visible.sync="qrCode.visible" width="350px" append-to-body 45 <el-dialog :title="qrCode.title" :visible.sync="qrCode.visible" width="350px" append-to-body
46 :close-on-press-escape="false"> 46 :close-on-press-escape="false">
47 - <qrcode-vue :value="qrCode.url" size="310" level="H" /> 47 + <qrcode-vue :value="qrCode.url" size="310" level="L" />
48 </el-dialog> 48 </el-dialog>
49 49
50 <!-- 展示形式:IFrame --> 50 <!-- 展示形式:IFrame -->
@@ -53,7 +53,7 @@ @@ -53,7 +53,7 @@
53 <iframe :src="iframe.url" width="100%" /> 53 <iframe :src="iframe.url" width="100%" />
54 </el-dialog> 54 </el-dialog>
55 55
56 - <!-- 展示形式: --> 56 + <!-- 展示形式:Form -->
57 <div ref="formRef" v-html="form.value" /> 57 <div ref="formRef" v-html="form.value" />
58 58
59 </div> 59 </div>
@@ -162,20 +162,15 @@ export default { @@ -162,20 +162,15 @@ export default {
162 ...this.buildSubmitParam(channelCode) 162 ...this.buildSubmitParam(channelCode)
163 }).then(response => { 163 }).then(response => {
164 const data = response.data 164 const data = response.data
165 - if (data.displayMode === 'iframe') { 165 + if (data.displayMode === PayDisplayModeEnum.IFRAME.mode) {
166 this.displayIFrame(channelCode, data) 166 this.displayIFrame(channelCode, data)
167 - } else if (data.displayMode === 'url') { 167 + } else if (data.displayMode === PayDisplayModeEnum.URL.mode) {
168 this.displayUrl(channelCode, data) 168 this.displayUrl(channelCode, data)
169 - } else if (data.displayMode === 'form') { 169 + } else if (data.displayMode === PayDisplayModeEnum.FORM.mode) {
170 this.displayForm(channelCode, data) 170 this.displayForm(channelCode, data)
  171 + } else if (data.displayMode === PayDisplayModeEnum.QR_CODE.mode) {
  172 + this.displayQrCode(channelCode, data)
171 } 173 }
172 - // 不同的支付,调用不同的策略  
173 - // if (channelCode === PayChannelEnum.ALIPAY_QR.code) {  
174 - // this.submitAfterAlipayQr(invokeResponse)  
175 - // } else if (channelCode === PayChannelEnum.ALIPAY_PC.code  
176 - // || channelCode === PayChannelEnum.ALIPAY_WAP.code) {  
177 - // this.submitAfterAlipayPc(invokeResponse)  
178 - // }  
179 174
180 // 打开轮询任务 175 // 打开轮询任务
181 this.createQueryInterval() 176 this.createQueryInterval()
@@ -183,7 +178,7 @@ export default { @@ -183,7 +178,7 @@ export default {
183 }, 178 },
184 /** 构建提交支付的额外参数 */ 179 /** 构建提交支付的额外参数 */
185 buildSubmitParam(channelCode) { 180 buildSubmitParam(channelCode) {
186 - // 支付宝网页支付时,有多种展示形态 181 + // ① 支付宝 PC 支付时,有多种展示形态
187 if (channelCode === PayChannelEnum.ALIPAY_PC.code) { 182 if (channelCode === PayChannelEnum.ALIPAY_PC.code) {
188 // 情况【前置模式】:将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体支持的枚举值有以下几种: 183 // 情况【前置模式】:将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以 iframe 方式请求支付宝页面。具体支持的枚举值有以下几种:
189 // 0:订单码-简约前置模式,对应 iframe 宽度不能小于 600px,高度不能小于 300px 184 // 0:订单码-简约前置模式,对应 iframe 宽度不能小于 600px,高度不能小于 300px
@@ -221,16 +216,13 @@ export default { @@ -221,16 +216,13 @@ export default {
221 // displayMode: PayDisplayModeEnum.FORM.mode 216 // displayMode: PayDisplayModeEnum.FORM.mode
222 // } 217 // }
223 } 218 }
224 - return {}  
225 - },  
226 - /** 提交支付后(支付宝扫码支付) */  
227 - submitAfterAlipayQr(invokeResponse) {  
228 - this.qrCode = {  
229 - title: '请使用支付宝“扫一扫”扫码支付',  
230 - url: invokeResponse.qrCode,  
231 - visible: true 219 + // ② 支付宝 Wap 支付时,引导手机扫码支付
  220 + if (channelCode === PayChannelEnum.ALIPAY_WAP.code) {
  221 + return {
  222 + displayMode: PayDisplayModeEnum.QR_CODE.mode
  223 + }
232 } 224 }
233 - this.submitLoading = false 225 + return {}
234 }, 226 },
235 /** 提交支付后,IFrame 内置 URL 的展示形式 */ 227 /** 提交支付后,IFrame 内置 URL 的展示形式 */
236 displayIFrame(channelCode, data) { 228 displayIFrame(channelCode, data) {
@@ -262,9 +254,26 @@ export default { @@ -262,9 +254,26 @@ export default {
262 }, 1000); 254 }, 1000);
263 }); 255 });
264 }, 256 },
  257 + /** 提交支付后(支付宝扫码支付) */
  258 + displayQrCode(channelCode, data) {
  259 + let title = '请使用手机浏览器“扫一扫”';
  260 + if (channelCode === PayChannelEnum.ALIPAY_WAP.code) {
  261 + // 考虑到 WAP 测试,所以引导手机浏览器搞
  262 + } else if (channelCode.indexOf('alipay_') === 0) {
  263 + title = '请使用支付宝“扫一扫”扫码支付';
  264 + } else if (channelCode.indexOf('wx_') === 0) {
  265 + title = '请使用微信“扫一扫”扫码支付';
  266 + }
  267 + this.qrCode = {
  268 + title: title,
  269 + url: data.displayContent,
  270 + visible: true
  271 + }
  272 + this.submitLoading = false
  273 + },
265 /** 轮询查询任务 */ 274 /** 轮询查询任务 */
266 createQueryInterval() { 275 createQueryInterval() {
267 - if (!this.interval) { 276 + if (this.interval) {
268 return 277 return
269 } 278 }
270 this.interval = setInterval(() => { 279 this.interval = setInterval(() => {