当前位置:   article > 正文

Vue + Element 前端调用后端接口获取微信支付二维码和支付宝支付二维码_前端支付二维码

前端支付二维码

一、效果图

二、具体实现

1、安装一个转换二维码的插件 qrcodejs2(适用于微信二维码生成)

npm install qrcodejs2 --save

2、在需要使用该插件的 Vue 文件中引入

import QRCode from 'qrcodejs2';

3、接下来编写代码实现,在表格点击“支付”按钮,跳出支付弹窗,有微信支付和支付宝支付的两种方式按钮选择,当点击某个方式会跳出相应的二维码,并设置定时器去查询支付状态是否支付成功。更多内容看代码里的注释(这里给出这部分的相关代码,无关内容的代码没有给出)

HTML 部分(支付宝二维码生成直接用 iframe 标签):

  1. <!-- 表格操作列 -->
  2. <el-table-column label="操作" width="160" align="center">
  3. <template slot-scope="scope">
  4. <!-- 这里是项目需要做的判断,读者自行判断,当订单状态为待付款(scope.row.status = 0)和订单金额大于 0 时(scope.row.totalAmount > 0)才有支付按钮 -->
  5. <el-button type="text" @click="openPayDialog(scope.row)" v-if="scope.row.status === 0 && scope.row.totalAmount > 0">支付</el-button>
  6. </template>
  7. </el-table-column>
  1. <!-- 支付弹窗 -->
  2. <el-dialog
  3. title="支付"
  4. :visible.sync="modal3"
  5. width="20%"
  6. :before-close="closePayDialog">
  7. <!-- 支付方式选择,按钮显示 -->
  8. <div class="pay-dialog-body" v-if="payBtn">
  9. <p>请选择支付方式:</p>
  10. <el-button type="primary" size="small" @click="handlePayWxQRcode(payInfoRow)">微信支付</el-button>
  11. <el-button type="primary" size="small" @click="handlePayAliQRcode(payInfoRow)">支付宝支付</el-button>
  12. </div>
  13. <!-- 支付方式选择完成,按钮消失 -->
  14. <div v-else>
  15. <div>
  16. 使用
  17. <span v-if="payForWx" class="pay-for-method-1">微信</span>
  18. <span v-if="payForAli" class="pay-for-method-2">支付宝</span>
  19. 扫一扫二维码进行支付
  20. </div>
  21. <!-- 微信支付二维码 -->
  22. <div id="qrcodeImg"></div>
  23. <!-- 支付宝支付二维码 -->
  24. <iframe
  25. v-if="payForAli"
  26. :srcdoc="payAliQRcode"
  27. frameborder="no"
  28. border="0"
  29. marginwidth="10"
  30. marginheight="10"
  31. scrolling="no"
  32. width="220"
  33. height="220"
  34. style="overflow: hidden;">
  35. </iframe>
  36. <div>注:若二维码过期失效,请刷新页面重新进入支付!</div>
  37. </div>
  38. <span slot="footer">
  39. <el-button @click="closePayDialog" size="small">返回</el-button>
  40. </span>
  41. </el-dialog>

