官方API文档https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

1.使用jar包

  1. 1 <!--微信支付 -->
  2. 2 <dependency>
  3. 3 <groupId>com.github.wxpay</groupId>
  4. 4 <artifactId>wxpay-sdk</artifactId>
  5. 5 <version>3.0.9</version>
  6. 6 </dependency>
  7. 7
  8. 8 <!--httpclient-->
  9. 9 <dependency>
  10. 10 <groupId>org.apache.httpcomponents</groupId>
  11. 11 <artifactId>httpclient</artifactId>
  12. 12 </dependency>

2.统一下单接口

serviceImpl类

  1. 1 public Map createNative(String out_trade_no, String total_fee) {
  2. 2 // TODO 自动生成的方法存根
  3. 3 Map<String,String> param=new HashMap<>();
  4. 4 param.put("appid", appid); //小程序id
  5. 5 param.put("mch_id", partner);//商户号
  6. 6 param.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串
  7. 7 param.put("body", "测试数据");//商品描述
  8. 8 param.put("out_trade_no", out_trade_no);//商户订单号
  9. 9 param.put("total_fee",total_fee);//总金额(分)
  10. 10 param.put("spbill_create_ip", "127.0.0.1");//IP
  11. 11 param.put("notify_url", notifyurl);//回调地址
  12. 12 param.put("trade_type", "NATIVE");//交易类型
  13. 13 param.put("product_id",out_trade_no);//订单
  14. 14 try {
  15. 15 //2.生成要发送的xml
  16. 16 String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey);
  17. 17 HttpClient client=new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
  18. 18 client.setHttps(true);
  19. 19 client.setXmlParam(xmlParam);
  20. 20 client.post();
  21. 21 //3.获得结果
  22. 22 String result = client.getContent();
  23. 23 System.out.println(result);
  24. 24 Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
  25. 25 Map<String, String> map=new HashMap<>();
  26. 26 map.put("code_url", resultMap.get("code_url"));//二维码支付地址
  27. 27 map.put("total_fee", total_fee);//总金额
  28. 28 map.put("out_trade_no",out_trade_no);//订单号
  29. 29 return map;
  30. 30 } catch (Exception e) {
  31. 31 e.printStackTrace();
  32. 32 return new HashMap<>();
  33. 33 }
  34. 34 }

controller

  1. 1 @RequestMapping("/createNative")
  2. 2 public AjaxJson createNativePay(){
  3. 3 //雪花算法类 随机生成号码
  4. 4 IdWorker idworker=new IdWorker();
  5. 5 long oid=idworker.nextId();
  6. 6 //订单实体类
  7. 7 SfOrders sfOrders=new SfOrders();
  8. 8 //set订单id
  9. 9 sfOrders.setOid(oid);
  10. 10 //支付状态
  11. 11 sfOrders.setPay_id(2);
  12. 12 //添加到数据库
  13. 13 int x=ordersMapper.add(sfOrders);
  14. 14 //判断是否添加成功
  15. 15 if(x>=1) {
  16. 16 //获取插入的id
  17. 17 Long keyid=publicMapper.getPrimarykey();
  18. 18 //转换keyid类型
  19. 19 int k=keyid.intValue();
  20. 20 //根据id查询这一条数据
  21. 21 SfOrders orders=ordersMapper.getById(k);
  22. 22 //根据订单id,支付金额生成二维码
  23. 23 Map map=weixinPayService.createNative(orders.getOid()+"","1");
  24. 24 return AjaxJson.getSuccessData(map);
  25. 25 }
  26. 26 return AjaxJson.getSuccess();
  27. 27 }

页面写法,有想要测试是否能支付的朋友可以试试

点击下载生成二维码的包qrcode.js

  1. 1 <!DOCTYPE html>
  2. 2 <html>
  3. 3 <head>
  4. 4 <meta charset="UTF-8">
  5. 5 <title></title>
  6. 6 <!-- 所有的 css & js 资源 -->
  7. 7 <link rel="stylesheet" href="https://unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css">
  8. 8 <link rel="stylesheet" href="../../static/sa.css">
  9. 9 <script src="https://unpkg.com/vue@2.6.10/dist/vue.min.js"></script>
  10. 10 <script src="https://unpkg.com/element-ui@2.13.0/lib/index.js"></script>
  11. 11 <script src="https://unpkg.com/jquery@3.4.1/dist/jquery.min.js"></script>
  12. 12 <script src="https://www.layuicdn.com/layer-v3.1.1/layer.js"></script>
  13. 13 <script src="../../static/sa.js"></script>
  14. 14 <script src="../../static/qrcode/qrcode.js"></script>
  15. 15 <style>
  16. 16 </style>
  17. 17 </head>
  18. 18 <body>
  19. 19 <div class="vue-box">
  20. 20 <div class="c-item" style="min-width: 0px;">
  21. 21 <el-button @click="queryCode()">点击事件二维码</el-button>
  22. 22 </div>
  23. 23 </div>
  24. 24
  25. 25 <div id="code"></div>
  26. 26
  27. 27 <script>
  28. 28 var app = new Vue({
  29. 29 el: '.vue-box',
  30. 30 data: {
  31. 31 code_url: '',
  32. 32 out_trade_no: ''
  33. 33 },
  34. 34
  35. 35 methods: {
  36. 36 queryCode: function() {
  37. 37 // 统一下单
  38. 38 // ajax返回 下单的数据
  39. 39 sa.ajax('/pay/createNative', function(res) {
  40. 40 console.log(res);
  41. 41 new QRCode(document.getElementById('code'), res.data.code_url); // 创建二维码
  42. 42 this.out_trade_no = res.data.out_trade_no; // 赋值 res里获取的赋值给data里面的
  43. 43 console.log(res.data.out_trade_no + "----------订单id")
  44. 44 }.bind(this), {});
  45. 45 },
  46. 46 },
  47. 47 created: function() {
  48. 48
  49. 49 }
  50. 50 })
  51. 51 </script>
  52. 52 </body>
  53. 53 </html>

