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

目录

概述

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

后端实现(SpringBoot)

 Maven依赖 

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

支付成功回调接口

测试(后端线上环境)


概述

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

Native支付?

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

使用前提?

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

主要流程概述

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

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

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

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

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

关于支付地址转为二维码

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

github地址

中文使用说明地址

js文件地址

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

<template><div id="container"><!-- 图片 --><div id="imgJuan"></div><!-- 表单 --><div id="input_box"><input type="text" id="my_input" v-model="total" :placeholder="iptText"><button @click="payHandle">捐助</button></div><!-- 占位 --><div style="height: 10px;"></div><!-- 二维码 --><div id="qrcode" ref="qrCodeBox" v-show="showFlag"></div></div>
</template><script setup>
import { ref, onMounted, getCurrentInstance } from "vue"
import axios from "axios";// 获取二维码盒子节点(如下两种方式均可)
// 方式一、获取当前组件实例,通过实例获取节点
const { proxy } = getCurrentInstance()
// 方式二、通过ref获取节点
const qrCodeBox = ref(null);// 支付二维码显示控制
let showFlag = ref(false);// 输入框内容
const iptText = "请输入捐助金额(元)"// 输入金额
let total = ref('');// 触发下单支付
async function payHandle(){// 将金额单位转为分let total_F = parseFloat(total.value) * 100// 发送请求,获取支付地址const res = await axios.get(`http://后端接口地址/pay/nativePay?total=${total_F}`);console.log(res.data);// 将支付地址转为二维码,显示(QRCode参数为(二维码展示的盒子节点元素,显示的内容))// 这是vue项目,我将QRCode.min.js文件下载并在index.html引入了,因此在此文件看不到引入  const qrObj = new QRCode(qrCodeBox.value, res.data);showFlag.value = true;
}</script><style scoped>
#container {border: solid red 1px;border-radius: 10px;/* width: fit-content; */width: 600px;margin: 0 auto;overflow: hidden;
}#qrcode{display: flex;justify-content: center;align-items: center;padding: 10px 0px;
}button {border: none;background-color: #ce5944;color: white;font-weight: 600;height: 37px;width: 90px;position: relative;top: 1px;margin-left: 5px;border-radius: 5px;cursor: pointer;
}button:hover{background-color: #d14e37;}#imgJuan {/* border: solid red 1px; */height: 300px;width: 100%;background: url("/juan.jpg") no-repeat center center;background-size: cover;border-radius: 5px;
}#input_box {width: fit-content;margin: 0 auto;margin-top: 20px;
}#my_input {border-radius: 3px;border: solid 1px #1c591f;height: 32px;width: 268px;padding-left: 5px;
}
</style>

后端实现(SpringBoot)

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

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

 Maven依赖 

<dependency><groupId>com.github.wechatpay-apiv3</groupId><artifactId>wechatpay-java</artifactId><version>0.2.11</version>
</dependency>

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

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

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

支付成功回调接口

回调地址?

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

