当前位置:   article > 正文

微信支付-Native支付(网页二维码扫码微信支付)简单示例_网页扫码支付功能

网页扫码支付功能

目录

概述

 界面展示 & 前端代码(Vue)

后端实现(SpringBoot)

 Maven依赖 

 下单接口(主要功能代码)

支付成功回调接口

测试(后端线上环境)


概述

本篇博文主要演示和说明网页扫码实现微信支付的功能。

Native支付?

Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。

使用前提?

已注册成为微信商户,在微信商户平台开通"Native支付",获取API证书和API密匙等参数,如果对于注册微信商户有所疑惑,请看博文:http://t.csdn.cn/BCecm,博文有讲解从零到商户的注册过程要求说明。

主要流程概述

Native支付的流程很简单,主要为:

1.前端传入金额等参数。

2.后端拿着参数向微信服务器创建预支付订单,取回一个支付地址,传回前端。

3.前端拿着支付地址生成二维码,微信扫码完成支付。

 界面展示 & 前端代码(Vue

关于支付地址转为二维码

在此使用的是QRCode,使用方式很简单,导入,声明二维码放置节点元素,实例化QRCode生成二维码。具体使用方式看示例代码,或文档地址:

github地址

中文使用说明地址

js文件地址

输入金额,点击"捐助",调用后端接口获取支付地址,生成支付二维码。

  1. <template>
  2. <div id="container">
  3. <!-- 图片 -->
  4. <div id="imgJuan"></div>
  5. <!-- 表单 -->
  6. <div id="input_box"><input type="text" id="my_input" v-model="total" :placeholder="iptText"><button @click="payHandle">捐助</button></div>
  7. <!-- 占位 -->
  8. <div style="height: 10px;"></div>
  9. <!-- 二维码 -->
  10. <div id="qrcode" ref="qrCodeBox" v-show="showFlag"></div>
  11. </div>
  12. </template>
  13. <script setup>
  14. import { ref, onMounted, getCurrentInstance } from "vue"
  15. import axios from "axios";
  16. // 获取二维码盒子节点(如下两种方式均可)
  17. // 方式一、获取当前组件实例,通过实例获取节点
  18. const { proxy } = getCurrentInstance()
  19. // 方式二、通过ref获取节点
  20. const qrCodeBox = ref(null);
  21. // 支付二维码显示控制
  22. let showFlag = ref(false);
  23. // 输入框内容
  24. const iptText = "请输入捐助金额(元)"
  25. // 输入金额
  26. let total = ref('');
  27. // 触发下单支付
  28. async function payHandle(){
  29. // 将金额单位转为分
  30. let total_F = parseFloat(total.value) * 100
  31. // 发送请求,获取支付地址
  32. const res = await axios.get(`http://后端接口地址/pay/nativePay?total=${total_F}`);
  33. console.log(res.data);
  34. // 将支付地址转为二维码,显示(QRCode参数为(二维码展示的盒子节点元素,显示的内容))
  35. // 这是vue项目,我将QRCode.min.js文件下载并在index.html引入了,因此在此文件看不到引入
  36. const qrObj = new QRCode(qrCodeBox.value, res.data);
  37. showFlag.value = true;
  38. }
  39. </script>
  40. <style scoped>
  41. #container {
  42. border: solid red 1px;
  43. border-radius: 10px;
  44. /* width: fit-content; */
  45. width: 600px;
  46. margin: 0 auto;
  47. overflow: hidden;
  48. }
  49. #qrcode{
  50. display: flex;
  51. justify-content: center;
  52. align-items: center;
  53. padding: 10px 0px;
  54. }
  55. button {
  56. border: none;
  57. background-color: #ce5944;
  58. color: white;
  59. font-weight: 600;
  60. height: 37px;
  61. width: 90px;
  62. position: relative;
  63. top: 1px;
  64. margin-left: 5px;
  65. border-radius: 5px;
  66. cursor: pointer;
  67. }
  68. button:hover{
  69. background-color: #d14e37;
  70. }
  71. #imgJuan {
  72. /* border: solid red 1px; */
  73. height: 300px;
  74. width: 100%;
  75. background: url("/juan.jpg") no-repeat center center;
  76. background-size: cover;
  77. border-radius: 5px;
  78. }
  79. #input_box {
  80. width: fit-content;
  81. margin: 0 auto;
  82. margin-top: 20px;
  83. }
  84. #my_input {
  85. border-radius: 3px;
  86. border: solid 1px #1c591f;
  87. height: 32px;
  88. width: 268px;
  89. padding-left: 5px;
  90. }
  91. </style>

后端实现(SpringBoot)

