微信中调用支付宝支付,首先我们知道微信是不能直接调用支付宝的,所以我们需要使用一个中间页提示用户在浏览器中打开,然后进行网页支付或打开app支付。以下为详细唤起支付宝的步骤、业务代码以及相关页面图。
如有问题欢迎评论留言,看到定回复哦^_^\(^o^)/~
一、微信中唤起支付宝,有几个步骤:
1、中间页引导用户在浏览器中打开去唤起支付宝。
2、浏览器中打开支付宝或app中打开支付宝。
3、唤起成功后,进行支付宝支付:支付成功、支付失败、支付取消、支付超时。
4、在支付后,返回微信时跳转到成功和失败的提示页面。
5、在支付后,返回浏览器时渲染出支付成功和支付失败的用户提示页面。
app中打开支付宝测试,需要注意:
1、在测试环境中,开发者需要在支付宝开放平台注册沙箱环境账号:https://openhome.alipay.com/platform/appDaily.htm。
2、注册后,在Android中下载沙箱钱包,登录的账号为沙箱环境中的买家账号和密码。
二、整个需求的业务代码如下:
1、中间页引导页:
<div class="Pending">
<div class="in-weixin" v-if="isWeixin">
<div class="not-pay" v-if="!payStatus">
<div class="weixin-tip">
<div class="weixin-tip-content">
| 请在菜单中选择在浏览器中打开,
<br/>
| 以完成支付
</div>
</div>
<div class="weixin-img" :class="{'ios': isIos, 'android': isAndroid}">
</div>
<!--<div class="weixin-button">-->
<!--| 返回选择其他支付方式-->
<!--</div>-->
</div>
<div class="have-pay" v-else>
<p>检查支付结果</p>
</div>
</div>
<div class="in-browser" v-if="!isWeixin">
<!--<p>支付跳转中...{{retry}}</p>-->
<p>支付跳转中...</p>
</div>
<div class="payment-form" v-html="paymentForm">
</div>
</div>
在ios上面的效果:
2、js逻辑处理:
export default {
data() {
return {
isWeixin: navigators.isWeixin(),//navigator.userAgent判断是在微信或在浏览器
isIos: navigators.isIos(),
isAndroid: navigators.isAndroid(),
payStatus: false,
timer: undefined,
// retry: 5,
retry: 210,//轮询10分30秒 用于在微信中进行订单查询的时间
paymentForm: ''
}
},
computed: {
option: function () {
return this.$route.query
}
},
mounted() {
// 浏览器中执行支付宝支付
if (!this.isWeixin) {
this.SubmitPay()
}
// 切出微信到浏览器或者切出浏览器到支付宝,切换回来检查支付结果
let oldTime = new Date()
let count = this.retry
// 刷新当前页面时,检查支付结果
this.CheckOrder(count)
this.timer = setInterval(() => {
let newTime = new Date()
console.log('时间: ', newTime.getTime() - oldTime.getTime())
if (newTime.getTime() - oldTime.getTime() > 3000) {
this.CheckOrder(count)
this.payStatus = true
clearInterval(this.timer)
}
oldTime = newTime
}, 1000)
},
destroyed() {
// 页面销毁取消计时事件
clearInterval(this.timer)
},
methods: {
SubmitPay () {
this.paymentForm = this.$route.query.alipayForm //把后台返回的form表单字符串赋值给中间页的标签进行表单验证
setTimeout(() => {
let fm = document.getElementsByTagName('form')[0]
fm && fm.submit()
}, 50)
},
CheckOrder(count){//订单查询
// let that = this
let id=this.$route.query.orderId
apiEstore
.CheckOrderPayment(id)
.then(res => {
if(res.status && res.resultCode==1){
if(res.data.payStatus==1){//支付成功
// 返回到微信的处理操作
if (this.isWeixin) {
this.$router.replace({path:"/mainPage",query:{"success":1,"reference":this.$route.query.reference,orderId:id}})
}
}else{//后台判断支付成功的状态未更新时,需要进行轮询
if (count > 0) {//支付成功时轮询查询接口更新status
this.retry = count
setTimeout(() => {
this.CheckOrder(--count)
}, 3000)
} else if (count <= 0) {//轮询结束,销毁取消计时事件,支付失败
clearInterval(this.timer)
this.$router.replace({path:"/checkout",query:{id:this.$route.query.id,"alipayFail":1}})
}
}
}
})
.catch(err => {
console.log("err====支付宝=======", err);
});
}
}
3、唤起成功成功时的页面效果:
4、支付后返回到微信中的页面:
支付后,支付宝是给浏览器返回结果的,那微信页面中的这个支付结果是怎么刷新出来的呢?
支付后,在回到微信时会调取查询订单状态的轮询接口(走轮询机制),根据你支付的状态后台去抓取是成功还是失败,然后前台根据轮询接口中的支付状态参数去判断轮询的订单结果。最后判断是支付成功还是失败。代码段可详见:methods中的CheckOrder方法体。
5、支付后返回到浏览器,支付成功和支付失败新建两个页面,把页面的URL指定发给后台,后台进行URL配置。当支付后返回到浏览器,渲染出成功或失败的提示页面。
版权声明:本文为han_calligrapher原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。