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

1.使用jar包

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

2.统一下单接口

serviceImpl类

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

controller

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

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

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

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

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

3.支付回调

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

    解决子串相关问题的强大工具 我们知道一个长度为 \(n\) 的字符串中所有的子串数目为 \(O(n^2)\) 个,这很大程度上限制了我们对某些子串相关问题的研究.所以有没有解决方案,使得我们可以在可承 ...

  2. 题解-[SDOI2016]征途

    [SDOI2016]征途 [SDOI2016]征途 给定长度为 \(n\) 的序列 \(a\{n\}\),将其分为连续 \(m\) 段,和分别为 \(v\{m\}\).\(v\{m\}\) 的方差为 ...

  3. sql server添加单独新用户

  4. 别再说你不懂什么是API了

    API 全称 Application Programming Interface, 即应用程序编程接口. 看到这里,急性子的小白同学马上就憋不住了:这不管是英文还是中文我每个字都懂啊,只是凑一块就不知 ...

  5. mysql 8.0 改变数据目录和日志目录(一)

    一.背景 原数据库数据目录:/data/mysql3306/data,日志文件目录:/data/mysql3306/binlog 变更后数据库目录:/mysqldata/3306/data,日志文件目 ...

  6. 【面试专栏】JAVA锁机制

    1. 悲观锁 / 乐观锁   在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看:   Mysql锁机制--悲观锁和乐观锁   悲观锁:在获得数据时先加锁,只到数 ...

  7. Elements-of-Python_04_Function

    (内容包括函数.递归.Lambda.作用域等) 1. 函数 1.1 函数概述 函数是对程序逻辑进行结构化和过程化的一种编程方法,用于封装一个特定的功能,表示一个功能或者行为.函数是可以重复执行的语句块 ...

  8. [日常摸鱼]bzoj3122 [Sdoi]2013 随机数生成器

    又是写了一晚上才过的题- 题意:有一个数列$x_n=(ax_{n-1}+b) mod p$,给你$x_1,a,b,p,t$,求最小的$x_i=t$的$i$,可能不存在 一开始很自然的推出了式子$x_n ...

  9. 点击劫持(Iframe clickJack)练习

    实验内容: 寻找一个合适的网站放入到iframe标签中.实验中测试了包括知网首页及登录界面.淘宝首页及登录界面,百度首页,微信下载界面.发现淘宝登录界面无法放入,会直接跳转到淘宝真实的登录界面,其他的 ...

  10. Java线程池二:线程池原理

    最近精读Netty源码,读到NioEventLoop部分的时候,发现对Java线程&线程池有些概念还有困惑, 所以深入总结一下 Java线程池一:线程基础 为什么需要使用线程池 Java线程映 ...