内容简介:收营员选择收款方式(现金/支付宝/微信),如果是支付宝/微信,服务端会传给前端一个交易码,前端用1.简介我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
收营员选择收款方式(现金/支付宝/微信),如果是支付宝/微信,服务端会传给前端一个交易码,前端用 qrcode 生成二维码给客户扫并且支付, websocket 建立持久的连接直到收到服务端返回的true,前端提示交易成功。
HTML5 WebSocket
1.简介
我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?
答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起。
举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。
这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用”轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。
轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket 就是这样发明的。
2.使用
http://jsbin.com/muqamiqimu/edit?js,console
var ws = new WebSocket("wss://echo.websocket.org");
ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
};
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
};
ws.onclose = function(evt) {
console.log("Connection closed.");
};
qrcode-vue
https://www.npmjs.com/package/qrcode-vue
1.安装
npm install –save qrcode.vue
2.使用
<template>
<div>
<qrcode-vue
:size="size"
:value="value"
:logo="logo"
:bgColor="bgColor"
:fgColor="fgColor"
></qrcode-vue>
</div>
</template>
<script>
import qrcodeVue from '../src/qrcode-vue'
export default {
data () {
return {
size: 128,
bgColor: '#fff',
fgColor: '#000',
value: 'https://github.com/l-ll/qrcode-vue',
logo: 'https://avatars3.githubusercontent.com/u/7104141?v=3&s=80'
}
},
components: {
qrcodeVue
}
}
</script>
在线支付场景实例
<style lang="less">
@import '../../styles/common.less';
.pay-template {
.title {
font-size: 18px;
font-weight: 700;
}
.orderInfo {
.payType {
width: 200px
}
canvas {
border-radius: 4px;
}
}
.footer {
text-align: right;
.submit {
margin-left: 5px;
}
}
}
</style>
<template>
<div class="pay-template">
<Spin size="large" fix v-if="spinShow"></Spin>
<p slot="header">
<span class="title">付款 {{orderInfo.orderNo}}</span>
</p>
<div class="orderInfo">
<p>订单类型:{{orderInfo.orderType|orderType}}</p>
<p>订单金额:{{orderInfo.totalAmount|money}}</p>
<p>优惠金额:{{orderInfo.totalAmount - orderInfo.finalAmount|money}}</p>
<p>实付金额:
<span>{{orderInfo.finalAmount|money}}</span>
</p>
<p>支付方式:
<Select class="payType" v-model="orderInfo.payType">
<Option value="CASH">现金</Option>
<Option value="WECHAT">微信</Option>
<Option value="ALIPAY">支付宝</Option>
</Select>
</p>
<p style="text-align: center" v-if="orderInfo.payType!='CASH' && message!==''">{{message}}</p>
<qr-code-vue v-if="orderInfo.payType!='CASH'&&message===''&&qrCodeValue!==''" style="text-align: center;"
:value="qrCodeValue" size="150" level="H"></qr-code-vue>
</div>
<div class="footer" slot="footer">
<Button type="ghost" @click="$emit('emitCloseDialog')">取消</Button>
<Button class="submit" v-if="orderInfo.payType=='CASH'" type="primary"
@click="handleSureOrder">
确定
</Button>
</div>
</div>
</template>
<script>
import {
getQrCode,
sureOrder
} from '../../api/retail'
import QrCodeVue from 'qrcode.vue'
export default {
props: ['orderInfo', 'orderShow'],
data() {
return {
message: '',
qrCodeValue: '',
spinShow: false
}
},
components: {
QrCodeVue
},
watch: {
'orderInfo.payType'(type) {
this.makeQrCode(type)
},
orderShow(flag) {
if (flag) {
this.webSocketInit()
} else {
this.webSocketClose()
}
}
},
methods: {
makeQrCode(type) {
let _this = this
if (type !== 'CASH') {
_this.spinShow = true
return new Promise((resolve, reject) => {
getQrCode({
orderId: _this.orderInfo.id,
payType: type
}).then(response => {
_this.spinShow = false
if (response.status === 200) {
_this.qrCodeValue = response.data
_this.message = ''
} else {
_this.message = response.message
}
resolve(response)
}).catch(error => {
_this.qrCodeValue = ''
_this.message = ''
_this.spinShow = false
reject(error)
})
})
}
},
handleSureOrder() {
let _this = this
_this.spinShow = true
return new Promise((resolve, reject) => {
sureOrder({
orderNo: _this.orderInfo.orderNo,
id: _this.orderInfo.id,
payType: _this.orderInfo.payType
}).then(response => {
_this.spinShow = false
if (response.status && response.status === 200) {
_this.$Notice.success({
title: '付款成功通知',
desc: '订单' + _this.orderInfo.orderNo + '付款成功',
duration: 3
})
_this.$emit('emitCloseDialog')
_this.$store.commit('RELOAD')
} else {
_this.$Notice.error({
title: response.message,
desc: '订单' + _this.orderInfo.orderNo + '付款失败',
duration: 3
})
}
resolve(response)
}).catch(error => {
_this.spinShow = false
reject(error)
})
})
},
webSocketInit() {
if ('WebSocket' in window) {
this.websock = new WebSocket("ws://xxxxxxxxxxxxxxxxxxxx")
this.websock.onopen = this.webSocketOnOpen
this.websock.onmessage = this.webSocketOnMessage
this.websock.onerror = this.webSocketOnError
this.websock.onclose = this.webSocketClose
} else {
alert('Not support websocket')
}
},
webSocketOnOpen(event) {
console.log('websocket open')
},
webSocketOnMessage(event) {
if (event.data) {
this.$Notice.success({
title: '付款成功通知',
desc: '订单' + this.orderInfo.orderNo + '付款成功',
duration: 3
})
this.$emit('emitCloseDialog')
this.$store.commit('reloadOrder')
}
},
webSocketOnError(event) {
this.$Message.error("websocket 连接失败")
},
webSocketClose(event) {
console.log('websocket close')
}
}
}
</script>
深自缄默,如云漂泊 本文链接: http://zc95.github.io/2018/08/16/qrcodeAndWebsocket/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- IJPay 0.5 让支付触手可及,已完成微信支付,支付宝支付
- 支付宝支付参数获取
- PHP 支付类库 PaySDK v1.0.9 新增支付宝 APP 支付
- ThinkPHP之银联支付(网页支付)
- YunGouOS 个人支付接口 2.0.5 版本发布,个人支付宝 H5、APP 支付上线
- ThinkPHP之微信支付(扫码支付)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
How to Design Programs
Matthias Felleisen、Robert Bruce Findler、Matthew Flatt、Shriram Krishnamurthi / The MIT Press / 2001-2-12 / 71.00美元
This introduction to programming places computer science in the core of a liberal arts education. Unlike other introductory books, it focuses on the program design process. This approach fosters a var......一起来看看 《How to Design Programs》 这本书的介绍吧!