/*** 成功支付的回调* @param request ·* @param response ·* @throws IOException ·*/public void notifyNative(HttpServletRequest request, HttpServletResponse response) throws IOException {// 获取请求体原内容(此时获取的数据是加密的)BufferedReader reader = request.getReader();StringBuilder requestBody = new StringBuilder();String line;while ((line = reader.readLine()) != null) {requestBody.append(line);}// 获取请求携带的数据,构造参数RequestParam requestParam = new RequestParam.Builder().serialNumber(request.getHeader("Wechatpay-Serial")) // 微信支付平台证书的序列号.nonce(request.getHeader("Wechatpay-Nonce")) // 签名中的随机数.signature(request.getHeader("Wechatpay-Signature"))  // 应答的微信支付签名.timestamp(request.getHeader("Wechatpay-Timestamp")) // 签名中的时间戳.body(requestBody.toString()) // 请求体内容(原始内容,不要解析).build();// 初始化RSAAutoCertificateConfigNotificationConfig config = new RSAAutoCertificateConfig.Builder().merchantId(merchantId) // 商户号// API证书路径,路径自己调试,能找到就行(NativeUtil为自定义工具类).privateKeyFromPath(NativeUtil.getResourcesPath() + "apiclient_key.pem") .merchantSerialNumber(merchantSerialNumber) // 证书序列号.apiV3Key(apiV3Key) // APIV3密匙.build();// 初始化 NotificationParserNotificationParser parser = new NotificationParser(config);// 解析为Transaction对象(解密数据)Transaction transaction = parser.parse(requestParam, Transaction.class);// 获取支付单号log.info("支付成功,回调信息:{}", transaction);// 打印其中的"微信支付单号"字段,可用于查单操作log.info("微信支付单号:{}", transaction.getTransactionId());}

测试(后端线上环境)

测试内容

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

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

 访问  

 输入金额,点击【捐助】

 微信扫码支付 

 

 查看控制台 

 至此,测试完毕。 

最后

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云新用户有哪些优惠政策和专属活动?

腾讯云作为中国领先的云计算服务提供商&#xff0c;一直在为用户提供优质、高效且具有竞争力的服务。对于新用户&#xff0c;腾讯云更是诚意满满&#xff0c;推出了一系列优惠政策和专属活动。本文将详细介绍腾讯云新用户的优惠政策和专属活动&#xff0c;帮助大家更好地了解如…

【算法专题突破】滑动窗口 - 长度最小的子数组(9)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;Leetcode&#xff09; 要注意的是&#xff0c;题目给的是正整数&#xff0c; 而题目要求并不难理解&#xff0c;就是找最短的…

Python批处理(一)提取txt中数据存入excel

Python批处理&#xff08;一&#xff09;提取txt中数据存入excel 问题描述 现从冠层分析软件中保存了叶面积指数分析的结果&#xff0c;然而软件保存格式为txt&#xff0c;且在不同的文件夹中&#xff0c;每个文件夹的txt文件数量不固定&#xff0c;但是txt文件格式固定。现需…

PPT 架构师三板斧

PPT 架构师三板斧 目录概述需求&#xff1a; 设计思路实现思路分析1.多节点上PPT 架构师三板斧2.几张框框组合有组织3.专业词汇4.切记点要点 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;ski…

Android扫码连接WIFI实现

0&#xff0c;目标 APP中实现扫WIFI分享码自动连接WIFI功能 1&#xff0c;前提条件 设备需要有个扫码器&#xff08;摄像头拍照识别也行&#xff09;&#xff0c;APP调用扫码器读取WIFI连接分享码。 2&#xff0c;增加权限 在AndroidManifest.xml中增加权限 <uses-permissi…

接入 NVIDIA A100、吞吐量提高 10 倍!Milvus GPU 版本使用指南

Milvus 2.3 正式支持 NVIDIA A100&#xff01; 作为为数不多的支持 GPU 的向量数据库产品&#xff0c;Milvus 2.3 在吞吐量和低延迟方面都带来了显著的变化&#xff0c;尤其是与此前的 CPU 版本相比&#xff0c;不仅吞吐量提高了 10 倍&#xff0c;还能将延迟控制在极低的水准。…

golang flag 包的使用指北

说起 golang 的 flag 个包&#xff0c;我们第一反应的是什么呢&#xff1f;至少我曾经第一次看到 flag 包的时候&#xff0c;第一反应是想起写 C 语言的时候咱们用于定义一个表示的&#xff0c;我们一般会命名为 flag 变量 实际上 golang 的 flag 包是用于处理命令行参数的工具…

pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1+cu118 源码编译笔记【2】验证cuda安装 成功

接上篇 pytorch-v2.0.1 cuda arm64 aarch64 torch 2.0.1cu118 源码编译笔记_hkNaruto的博客-CSDN博客 由于采用/usr/local/bin/gcc编译&#xff0c;先设置LD_LIBRARY_PATH&#xff0c;再启动python3 export LD_LIBRARY_PATH/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/…

TrOCR – 基于 Transformer 的 OCR 入门指南

多年来,光学字符识别 (OCR) 出现了多项创新。它对零售、医疗保健、银行和许多其他行业的影响是巨大的。尽管有着悠久的历史和多种最先进的模型,研究人员仍在不断创新。与深度学习的许多其他领域一样,OCR 也看到了变压器神经网络的重要性和影响。如今,我们拥有像TrOCR(Tran…

图论-01-图的基本表示-邻接矩阵和邻接表-Java

文章目录 邻接矩阵邻接表邻接表的问题和改进总结 邻接矩阵 import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner;public class AdjMatrix {private int V;private int E;private int[][] adj;// 构造函数&#xff0c;从文…

App线上网络问题优化策略

在我们App开发过程中&#xff0c;网络是必不可少的&#xff0c;几乎很难想到有哪些app是不需要网络传输的&#xff0c;所以网络问题一般都是线下难以复现&#xff0c;一旦到了用户手里就会碰到很多疑难杂症&#xff0c;所以对于网络的监控是必不可少的&#xff0c;针对用户常见…

鸿蒙系列-如何使用DevEco分析app的性能

如何使用DevEco分析app的性能 性能优化、启动优化、内存优化、FPS监测、性能分析&#x1f9d0; 在鸿蒙OpenHarmony开发过程中&#xff0c;开发者开发的代码&#xff08;Stage 模型&#xff09;通常以调用 ArkUI 框架的代码为主&#xff0c;主要优化的代码部分也在其中&#x…

使用GPU虚拟化技术搭建支持3D设计的职校学生机房(云教室)

背景 学校为职业学校&#xff0c;计算机教室需要进行Maya、Adobe Illustrator、Adobe Dreamweaver、Adobe PhotoShop等软件的教学。每个教室为35用户。资源需求为4核、8G内存、80G硬盘。 基于桌面虚拟化VDI技术的机房在成本、可管理性方面&#xff0c;相对于传统胖终端的机房…

华为认证系统学习大纲及课程

前言 任何学习过程都需要一个科学合理的学习路线&#xff0c;才能够有条不紊的完成我们的学习目标。华为认证网络工程师所需学习的内容纷繁复杂&#xff0c;难度较大&#xff0c;所以今天特别为大家整理了一个全面的华为认证网络工程师学习大纲及课程&#xff0c;帮大家理清思…

更健康舒适更科技的照明体验!书客SKY护眼台灯SUKER L1上手体验

低价又好用的护眼台灯是多数人的需求&#xff0c;很多人只追求功能性护眼台灯&#xff0c;显色高、无频闪、无蓝光等基础需求。但是在较低价格中很难面面俱到&#xff0c;然而刚发布的SUKER书客L1护眼台灯却是一款不可多得的性价比护眼台灯&#xff0c;拥有高品质光源&#xff…

前端实现展开收起的效果 (react)

需求背景&#xff1a;需要实现文本的展开收起效果&#xff0c;文本是一行一行的&#xff0c;数据格式是数组结构。 如图所示&#xff08;图片已脱敏&#xff09; 简单实现&#xff1a;使用一个变量控制展开收起效果。 展开收起逻辑部分&#xff08;react&#xff09; const […

国际版腾讯云阿里云免费开户:全站加快 DCDN 重磅发布!打造新一代加快引擎

腾讯云全站加快 DCDN 重磅发布&#xff01;打造新一代加快引擎 在数字化转型革新逐渐深化的当下&#xff0c;安全高效成为企业上云、全球化布置的要害需求。 跟着运用场景复杂度不断提高、事务需求差异化开展&#xff0c;为了给企业供给更完善的安全加快服务&#xff0c;阿里云…

【Linux】VirtualBox安装Centos7

文章目录 下载并安装VirtualBox下载Centos镜像VirtualBox设置管理->全局设定&#xff1a;设定虚拟机默认安装路径工具->网络管理器&#xff1a;添加NetWork网络配置 VirtualBox安装CentOS7新建虚拟机&#xff0c;指定安装目录及名称&#xff0c;点击下一步指定虚拟机内存…

FGO:使用chaIdea获取抽卡数据(mitmproxy抓包)

需求描述 最近逛贴吧看到好多master贴出自己的抽卡概率截图&#xff0c;本非洲杂鱼master也对自己的脸黑程度产生了好奇&#xff08;曾经15单芭娜娜池子1五星&#xff0c;6单道满池子1五星&#xff0c;梅莉池子330抽1五星&#xff0c;最近的芭娜娜复刻又330抽1五星&#xff09…

Dedecms最新版--0day分享分析(二)

前言 接上一篇的Tricks&#xff0c;既然利用远程文件下载方式成为了实现RCE的最好方法&#xff0c;毕竟在执行的时候没有恶意shell文件&#xff0c;恶意木马被存放于远端服务器&#xff0c;那么下文的day就是对远程恶意文件的利用。 环境 下载最新版本&#xff1a; https://…