JavaScript 部分:

  1. <script>
  2. import QRCode from 'qrcodejs2';
  3. export default {
  4. data(){
  5. return{
  6. modal3: false, // 是否打开支付弹窗
  7. payBtn: true, // 是否显示方式选择按钮
  8. payInfoRow: {}, // 该条订单数据
  9. payForWx: false, // 是否微信支付
  10. payForAli: false, // 是否支付宝支付
  11. timer: '', // 定时器
  12. payAliQRcode: '', // 支付宝codeURL
  13. }
  14. },
  15. methods: {
  16. qrcode(url) { // 前端根据 URL 生成微信支付二维码
  17. return new QRCode('qrcodeImg', {
  18. width: 100,
  19. height: 100,
  20. text: url,
  21. colorDark: '#000',
  22. colorLight: '#fff'
  23. });
  24. },
  25. openPayDialog(row){ // 打开支付窗口
  26. this.modal3 = true;
  27. this.payBtn = true; // 显示支付方式选择按钮
  28. this.payForWx = false;
  29. this.payForAli = false;
  30. this.payInfoRow = row; // 获取该条订单数据
  31. },
  32. closePayDialog(){ // 关闭支付窗口
  33. this.modal3 = false;
  34. this.payBtn = true;
  35. this.payForWx = false;
  36. this.payForAli = false;
  37. clearInterval(this.timer); // 清除定时器
  38. },
  39. handlePayWxQRcode(row){ // 获取微信支付二维码
  40. this.$api.order.getWxPayCode({ // 这里根据不同的后端接口去修改
  41. totalFee: row.totalAmount * 100,
  42. outTradeNo: row.orderSn,
  43. }).then(res => {
  44. this.payBtn = false;
  45. this.qrcode(res.data.url); // 例如:res.data.url 的值为 "weixin://wxpay/bizpayurl?pr=......",根据这个值生成相对应的微信支付二维码
  46. this.payForWx = true;
  47. this.timer = setInterval(() => { // 通过定时器每间隔一会去请求查询微信支付状态(具体参数根据项目需要而定)
  48. this.handleQueryWxPayStatus(row, res.data.outTradeNo);
  49. }, 1000);
  50. })
  51. },
  52. handleQueryWxPayStatus(row, sn){ // 查询微信支付状态
  53. this.$api.order.queryWxPayStatus({ // 这里根据不同的后端接口去修改
  54. totalFee: row.totalAmount * 100,
  55. outTradeNo: sn,
  56. }).then(res => {
  57. if(res.data.paySuccess){ // 当查询到支付成功时
  58. this.$message({
  59. type: 'success',
  60. message: '支付成功!'
  61. });
  62. this.closePayDialog(); // 关闭支付弹窗
  63. // 这里可以加个刷新订单列表的接口请求函数的调用
  64. }
  65. })
  66. },
  67. handlePayAliQRcode(row){ // 获取支付宝支付二维码
  68. this.$api.order.getAliPayCode({ // 这里根据不同的后端接口去修改
  69. totalAmount: row.totalAmount,
  70. outTradeNo: row.orderSn,
  71. }).then(res => {
  72. this.payBtn = false;
  73. this.payAliQRcode = res.data.url; // 支付宝的二维码生成用 iframe 标签
  74. this.payForAli = true;
  75. this.timer = setInterval(() => { // 通过定时器每间隔一会去请求查询支付宝支付状态(具体参数根据项目需要而定)
  76. this.handleQueryAliPayStatus(row, res.data.outTradeNo);
  77. }, 1000);
  78. });
  79. },
  80. handleQueryAliPayStatus(row ,sn){ // 查询支付宝支付状态
  81. this.$api.order.queryAliPayStatus({ // 这里根据不同的后端接口去修改
  82. totalAmount: row.totalAmount,
  83. outTradeNo: sn,
  84. }).then(res => {
  85. if(res.data.paySuccess){ // 当查询到支付成功时
  86. this.$message({
  87. type: 'success',
  88. message: '支付成功!'
  89. });
  90. this.closePayDialog(); // 关闭支付弹窗
  91. // 这里可以加个刷新订单列表的接口请求函数的调用
  92. }
  93. });
  94. },
  95. },
  96. beforeDestroy(){
  97. clearInterval(this.timer);
  98. }
  99. }
  100. </script>

CSS 部分:

  1. <style>
  2. .pay-dialog-body p{
  3. margin-bottom: 10px;
  4. }
  5. #qrcodeImg{
  6. margin: 10px;
  7. }
  8. .pay-for-method-1{
  9. font-weight: bold;
  10. color: #67c23a;
  11. }
  12. .pay-for-method-2{
  13. font-weight: bold;
  14. color: #409eff;
  15. }
  16. </style>

参考:https://www.cnblogs.com/wangyan0926/p/14473859.html

这是我本人在工作学习中遇到的,同时也分享出来给需要的小伙伴哈 ~ 供参考学习,有什么建议也欢迎评论留言,转载请注明出处哈,感谢支持!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号