问题遇到的现象和发生背景
与服务商(某银行)对接微信公众号支付,在支付完成后跳转回商家小票时,IOS系统商家小票显示无法获取订单信息,安卓系统可以正常显示
问题相关代码,请勿粘贴截图
以下时前端vue开发的代码
<template>
<div class="paysuccess-main" v-title data-title="在线支付">
<div v-if="!isSuccess" class="success-box">
<div class="status-img">
<img src="@/assets/img/pay-failed.png" alt=""/>
</div>
<div class="status-tip">支付失败</div>
<div class="order-info">
<div class="order-num">
<span class="title">订单编号:</span>
<span class="contain">{{orderInfo.id?orderInfo.id:''}}</span>
</div>
<div class="order-pay-way">
<span class="title">支付方式:</span>
<span class="contain">微信支付</span>
</div>
<div class="order-pay-time">
<span class="title">支付时间:</span>
<span class="contain">{{orderInfo.paymentTime?orderInfo.paymentTime:''}}</span>
</div>
</div>
<div class="pay-btn">
<img src="@/assets/img/pay-failed-btn.png"/>
<span @click="returnPay"></span>
</div>
</div>
<div v-else class="fail-box">
<div class="status-img">
<img src="@/assets/img/pay-success.png" alt=""/>
</div>
<div class="status-tip success">支付成功</div>
<div class="order-info">
<div class="order-num">
<span class="title">订单编号:</span>
<span class="contain">{{orderInfo.id?orderInfo.id:''}}</span>
</div>
<div class="order-pay-way">
<span class="title">支付方式:</span>
<span class="contain">微信支付</span>
</div>
<div class="order-pay-time">
<span class="title">支付时间:</span>
<span class="contain">{{orderInfo.paymentTime?orderInfo.paymentTime:''}}</span>
</div>
</div>
<div class="pay-btn">
<img src="@/assets/img/pay-success-btn.png"/>
<span @click="watchOrder"></span>
</div>
</div>
</div>
</template>
<script>
import {getOrderDetail, getPayStatus} from "@/api/api";
import axios from "axios";
import Vue from "vue";
import {ACCESS_TOKEN} from "@/store/mutation-types";
export default {
data() {
return {
orderInfo: {},
isSuccess:true,
url:'https://course.wxjy.com.cn/paySuccess'
};
},
methods: {
getPayStatusFun() {
let mchData ={action:'onIframeReady',displayStyle:'SHOW_CUSTOM_PAGE'};
let postData = JSON.stringify(mchData);
//与ifarem 交互
parent.postMessage(postData,'https://payapp.weixin.qq.com');
axios({
url:'/xxxxxx/checkPayResult',
baseURL: window._CONFIG['apiUrl'],
method:'get',
headers:{
'Content-Type': 'application/json;',
'X-Access-Token': Vue.ls.get(ACCESS_TOKEN)
},
params:{ serialNum: this.getUrlParam('trace_no') }}).then(res=>{
if(res.data.code !==200){
this.isSuccess = false
return
}
this.orderInfo = res.data.result.order;
})
},
returnPay() {
let mchData = {action:'jumpOut',jumpOutUrl:'https://xxxxxxxxxxx.com.cn/myOrder'}
let postData = JSON.stringify(mchData)
parent.postMessage(postData,'https://payapp.weixin.qq.com')
},
watchOrder() {
let mchData = {action:'jumpOut',jumpOutUrl:`https://xxxxxxx.com.cn/orderInfo?orderId=${this.orderInfo.id}`}
let postData = JSON.stringify(mchData)
parent.postMessage(postData,'https://payapp.weixin.qq.com')
},
// 获取地址栏参数
getUrlParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
var r = window.location.search.substr(1).match(reg); //匹配目标参数
if (r != null) return unescape(r[2]);
return null; //返回参数值
},
},
mounted() {
document
.querySelector("html")
.setAttribute("style", "height: 600px !important;width:640px !important; margin:0 auto;");
document
.querySelector("body")
.setAttribute("style", "height: 600px !important;width:640px !important; margin:0 auto;");
this.getPayStatusFun();
},
};
</script>
<style lang="less" scoped>
.paysuccess-main {
.fail-box,
.success-box{
position: relative;
width: 100%;
height: 100%;
background: #F6F6F6;
opacity: 1;
.status-img{
width: 9.267rem;
height: 10.133rem;
margin:0 auto;
margin-top:0.667rem;
img{
width: 100%;
height: 100%;
object-fit: cover;
}
}
.status-tip{
width: 100%;
text-align: center;
font-size: 0.933rem;
font-weight: bold;
line-height: 0.933rem;
color: #C80000;
}
.success {
color: #00C800;
}
.order-info {
width: 17.667rem;
border-top:0.133rem dotted #000000;
margin:0 auto;
margin-top:3.667rem;
font-size: 0.8rem;
font-weight: 400;
line-height: 0.933rem;
color: #333333;
.order-num,
.order-pay-way,
.order-pay-time{
margin-top: 0.667rem;
.contain {
float:right;
color: #999999;
}
}
.order-pay-time{
padding-bottom:0.667rem;
}
}
.pay-btn {
position: absolute;
top:9.533rem;
left: 6rem;
width: 11.019rem;
height: 7.353rem;
img{
width: 100%;
height: 100%;
object-fit: cover;
}
span {
position: absolute;
top:2.6rem;
left: 2.7rem;
display: inline-block;
width: 5.4rem;
height: 1.5rem;
}
}
}
}
</style>
运行结果及报错内容
ios显示无发获取订单信息时vconsule没显示
我的解答思路和尝试过的方法
在不同vue的不同生命周期去进行对JSAPI的访问,IOS都无法正常显示
我想要达到的结果
安卓和IOS系统在支付成功后都能跳转到指定的商家小票页面,并且商家小票可以正常显示