说明:在此,后端仅编写展示两个接口:"下单接口","支付回调接口"

 接口皆是根据官方SDK API文档实现,如果想要获取更多接口信息,例如"查单接口",请查看官网文档示例地址:微信Native支付及接口描述 & JavaSDK示例(githup地址)

 Maven依赖 

  1. <dependency>
  2. <groupId>com.github.wechatpay-apiv3</groupId>
  3. <artifactId>wechatpay-java</artifactId>
  4. <version>0.2.11</version>
  5. </dependency>

 使用官方提供的Java SDK,文档地址:微信支付 Java SDK

 下单接口(主要功能代码)

  1. /**
  2. * Native支付下单,获取支付地址
  3. * @param total 金额
  4. * @return 支付地址,前端用于生成支付二维码
  5. */
  6. public String nativePay(Integer total){
  7. // 使用自动更新平台证书的RSA配置
  8. Config config =
  9. new RSAAutoCertificateConfig.Builder()
  10. .merchantId(merchantId) // 商户号
  11. .privateKeyFromPath(NativeUtil.getResourcesPath() + "apiclient_key.pem") // API证书地址(此处的路径自己调试一下,能找到就行)
  12. .merchantSerialNumber(merchantSerialNumber) // API证书序列号
  13. .apiV3Key(apiV3Key) // API密匙
  14. .build();
  15. // 构建service
  16. NativePayService service = new NativePayService.Builder().config(config).build();
  17. // request.setXxx(val)设置所需参数,具体参数可见Request定义
  18. PrepayRequest request = new PrepayRequest();
  19. Amount amount = new Amount();
  20. amount.setTotal(total); // 金额
  21. request.setAmount(amount);
  22. request.setAppid(appId); // 应用ID
  23. request.setMchid(merchantId); // 商户号
  24. request.setDescription("Native测试商品标题"); // 商品描述
  25. request.setNotifyUrl("http://后端地址/pay/notifyNative"); // 支付成功的回调地址
  26. // 生成模拟系统内部订单号(yyyyMMddHHmmssSSS)
  27. request.setOutTradeNo(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN)); // 自己后端的唯一订单号,此处使用时间模拟
  28. // 调用下单方法,得到应答
  29. try {
  30. // 发送请求
  31. PrepayResponse response = service.prepay(request);
  32. // 使用微信扫描 code_url 对应的二维码,即可体验Native支付
  33. System.out.println(response.getCodeUrl());
  34. // 将支付地址返回
  35. return response.getCodeUrl();
  36. }catch (Exception e){
  37. System.out.println(e.getMessage());
  38. return e.getMessage();
  39. }
  40. }

支付成功回调接口

回调地址?

回调地址为:当前端生成的二维码被微信扫描并成功支付之后,微信服务器会将支付的信息发送到这个地址上。如有疑惑,文档地址:支付通知

  1. /**
  2. * 成功支付的回调
  3. * @param request ·
  4. * @param response ·
  5. * @throws IOException ·
  6. */
  7. public void notifyNative(HttpServletRequest request, HttpServletResponse response) throws IOException {
  8. // 获取请求体原内容(此时获取的数据是加密的)
  9. BufferedReader reader = request.getReader();
  10. StringBuilder requestBody = new StringBuilder();
  11. String line;
  12. while ((line = reader.readLine()) != null) {
  13. requestBody.append(line);
  14. }
  15. // 获取请求携带的数据,构造参数
  16. RequestParam requestParam = new RequestParam.Builder()
  17. .serialNumber(request.getHeader("Wechatpay-Serial")) // 微信支付平台证书的序列号
  18. .nonce(request.getHeader("Wechatpay-Nonce")) // 签名中的随机数
  19. .signature(request.getHeader("Wechatpay-Signature")) // 应答的微信支付签名
  20. .timestamp(request.getHeader("Wechatpay-Timestamp")) // 签名中的时间戳
  21. .body(requestBody.toString()) // 请求体内容(原始内容,不要解析)
  22. .build();
  23. // 初始化RSAAutoCertificateConfig
  24. NotificationConfig config = new RSAAutoCertificateConfig.Builder()
  25. .merchantId(merchantId) // 商户号
  26. // API证书路径,路径自己调试,能找到就行(NativeUtil为自定义工具类)
  27. .privateKeyFromPath(NativeUtil.getResourcesPath() + "apiclient_key.pem")
  28. .merchantSerialNumber(merchantSerialNumber) // 证书序列号
  29. .apiV3Key(apiV3Key) // APIV3密匙
  30. .build();
  31. // 初始化 NotificationParser
  32. NotificationParser parser = new NotificationParser(config);
  33. // 解析为Transaction对象(解密数据)
  34. Transaction transaction = parser.parse(requestParam, Transaction.class);
  35. // 获取支付单号
  36. log.info("支付成功,回调信息:{}", transaction);
  37. // 打印其中的"微信支付单号"字段,可用于查单操作
  38. log.info("微信支付单号:{}", transaction.getTransactionId());
  39. }

测试(后端线上环境)

测试内容

1.前端输入金额,点击【捐助】按钮,查看是否显示支付二维码。

2.微信扫码支付,查看回到接口是是否被调用,查看控制台输出。

 访问  

 输入金额,点击【捐助】

 微信扫码支付 

 

 查看控制台 

 至此,测试完毕。 

最后

此博文仅展示了从二维码到支付成功的过程,至于后续处理,如成功支付之后"如何通知前端页面做修改",这类后续处理需要读者根据自己实际情况进行处理,例如使用轮询还是WebSocket这类方式检查支付状态,都是没问题的。

最后,如文章有不足之处请指出,感谢访问。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/874137
推荐阅读
相关标签
  

闽ICP备14008679号