当前位置:   article > 正文

微信支付全部详细流程_微信支付流程图解

微信支付流程图解



微信支付时序图 官方文档:

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的管理事务的好处和选择
增,删,改  开启事务

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

闽ICP备14008679号