用户扫码支付成功,微信异步回调商户

上一篇博客完成用户扫码支付功能: https://www.cnblogs.com/qdhxhz/p/9708534.html

当用户扫码支付成功之后,微信会异步回调商户接口,告知用户支付成功。好让商户进行下一步操作。

一、接口说明

1、流程图

这里要做的就是用户支付成功后,微信异步通知商户支付结果,商户收到通知后告知支付通知接收情况。

2、接口说明

有关商户接口应注意以下几点:

(1)该链接是通过【统一下单API】中提交的参数notify_url设置,如果链接无法访问,商户将无法接收到微信通知。

(2)notify_url不能有参数,外网可以直接访问,不能有访问控制(比如必须要登录才能操作)。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

(3)支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

(4)对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不

保证通知最终能成功。(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理

重复的通知。推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。

在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

(5)特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。

二、接口开发

1、回调接口

有关ngrok工具如果不了解的话,可以参考博客:   https://www.cnblogs.com/qdhxhz/p/9678137.html

    /*** 微信支付回调* 这里在统一下单中提供的notify_url地址是:http://jincou.vipgz1.idcfengye.com/api/v1/order/callback* 该域名是sunny-ngrok中的二级域名,通过它映射到微信本地*/@RequestMapping("callback")public void orderCallback(HttpServletRequest request,HttpServletResponse response) throws Exception {InputStream inputStream =  request.getInputStream();//BufferedReader是包装设计模式,性能更搞BufferedReader in =  new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));StringBuffer sb = new StringBuffer();//1、将微信回调信息转为字符串String line ;while ((line = in.readLine()) != null){sb.append(line);}in.close();inputStream.close();//2、将xml格式字符串格式转为map集合Map<String,String> callbackMap = WXPayUtil.xmlToMap(sb.toString());System.out.println(callbackMap.toString());//3、转为有序的mapSortedMap<String,String> sortedMap = WXPayUtil.getSortedMap(callbackMap);//4、判断签名是否正确if(WXPayUtil.isCorrectSign(sortedMap,weChatConfig.getKey())){//5、判断回调信息是否成功if("SUCCESS".equals(sortedMap.get("result_code"))){//获取商户订单号//商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一String outTradeNo = sortedMap.get("out_trade_no");System.out.println(outTradeNo);//6、数据库查找订单,如果存在则根据订单号更新该订单VideoOrder dbVideoOrder = videoOrderService.findByOutTradeNo(outTradeNo);System.out.println(dbVideoOrder);if(dbVideoOrder != null && dbVideoOrder.getState()==0){  //判断逻辑看业务场景VideoOrder videoOrder = new VideoOrder();videoOrder.setOpenid(sortedMap.get("openid"));videoOrder.setOutTradeNo(outTradeNo);videoOrder.setNotifyTime(new Date());//修改支付状态,之前生成的订单支付状态是未支付,这里表面已经支付成功的订单videoOrder.setState(1);//根据商户订单号更新订单int rows = videoOrderService.updateVideoOderByOutTradeNo(videoOrder);System.out.println(rows);//7、通知微信订单处理成功if(rows == 0){response.setContentType("text/xml");response.getWriter().println("success");return;}}}}//7、通知微信订单处理失败response.setContentType("text/xml");response.getWriter().println("fail");}

2、校验签名方法

    /*** 校验签名*/public static boolean isCorrectSign(SortedMap<String, String> params, String key){//1、再进行一次生成signString sign = createSign(params,key);String weixinPaySign = params.get("sign").toUpperCase();//将两次生成的sign比较看是否一致return weixinPaySign.equals(sign);}/*** 生成微信支付sign*/public static String createSign(SortedMap<String, String> params, String key){StringBuilder sb = new StringBuilder();Set<Map.Entry<String, String>> es =  params.entrySet();Iterator<Map.Entry<String,String>> it =  es.iterator();//生成 stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";while (it.hasNext()){Map.Entry<String,String> entry = (Map.Entry<String,String>)it.next();String k = (String)entry.getKey();String v = (String)entry.getValue();if(null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)){sb.append(k+"="+v+"&");}}sb.append("key=").append(key);String sign = CommonUtils.MD5(sb.toString()).toUpperCase();return sign;}

3、测试

(1)支付成功

(2)通过ngrok回调到本地,通过断点可以看出sb字符串格式

(3)将xml格式字符串转为map

成功!

github源码

githubhttps://github.com/yudiandemingzi/wechatpay

我只是偶尔安静下来,对过去的种种思忖一番。那些曾经的旧时光里即便有过天真愚钝,也不值得谴责。毕竟,往后的日子,还很长。不断鼓励自己,

天一亮,又是崭新的起点,又是未知的征程(上校17)

微信扫码支付功能(2)---用户扫码支付成功,微信异步回调商户接口相关推荐

  1. 10行代码实现微信小程序支付功能,使用小程序云开发实现小程序支付功能(含源码

    前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能. 传送门 借助小程序云开发实现小程 ...

  2. SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址. 下面是回调接口实现 package com.office.miniapp.c ...

  3. 投票系统源码--微信投票系统开发功能介绍以及源码分享

    微信投票系统是第三方基于微信平台开发的可以举办微信投票类活动的系统. 微信公众平台自身也带有建立微信投票活动的功能,但功能非常少,只能进行投票,并没有丰富的功能,而且对投票选手的数量也是有限制.所以一 ...

  4. url 参数传递的两种方式_Java项目实践,支付功能实现方式,第三方支付与银行接口支付...

    1.第三方支付 B2C电商的支付,一般由于支付金额比较小,支付比较频繁,所以一般采用第三方支付,常用的第三方支付有:支付宝.微信等. 他们的原理都差不多,都是在点击支付时,直接调用第三方支付接口,传入 ...

  5. python微信公众号翻译功能_自学Python笔记:给微信公众号搭建“成绩查询”功能...

    原标题:自学Python笔记:给微信公众号搭建"成绩查询"功能 期末考试 临近年末,全国各地都在上演一场大戏<期末考试>,考完试无论什么样的结果总想尽快看到自己一个学期 ...

  6. 微信停止为苹果服务器,苹果用户注意!iOS成微信封号重灾区 赶快停止使用你的双客户端...

    相信不少人手里都有两个微信,一个用来工作一个用来平时和朋友联系,对于双卡双待的用户来说,会选择可以双开的客户端,在一台手机上使用两个微信.不过最近微信官方正在全面封杀这种"第三方" ...

  7. 在php中实现支付功能,PHP如何实现支付宝支付功能(图文详解)

    PHP实现的支付宝支付功能:结合实例形式分析php使用支付宝接口实现支付功能,首先对接口代码进行整理,保证运行的稳定性:然后,回调处理中验签通过核实参数达到功能实现. 问题详情: 本文实例讲述了PHP ...

  8. Php扫码签到功能怎么实现,扫码签到常用方法_云分组小程序

    扫码签到常用方法,云分组小程序,以800人团队为例,学员扫码分组仅需10秒钟. 扫码签到常用方法, 可以检测人员进出方向,对于实时统计会场实际人数的会议非常重要.多媒体电子签到系统是将数字毛笔签名.影 ...

  9. 机皇再翻车!微信、支付宝关停其指纹支付功能,用户难以原谅

    拥有更多资源和更强的实力的大厂,用户也会抱以更高的期望,但是一旦大厂翻车,那就很致命了,用户也难以原谅. 近日,三星S10手机又被曝出新问题,据外媒报道,一对英国夫妇发现,三星Galaxy S10手机 ...

最新文章

  1. 【MATLAB】符号数学计算(六):符号函数的操作
  2. JAVA语法基础之流程控制
  3. 成功解决AttributeError: module tensorflow has no attribute placeholder
  4. 修改服务器mysql密码,修改Linux服务器中的MySql密码
  5. 三种Ext提交数据的方法(转)
  6. Java中的异常栈轨迹和异常链
  7. The command ‘/bin/sh -c apt-get install -y vim’ returned a non-zzero code: 100
  8. mysql手动启动1067错误_解决MySQL启动时万恶的1067错误(转)
  9. LeetCode 70 爬楼梯
  10. XP系统每次打开我的电脑出现自动扫描现象解决办法
  11. Part 2 —— 迁移到 Go Modules
  12. java基础英语---第二十四天
  13. 鸿蒙os 实测,鸿蒙体验怎么样_鸿蒙OS实测体验
  14. php 多任务,PHP并行多任务研究(笔记)
  15. 低功耗视频解码芯片-TVP5150
  16. 分布式计算原理之分布式协调与同步(1)——分布式互斥
  17. python工具——pypinyin 汉字转换拼音
  18. 上海地铁票价涨幅对比 2005-9-15执行
  19. IBM第二季度营收超预期 向云服务转型战略初见成效
  20. 毁灭一切还是重塑世界?AI已成为人类故事中心

热门文章

  1. Html标签中thead、tbody、tfoot的作用
  2. 第三方支付牌照名花有主   奉子成婚含金量多大
  3. B-Tree 和 B+Tree详解
  4. 2022年11月20日-2022年11月26日学习周报
  5. 微机原理——第七章 汇编语言程序设计
  6. 对于load方法的理解
  7. 前端原生js请求后台接口
  8. 手机APP调用支付宝支付(java服务端)
  9. in与exist的区别
  10. 指纹识别键盘软件测试,防水键盘指纹识别_笔记本评测-中关村在线