网站首页 > 技术文章 正文
微信支付从配置到开发
一、配置
1、开通公众平台支付功能
商户号
微信支付功能先要申请微信(企业)公众平台,然后开通企业公众平台付功能。下图为微信(企业)公众平台页面,可以看到商户号等信息
微信公众号APPID
从开发-基本配置中获取APPID
2、微信商户平台相关配置
微信商户平台相关配置
因为微信公众平台调整,公众平台微信支付公众号支付授权目录、扫码支付回调URL配置入口于2017年8月1日迁移至商户平台(pay.weixin.qq.com),所以微信支付配置和相关信息要登录商户平台才能拿到。(估计是微信想要把公众号的管理功能和开发功能分离)
回调链接
从微信商户平台的产品中心-开发配置-支付配置配置扫码回调链接(扫码回调链接就是你项目中微信支付回调函数名称,这里需要的是加了项目域名的函数全称,必须保证能从公网访问。为什么需要一个回调函数呢?这属于微信支付的回调机制:当用户使用微信支付完成后,你从本地是无法得知是否支付成功的,而微信这边在获取到支付完成的状态后,主动去访问你所设置的回调函数地址,将支付状态等相关信息返回,我们只要在回调函数中判断支付状态,就能够便捷的进行下一步操作!)
设置API密钥
下载微信sdk
微信sdk是微信官方给出的微信支付demo,其中有很多好用的工具类,demo本身也可以为我们的支付接口开发提供参考(https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1)
把sdk导入到项目中
二、开发
主要业务流程
主要业务流程
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url(code_url就是微信支付地址)。
(4)商户后台系统根据返回的code_url生成二维码(用第三方插件生成二维码)。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
这是官方给出的文档,这里再梳理一下。单纯做PC端扫一扫开发很简单,主要是向微信支付的【统一下单API】请求,发送订单信息和签名(签名比较麻烦,可能前期测试会报多次签名错误,不过官方SDK中有生成签名的方法,当然,自己也可以写),请求成功微信支付返回二维码链接code_url,注意这是微信支付的链接,不是二维码!不是二维码!不是二维码!二维码需要自己生成,不要直接就把code_url挂在页面上~
请求【统一下单API】的参数列表
好了,上代码~
与支付无关的业务逻辑
与支付无关的业务逻辑
这里我单独创建一个类PayController来写自己的业务逻辑,生成业务订单啊,业务订单保存在数据库啊,查询订单信息啊,验证是否支付完成啊等等,我的业务逻辑比较简单,仅供参考~
微信支付逻辑
微信支付逻辑
1、生成签名,然后打包成【统一下单API】要求格式的订单(参数列表),微信支付要求为XMl格式
2、调用【统一下单API】微信接口,将我们打包好XMl格式的参数列表发送给【统一下单接口】,调用成功会接收到XMl格式的返回值,解析成我们需要的格式,判断是否请求 成功,成功的话是会返回code_url的
3、然后我们把code_url生成二维码展现给用户就OK了!
4、用户支付完成后,微信会访问我们的回调接口,根据返回的结果修改数据库支付状态
请求【统一下单API】返回参数列表
将微信支付所需要的固定参数封装到类WXpayConfig中
封装固定参数
WXPayController,主控制器
如果请求【统一下单接口】的参数正确,签名也没有报错,那我们就能成功获取到code_url,从而生成二维码,让用户扫码支付了。
生成二维码工具类QRCodeUtil
使用了第三方工具类zxing,这里用到的zxing依赖包请自行下载
前端轮询
当用户支付完成后,微信成功调用了我们的回调方法,数据库订单状态修改为“已支付”,Java后端的工作就基本完成了,那前端怎么知道用户完成了支付呢?现在普遍的办法是,前端写方法轮询支付状态,限定时间内查询到支付状态为“已支付”就进行下一步操作,限定时间后未支付就做支付超时的操作。本项目用户查询支付状态的代码已经写在了之前“与支付无关的业务逻辑”中了~
猜你喜欢
- 2025-06-30 跨标签页通信(五):IndexedDB(跨标签页通讯)
- 2025-06-30 Netty是如何一步一步演化而来的,不断进化成就Netty
- 2025-06-30 React 官方为何坚持推出反常规的RSC组件?
- 2025-06-30 "前端开发者不可错过的技能:SSE流式传输助力实时数据更新!"
- 2025-06-30 让 React 代码行数减少78%的 htmlx 有这么神?
- 2025-06-30 前端开发进阶:前端开发中如何高效渲染大数据量?
- 2025-06-30 8行代码实现一个websoket(代码如何实现)
- 2025-06-30 实现前端工程师的第一个AI应用(前端之父是谁)
- 2025-06-30 nginx服务器负载均衡配置(nginx负载均衡配置详解)
- 2025-06-30 前端定时任务的神库!快把它加到你的项目中去!
你 发表评论:
欢迎- 581℃几个Oracle空值处理函数 oracle处理null值的函数
- 576℃Oracle分析函数之Lag和Lead()使用
- 561℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 561℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 556℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 546℃【数据统计分析】详解Oracle分组函数之CUBE
- 535℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 530℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)