Skip to content

Commit a42c1cb

Browse files
committed
pay:前端收银台接入支付宝扫码
1 parent 7eb084b commit a42c1cb

File tree

4 files changed

+9894
-9508
lines changed

4 files changed

+9894
-9508
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
"jsencrypt": "3.3.1",
5858
"min-dash": "3.5.2",
5959
"nprogress": "0.2.0",
60+
"qrcode.vue": "^1.7.0",
6061
"quill": "1.3.7",
6162
"screenfull": "5.0.2",
6263
"sortablejs": "1.10.2",

src/api/pay/order.js

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,5 @@
11
import request from '@/utils/request'
22

3-
// 创建支付订单
4-
export function createOrder(data) {
5-
return request({
6-
url: '/pay/order/create',
7-
method: 'post',
8-
data: data
9-
})
10-
}
11-
12-
// 更新支付订单
13-
export function updateOrder(data) {
14-
return request({
15-
url: '/pay/order/update',
16-
method: 'put',
17-
data: data
18-
})
19-
}
20-
213
// 删除支付订单
224
export function deleteOrder(id) {
235
return request({
@@ -42,6 +24,15 @@ export function getOrderDetail(id) {
4224
})
4325
}
4426

27+
// 提交支付订单
28+
export function submitOrder(data) {
29+
return request({
30+
url: '/pay/order/submit',
31+
method: 'post',
32+
data: data
33+
})
34+
}
35+
4536
// 获得支付订单分页
4637
export function getOrderPage(query) {
4738
return request({

src/views/pay/order/submit.vue

Lines changed: 80 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
</el-descriptions>
1313
</el-card>
1414

15-
<!-- 微信支付 -->
15+
<!-- 支付选择框 -->
1616
<el-card style="margin-top: 10px">
1717
<!-- 支付宝 -->
1818
<el-descriptions title="选择支付宝支付">
1919
</el-descriptions>
2020
<div class="pay-channel-container">
21-
<div class="box" v-for="channel in aliPayChannels" :key="channel.code">
21+
<div class="box" v-for="channel in aliPayChannels" :key="channel.code" @click="submit(channel.code)">
2222
<img :src="icons[channel.code]">
2323
<div class="title">{{ channel.name }}</div>
2424
</div>
@@ -40,16 +40,24 @@
4040
</div>
4141
</div>
4242
</el-card>
43+
44+
<!-- 支付二维码 -->
45+
<el-dialog :title="qrCode.title" :visible.sync="qrCode.visible" width="350px" append-to-body
46+
:close-on-press-escape="false">
47+
<qrcode-vue :value="qrCode.url" size="310" level="H" />
48+
</el-dialog>
4349
</div>
4450
</template>
4551
<script>
52+
import QrcodeVue from 'qrcode.vue'
4653
import { DICT_TYPE, getDictDatas } from "@/utils/dict";
47-
import { getOrder } from '@/api/pay/order';
48-
import { PayOrderStatusEnum } from "@/utils/constants";
54+
import { getOrder, submitOrder } from '@/api/pay/order';
55+
import { PayChannelEnum, PayOrderStatusEnum } from "@/utils/constants";
4956
5057
export default {
5158
name: "PayOrderSubmit",
5259
components: {
60+
QrcodeVue,
5361
},
5462
data() {
5563
return {
@@ -69,6 +77,12 @@ export default {
6977
wx_pub: require("@/assets/images/pay/icon/wx_pub.svg"),
7078
mock: require("@/assets/images/pay/icon/mock.svg"),
7179
},
80+
qrCode: { // 支付二维码
81+
url: '',
82+
title: '',
83+
visible: false,
84+
},
85+
interval: undefined, // 定时任务,轮询是否完成支付
7286
};
7387
},
7488
created() {
@@ -94,32 +108,90 @@ export default {
94108
}
95109
}
96110
},
97-
/** 获得请假信息 */
111+
/** 获得支付信息 */
98112
getDetail() {
99113
// 1.1 未传递订单编号
100114
if (!this.id) {
101115
this.$message.error('未传递支付单号,无法查看对应的支付信息');
102-
this.$router.go(-1);
116+
this.goBackToList();
103117
return;
104118
}
105119
getOrder(this.id).then(response => {
106120
// 1.2 无法查询到支付信息
107121
if (!response.data) {
108122
this.$message.error('支付订单不存在,请检查!');
109-
this.$router.go(-1);
123+
this.goBackToList();
110124
return;
111125
}
112126
// 1.3 订单已支付
113127
if (response.data.status !== PayOrderStatusEnum.WAITING.status) {
114128
this.$message.error('支付订单不处于待支付状态,请检查!');
115-
this.$router.go(-1);
129+
this.goBackToList();
116130
return;
117131
}
118132
119133
// 2. 可以展示
120134
this.payOrder = response.data;
121135
});
122136
},
137+
/** 提交支付 */
138+
submit(channelCode) {
139+
submitOrder({
140+
id: this.id,
141+
channelCode: channelCode
142+
}).then(response => {
143+
// 不同的支付,调用不同的策略
144+
if (channelCode === PayChannelEnum.ALIPAY_QR.code) {
145+
this.submitAfterAlipayQr(response.data.invokeResponse)
146+
}
147+
// 打开轮询任务
148+
this.createQueryInterval()
149+
})
150+
},
151+
/** 提交支付后(支付宝扫码支付) */
152+
submitAfterAlipayQr(invokeResponse) {
153+
this.qrCode = {
154+
title: '请使用支付宝“扫一扫”扫码支付',
155+
url: invokeResponse.qrCode,
156+
visible: true
157+
}
158+
},
159+
/** 轮询查询任务 */
160+
createQueryInterval() {
161+
this.interval = setInterval(() => {
162+
getOrder(this.id).then(response => {
163+
// 已支付
164+
if (response.data.status === PayOrderStatusEnum.SUCCESS.status) {
165+
this.clearQueryInterval();
166+
this.$message.success('支付成功!');
167+
this.goBackToList();
168+
}
169+
// 已取消
170+
if (response.data.status === PayOrderStatusEnum.CLOSED.status) {
171+
this.clearQueryInterval();
172+
this.$message.error('支付已关闭!');
173+
this.goBackToList();
174+
}
175+
})
176+
}, 1000 * 2)
177+
},
178+
/** 清空查询任务 */
179+
clearQueryInterval() {
180+
// 清空各种弹窗
181+
this.qrCode = {
182+
title: '',
183+
url: '',
184+
visible: false
185+
}
186+
// 清空任务
187+
clearInterval(this.interval)
188+
this.interval = undefined
189+
},
190+
/** 回到列表 **/
191+
goBackToList() {
192+
this.$tab.closePage();
193+
this.$router.go(-1);
194+
}
123195
}
124196
};
125197
</script>

0 commit comments

Comments
 (0)