本文是由Vue的SPA对接到外接设备的驱动进行交互,须要从后端接口获取领取链接传输到外接设备(大屏幕的智能设施)生成二维码。(当然也能够通过领取链接本人转成二维码)
首先定义一个单选组,有两种领取形式:“微信”,“支付宝”领取形式。paySucceed为true示意领取胜利,则提醒领取胜利,暗藏掉领取单选
<el-radio-group v-model="payWay" @change="payWayChange" v-if='paySucceed === false'>
<el-radio label="wechat" >微信</el-radio>
<el-radio label="ali">支付宝</el-radio>
</el-radio-group>
payWayChange校验
因为外接设备的电脑驱动服务次要是通过websocket
进行数据交互的,所以须要在一开始通过webSocket.OPEN去验证websocket以后浏览器与驱动/设施是否失常连贯中,如没连贯上进行提醒并中断以后的操作。
当然在校验的时候须要重置(初始化)外接设备、领取状态、定时器。
开始领取
获取领取的一些参数并通过接口(getPayStatus)
获取到领取的url链接,调用openQRcode
传递链接到外接设备上,显示出二维码进行领取(这里能够应用qrcode的js库转成二维码图片跳转页面的模式显示出二维码)。
在这里是调用openQRcode
办法只是个举例,外接设备个别都会有提供本人驱动以及对接驱动的js,依照本人的理论状况来。
领取中(轮询)
当二维码胜利显示后立刻调用queryStatus()
利用获取到的订单号为参数进入一个领取状态的查问(应用setTimeout
轮询)queryStatus
外部是一个没通过包装的申请,当申请返回payStatus示意以后未领取实现,或在领取中,否则为领取胜利。
每隔3秒轮询一次(尾递归queryStatus
获取领取状态 胜利
or 失败
):
window.pollTimer = setTimeout(() => {
return queryStatus(); //轮询查问领取状态3s
}, 3000)
在queryStatus中的申请应用了axios
,是因为这里的post包装申请pending过程中主动加上了“加载中。。。”的全屏界面动画,因为轮询是一直进行的不能显示加载动画,否则会造成每次获取状态都会始终呈现加载动画敞开/显示的闪屏成果,所以这里应用原生axios
领取实现
领取胜利后就进行提醒,达成递归终止条件,革除掉计时器,重置领取的状态。最初5s计时器是为了给个小提早,避免设施上领取胜利后就秒关掉了界面 ,没有显示领取胜利的问题
if ((res.payStatus == 2) || (res.payStatus == 1)) { //领取胜利,敞开弹窗
that.paySucceed = true;
window.pollTimer && window.clearTimeout(window.pollTimer);
//领取胜利后干些事件。。。
setTimeout(() => {
that.common.cancelAll();
that.resetPay();
}, 5000)
}
payWayChange (val) {
//革除计时器轮询状态
clearTimeout(window.pollTimer);
window.pollTimer = null;
if (webSocket.readyState != webSocket.OPEN) {
this.$message({
message: '请正确连贯设施或设施驱动未启动,请查看',
type: 'error'
});
this.resetPay();
return;
}
this.common.cancelAll(); //敞开电子屏领取页
//参数
let params = {
type: val === 'wechat' ? 'WeChatPay' : 'AliPay',
data: {
paymentType:1,
id:'123',
payMoney: '30.0',
payWay: this.payWay,
}
}
let that = this;
function queryStatus () {
window.clearTimeout(window.pollTimer)
axios({//应用axios,不显示加载中提醒
method: 'post',
url: 'getPayStatus',
withCredentials: true,
timeout: 0,
hideLoading: true,
headers: {
"Content-Type": "application/json;charset=UTF-8",
"token": sessionStorage.getItem('token')
},
data: {
typeCode: val === 'wechat' ? 'WeChat' : 'ali',
token: sessionStorage.getItem('token'),
data: {
order: params.order,
}
},
}).then((res) => {
if (res.payStatus == 0) {
window.pollTimer = setTimeout(() => {
return queryStatus(); //轮询查问领取状态3s
}, 3000)
}
if ((res.payStatus == 2) || (res.payStatus == 1)) { //领取胜利,敞开弹窗
that.paySucceed = true;
window.pollTimer && window.clearTimeout(window.pollTimer)
//领取胜利后干些事件。。。
setTimeout(() => {
that.common.cancelAll();
that.resetPay();
}, 5000)
}
})
}
that.post({
params,//参数
})
.then(res => { //获取领取链接和订单信息
params = params.data;
params.order = res.order;
window.delayTimer = null;
window.clearTimeout(window.delayTimer);
window.delayTimer = setTimeout(() => {
//关上领取二维码
this.common.openQRcode(encodeURI(JSON.stringify(params)) ,encodeURI(res.url))
}, 1000);
queryStatus();//开始轮询领取的状态
});
},
resetPay () {
this.paySucceed = false;
window.pollTimer && window.clearTimeout(window.pollTimer); //革除计时器轮询状态
},
发表回复