写到这里了是可以去页面测试扫码支付的。

3.支付回调

  1. 1 @RequestMapping("/wxnotify")
  2. 2 public void wxnotify(HttpServletRequest request, HttpServletResponse response) {
  3. 3 String resXml = "";
  4. 4 InputStream inStream;
  5. 5 try {
  6. 6 inStream = request.getInputStream();
  7. 7 ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
  8. 8 byte[] buffer = new byte[1024];
  9. 9 int len = 0;
  10. 10 while ((len = inStream.read(buffer)) != -1) {
  11. 11 outSteam.write(buffer, 0, len);
  12. 12 }
  13. 13
  14. 14 WXPayUtil.getLogger().info("wxnotify:微信支付----start----");
  15. 15
  16. 16 // 获取微信调用我们notify_url的返回信息
  17. 17 String result = new String(outSteam.toByteArray(), "utf-8");
  18. 18 WXPayUtil.getLogger().info("wxnotify:微信支付----result----=" + result);
  19. 19
  20. 20 // 关闭流
  21. 21 outSteam.close();
  22. 22 inStream.close();
  23. 23
  24. 24 // xml转换为map
  25. 25 Map<String, String> resultMap = WXPayUtil.xmlToMap(result);
  26. 26 //判断状态 验证签名是否正确
  27. 27 boolean isSuccess = false;
  28. 28
  29. 29 if (WXPayConstants.SUCCESS.equalsIgnoreCase(resultMap.get(WXPayConstants.RESULT_CODE))) {
  30. 30
  31. 31 WXPayUtil.getLogger().info("wxnotify:微信支付----返回成功");
  32. 32
  33. 33 if (WXPayUtil.isSignatureValid(resultMap, WXPayConstants.API_KEY)) {
  34. 34
  35. 35 WXPayUtil.getLogger().info("wxnotify:微信支付----验证签名成功");
  36. 36
  37. 37 resXml = resSuccessXml;
  38. 38 isSuccess = true;
  39. 39
  40. 40 } else {
  41. 41 WXPayUtil.getLogger().error("wxnotify:微信支付----判断签名错误");
  42. 42 }
  43. 43
  44. 44 } else {
  45. 45 WXPayUtil.getLogger().error("wxnotify:支付失败,错误信息:" + resultMap.get(WXPayConstants.ERR_CODE_DES));
  46. 46 resXml = resFailXml;
  47. 47 }
  48. 48 // 回调方法,处理业务 - 修改订单状态
  49. 49 WXPayUtil.getLogger().info("wxnotify:微信支付回调:修改的订单===>" + resultMap.get("out_trade_no"));
  50. 50 int x=ordersService.updateByOid(resultMap.get("out_trade_no"));
  51. 51 if (x>=1) {
  52. 52 WXPayUtil.getLogger().info("wxnotify:微信支付回调:修改订单支付状态成功");
  53. 53 } else {
  54. 54 WXPayUtil.getLogger().error("wxnotify:微信支付回调:修改订单支付状态失败");
  55. 55 }
  56. 56
  57. 57 } catch (Exception e) {
  58. 58 WXPayUtil.getLogger().error("wxnotify:支付回调发布异常:", e);
  59. 59 } finally {
  60. 60 try {
  61. 61 // 处理业务完毕
  62. 62 BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  63. 63 out.write(resXml.getBytes());
  64. 64 out.flush();
  65. 65 out.close();
  66. 66 } catch (IOException e) {
  67. 67 WXPayUtil.getLogger().error("wxnotify:支付回调发布异常:out:", e);
  68. 68 }
  69. 69 }
  70. 70
  71. 71 }

上面定义的WXPayConstants这个类是自己封装的类,有朋友写到这个地方时,可以直接把这个变量的值等于它的小写字母。例如:

public static final String RESULT_CODE = "result_code";

写到这里就已经完成扫码支付了,如果有朋友是用这个方法做支付的话可以参考。有不懂的地方可以在下面留言。

