微信支付全部详细流程
微信支付时序图 官方文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
1、什么是时序图
是一种UML交互图,描述了对象之间传递消息的时间顺序, 用来表示用例中的行为顺序, 是强调消息时间顺序的交互图;
通俗解释:就是交互流程图 (把大象装冰箱分几步)
2、时序图包括四个元素 对象(Object), 生命线(Lifeline), 激活(Activation), 消息(Message);
对象:时序图中的对象在交互中扮演的角色就是对象,使用矩形将对象名称包含起来, 名称下有下划线
生命线:生命线是一条垂直的虚线, 这条虚线表示对象的存在, 在时序图中, 每个对象都有生命线
激活:代表时序图中对象执行一项操作的时期, 表示该对象被占用以完成某个任务,当对象处于激活时期, 生命线可以拓宽为矩形
消息:对象之间的交互是通过相互发消息来实现的,箭头上面标出消息名,一个对象可以请求(要求)另一个对象做某件事件
消息从源对象指向目标对象,消息一旦发送便将控制从源对象转移到目标对象,息的阅读顺序是严格自上而下的
消息交互中的实线:请求消息
消息交互中的虚线:响应返回消息
自己调用自己的方法:反身消息
参考:https://www.cnblogs.com/langtianya/p/3825764.html
统一下单接口介绍:
商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
2、微信支付订单接口开发之订单增删改查
简介: 微信扫码支付之统一下单接口开发之订单增删改查
1、Dao层VideoOrder增删改查开发
@Insert("")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id") //keyProperty java对象的属性;keyColumn表示数据库的字段
int insert(VideoOrder order);
@Select("SELECT * FROM video_order WHERE id = #{id}")
VideoOrder findById(int id);
@Select("SELECT * FROM video_order WHERE id = #{id}")
VideoOrder findByOutTradeNo(String outTradeNo);
@Delete("DELETE FROM video_order WHERE id =#{id}")
int delete(int id);
3、微信统一下单接口开发之CommonUtils和WXpayUtils开发
简介:封装常用工具类CommonUtils和WXpayUtils
从微信开发者文档获取部分代码 https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
1、CommonUtils包含方法 md5,uuid等
//生成 uuid, 即用来标识一笔单,也用做 nonce_str
public static String generateUUID() {
return UUID.randomUUID().toString().replaceAll("-", "")
.substring(0, 32);
}
//MD5工具类
public static String MD5(String data) {
try {
java.security.MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString().toUpperCase();
} catch (Exception exception) {
}
return null;
}
2、WXPayUtil包含方法 xmlToMap,mapToXml,createSign,isCorrectPaySign
4、微信支付Controller下单API接口开发
简介:讲解下单接口开发,开发技巧和支付配置文件设置
1、开发controller,开发期间不加入拦截器登录校验
2、iputils工具类介绍
3、加入微信支付配置
#微信商户平台
wxpay.mer_id=1503808832
wxpay.key=xdclasss20182018xdclass2018x018d
wxpay.callback=16web.tunnel.qydev.com/pub/api/v1/wechat/order/callback1
5.签名测试结果
XML源串
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xml>
<appid>wxt89583oxy157pv6e</appid>
<body>SpringBoot+Maven整合Websocket课程</body>
<mch_id>0747785655</mch_id>
<nonce_str>bd215711233047ba98089bd7d26e8532</nonce_str>
<notify_url>http://qcsell.natapp1.cc/api/v1/wechat/order/callback</notify_url>
<out_trade_no>56c0a8ae122b4b7da8f74628534a6108</out_trade_no>
---------------------------------------------------------------------------
商户Key:k66z0230Vf5K22Qj70Q3U8R5460930F1
6 调用微信统一下单接口,发送post请求,并获取响应转成map,获取交易会话的二维码链接code_url。
1、配置统一下单接口
2、发送请求验证
微信统一下单响应
<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx5beac15ca207c40c]]></appid>
<mch_id><![CDATA[1503809911]]></mch_id>
<nonce_str><![CDATA[Go5gDC2CYL5HvizG]]></nonce_str>
<sign><![CDATA[BC62592B9A94F5C914FAAD93ADE7662B]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx262207318328044f75c9ebec2216783076]]></prepay_id>
<trade_type><![CDATA[NATIVE]]></trade_type>
<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=hFq9fX6]]></code_url>
</xml>
3、获取code_url
遇到问题,根据错误码解决
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
7谷歌二维码工具生成扫一扫支付二维码
简介:使用谷歌二维码工具根据code_url生成扫一扫支付二维码
1、生成二维码返回页端
加入依赖
<!-- google二维码生成包 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>2.0</version>
</dependency>
2、使用微信扫码完成支付
参考资料:https://blog.csdn.net/shenfuli/article/details/68923393
https://www.cnblogs.com/lanxiamo/p/6293580.html
二维码知识:https://coolshell.cn/articles/10590.html
简介:使用Ngrock本地接收微信回调,并开发回调接口
文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3
1 、开发支付回调接口
//读取回调输入流
StringBuffer sb = new StringBuffer();
InputStream inputStream = request.getInputStream();
String line ;
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((line = in.readLine()) != null){
sb.append(line);
}
in.close();
inputStream.close();
//解析xml成map
//{transaction_id=4200000141201805266700247361, nonce_str=cbb67accd8044c9ea48f3318b99d88e4, bank_type=CFT, openid=oiNKG03vVY4PHlGUEwT-ztFo8K8Y, sign=0575804DBE4E9FFF6545046FA062BC4C, fee_type=CNY, mch_id=1503809911, cash_fee=1, out_trade_no=78902e694bab485b8e7745b61e05dbfe, appid=wx5beac15ca207c40c, total_fee=1, trade_type=NATIVE, result_code=SUCCESS, time_end=20180526162759, is_subscribe=Y, return_code=SUCCESS}
Map<String, String> callbackMap = WXPayUtil.xmlToMap(sb.toString());
//获取有序map
SortedMap<String, String> sortedMap = CommonUtil.getSortedMap(callbackMap) ;
回调数据:
<xml><appid><![CDATA[wx5beac15ca207c40c]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[10]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[1503809911]]></mch_id><nonce_str><![CDATA[de019d5f1e5d40649cd76de33f18b13e]]></nonce_str><openid><![CDATA[oiNKG03vVY4PHlGUEwT-ztFo8K8Y]]></openid><out_trade_no><![CDATA[4d8cea4a916440368583edaf82488624]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[FA799B7DF70C2BAC558E839E01EF341A]]></sign><time_end><![CDATA[20180626230347]]></time_end><total_fee>10</total_fee><trade_type><![CDATA[NATIVE]]></trade_type><transaction_id><![CDATA[4200000142201806264038572903]]></transaction_id></xml>
转成map:
{transaction_id=4200000142201806264038572903, nonce_str=de019d5f1e5d40649cd76de33f18b13e, bank_type=CFT, openid=oiNKG03vVY4PHlGUEwT-ztFo8K8Y, sign=FA799B7DF70C2BAC558E839E01EF341A, fee_type=CNY, mch_id=1503809911, cash_fee=10, out_trade_no=4d8cea4a916440368583edaf82488624, appid=wx5beac15ca207c40c, total_fee=10, trade_type=NATIVE, result_code=SUCCESS, time_end=20180626230347, is_subscribe=Y, return_code=SUCCESS}
2、注意点:
回调要用post方式,微信文档没有写回调的通知方式
可以用这个注解 @RequestMapping
问题:一定要看日志
14、微信回调处理之更新订单状态和幂等性讲解
简介:微信支付回调处理之更新订单状态和讲解什么是接口的幂等性
微信回调通知规则(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
幂等性: 同样的参数和值,不管调用你的接口多少次,响应结果都和调用一次是一样的
1、校验签名是否正确,防止伪造回调
2、查询订单是否已经更新
3、若没更新则更新订单状态
4、回应微信,SUCCESS 或者 FAIL
response.setContentType("text/xml");
response.getWriter().println("success");
15、微信支付之下单事务处理
简介:讲解下单接口增加事务和常见的事务选择
1、springboot开启事务,启动类里面增加 @EnableTransactionManagement
2、需要事务的方法上加 @Transactional(propagation = Propagation.REQUIRED)
3、aop的管理事务的好处和选择
增,删,改 开启事务
微信支付全部详细流程相关推荐
- Android 微信登录详细流程
流程讲解: 第一步:先去微信平台注册账号,填写应用信息,提交审核,大概需要三到五天的时间审核完成: 第二步:审核完成微信开放平台会生成一个appid,和sercet 这两个是唯一的id 需要妥善保管: ...
- WeChat:微信小程序设计流程注册完善、设计开发、审核发布之详细攻略
WeChat:微信小程序设计流程注册&完善.设计&开发.审核&发布之详细攻略 目录 微信小程序设计流程 1.注册 2.小程序信息完善 3.开发小程序 3.1.开发文档 3.2. ...
- 微信小程序云开发实例 源码 部署详细流程[自带管理后台]
项目介绍 小贝校招 项目是集校招资讯.内推.刷题.简历模板下载等功能于一体的小程序,基于微信原生+微信云开发+vant+colorui以及相关技术栈开发,自带图像云开发后台,不需要自己建网站. 源代码 ...
- 微信小程序开发(1)—— 微信小程序申请注册提交审核并发布详细流程
一.微信小程序注册申请 作为开发者可以用测试版.也可以申请测试号.https://developers.weixin.qq.com/miniprogram/dev/devtools/sandbox.h ...
- 微信企业付款至零钱包实现详细流程Demo
微信企业付款实现详细流程Demo 大家好,我是 梦辛工作室的灵,下面来讲一下微信企业付款实现的流程 1.准备数据 微信企业付款需要 准备 微信支付API秘钥.支付证书:下面是获取流程: 先登录微信支付 ...
- 微信开发,微网站开发的详细流程
把公司开设在微信上,把自己的生意装到用户的手机里,传统生意要做到互联网上,要有互联网站,在移动互联网上,就需要有微网站.对企业而言,微网站不仅是企业的一个手机版网站,更是移动互联网时代的企业应用与商业 ...
- 微信小程序提交审核并发布详细流程
微信小程序提交审核并发布详细流程 审核在1小时到N天不等 官方7天,一般3天内 提交审核?如何发布?审核过程中注意事项? 服务器: 域名只支持 https (request.uploadFile.do ...
- 小程序发布上线流程_微信小程序提交审核并发布详细流程
微信小程序提交审核并发布详细流程 审核在1小时到N天不等 官方7天,一般3天内 提交审核?如何发布?审核过程中注意事项? 服务器: 域名只支持 https (request.uploadFile.do ...
- 微信支付0.2%费率申请「详细流程」
公司名称:微百讯网络科技有限公司 公司资质:微信合作伙伴(微信支付服务商) 服务权限:为商家申请微信支付.(可把千分之六费率调低到千分之二) 微信支付0.2%费率申请「详细流程」 ps: 可在微信支付 ...
- fiash星空动画制作_三维动画制作的详细流程
三维动画制作的详细流程: 随着互联网的发展,三维动画技术更新,三维动画制作技术在生活中运用十分广泛,我们经常在一些电视广告,影视电影中会看到一些三维特效,因为震撼的真实感很受大众喜欢.三维动画技术让视 ...
最新文章
- 将Byte数组转化为String
- php 生成动态键值 数组_你的PHP项目遇到性能问题了吗?看完这篇性能分析恍然大悟...
- 编写安全的ASP代码
- iphone4/iphone5/iphone6/iphone6Plus响应式布局适配代码
- Cortex - M3 中断和异常的区别
- js使用defineProperty的一些坑
- C#入门,基本的整型输入
- SQL Server 2019 创建数据库(利用程序)
- 本博客自排名1000到400的各项数据变化
- 征途2服务器显示不出来怎么办,征途2手游进不了游戏怎么办 游戏无法进入解决方法[多图]...
- 找不到文件“c:/Users/Administrator/Desktop/vue_dom2/node_modules/postcss-discard-overridden/types/index.d.
- Alpha测试 / Beta测试 / 黑盒测试 /白盒测试概述
- 买房的疯了-开发商笑不起来了(本文仅供新浪)
- 执节歌者 · 箫谱1
- 飞书和钉钉之间,差了几个企业微信?
- 高质量前端快照方案:来自页面的「自拍」
- Python基础学习笔记:匿名函数
- 我作为大学生刚出校园实习的感受
- C++利用opencv调用pytorch训练好的分类模型
- 基于PLC系统的点焊机器人数据通讯采集方案
热门文章
- 2022年网络安全行业发展趋势
- Python TCP接收/发送信息
- 天眼查企业工商信息查询接口
- matlab直方图均衡化函数
- 二维最大类间方差阈值分割的快速迭代算法
- ArcGIS georeference地理配准提高精度
- 20190408-相速度和群速度、傅里叶变换与波动方程的色散关系、介电常数与电导、介电函数与折射率、散度定理、电子迁移率、电磁波波动方程、自由电子气的介电函数
- 你了解PowerBI中的去年同期吗
- h5页面 请在微信客户端打开链接_使用Fiddler抓包解决“请在微信客户端打开链接”的问题...
- Matlab/Simulink-Boost电路双闭环仿真搭建