|  | @@ -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
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 |