微信扫码支付Native方式二以及支付回调的更多相关文章

  1. 【移动支付】.NET微信扫码支付接入(模式二-NATIVE)

    一.前言       经过两三天的琢磨总算完成了微信扫码支付功能,不得不感叹几句: 微信提供的DEMO不错,直接复制粘贴就可以跑起来了: 微信的配置平台我真是服了.公众平台.商户平台.开放平台,一个平 ...

  2. java微信扫码支付Native(模式二)

    官方开发文档模式二的地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 pom文件的依赖: <?xml versio ...

  3. .NET MVC结构框架下的微信扫码支付模式二 API接口开发测试

    直接上干货 ,我们的宗旨就是为人民服务.授人以鱼不如授人以渔.不吹毛求疵.不浮夸.不虚伪.不忽悠.一切都是为了社会共同进步,繁荣昌盛,小程序猿.大程序猿.老程序猿还是嫩程序猿,希望这个社会不要太急功近 ...

  4. .NET微信扫码支付模式二API接口开发测试

    主要实现微信扫码支付,官网的SDKdemo 就不要使用 一直不能调试通过的,还是自己按照API接口文档一步一步来实现,吐槽下微信一点责任感都木有,能不能demo搞个正常的吗,不要坑惨了一大群码农们有点 ...

  5. C# 微信扫码支付API (微信扫码支付模式二)

    一.SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1,下载.NET C#版本: 二.微信相关设置:(微信扫码 ...

  6. PHP PC端微信扫码支付【模式二】详细教程-附带源码(转)

    博主写这破玩意儿的时候花了大概快两天时间才整体的弄懂逻辑,考虑了一下~还是把所有代码都放出来给大家~抱着开源大无私的精神!谁叫我擅长拍黄片呢?同时也感谢我刚入行时候那些无私帮过我的程序员们! 首先还是 ...

  7. JAVA微信扫码支付模式二功能实现完整例子

    概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...

  8. php微信扫码支付

    一 概述 扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站支付.实体店单品或订单支付.媒体广告支付等场景.前几天公司需要做 ...

  9. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...

随机推荐

  1. 第 6篇 Scrum 冲刺博客

    一.站立式会议 1.站立式会议照片 2.昨天已完成的工作 完成了在数据库中对商品信息的查询 职工管理页面 3.今天计划完成的工作 完成对商品信息的分析 计划分析并编写职工信息模块代码 4.工作中遇到的 ...

  2. 百度前端技术学院-基础-day3

    2020.9.15 第三天的课程内容,复习了一些CSS的基础属性(果然不用就会忘). 学习了一些新的属性,比如text-shadow.text-indent(还不是很清楚).font-style等等. ...

  3. 《图解TCP/IP》笔记

    OSI参考模型 协议分层 为什么需要分层? 简化网络协议. 每一层只需要衔接上下层的服务. 利于模块化开发. 解耦. 分层的问题 过分模块化.提高数据处理的开销. OSI参考模型 作用及意义 将复杂的 ...

  4. mysql中FILE权限

    FILE权限指的是对服务器主机上文件的访问,数据库用户拥有FILE权限才可以执行select into outfile,load data infile操作. 参考文章:http://blog.itp ...

  5. 通过镜像下载最新Android源码

    参考了这两篇博客: http://blog.sina.com.cn/s/blog_70b9730f01016peg.html http://www.cnblogs.com/act262/p/41790 ...

  6. 多任务-python实现-使用生成器完成多任务(2.1.14)

    @ 目录 1.注意 2. 代码 关于作者 1.注意 先定义函数,函数里面放一个yiled 主函数生成该对象 执行while循环 调用生成器对象的next 因为每次调用next,不会继续执行,从而 完成 ...

  7. MySQL高级部分理论知识细讲

    文章目录 一.数据库分区.分表.分库.分片 YesOk ,大家好 ,我是小刘,许久不见,甚是想念 ,小刘今天来带大家学习 分库分表的基础知识 1.1 单机数据库的瓶颈 单个表数据量越大,读写锁,插入操 ...

  8. Phthon几个特殊的函数

    Python有几个相对特殊的函数,他们并不会提高工作效率,但是会使代码优雅简洁,其中包括lambda, map, reduce, filter, yeild. 第一:lambda,贴些代码体会. 1 ...

  9. NET 5 MemoryCache与Redis使用以及StackExchange.Redis和CSRedisCore

    简介以及区别 ASP.NET Core 缓存Caching,.NET Core 中为我们提供了Caching 的组件. 目前Caching 组件提供了三种存储方式. Memory Redis SqlS ...

  10. 【进程/作业】篇章一:Linux进程及其管理(进程的管理基础)

    概述:监控系统各方面的性能,保障各类服务的有序运行,是运维工作的重要组成部分,本篇就介绍一次常用的系统监控命令和相关的参数说明 具体包含以下几部分: 1.进程的管理基础 ,主要是讲一下概念性的东西 2 ...