官方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. Scrum 冲刺 第一篇

    Scrum 冲刺 第一篇 每个成员认领的任务 人员 任务 周立 后台登录注册模块 邓富荣 后台首页模块 钟俊豪 博客圈模块 黄清山 个人界面模块 郑焕 首页以及博客圈界面 黄梓浩 个人界面以及登录注册 ...

  2. 原创:DynamicDataDisplay波形显示自定义格式

    原创:DynamicDataDisplay 原版本在日期显示的格式上与我们的习惯不一样,特做如下修改: 自定义日期格式修改: //MainWindow.cs中 var ds = new Enumera ...

  3. mybatis逆向工程运行

    命令: mvn mybatis-generator:generate 项目结构: generatorConfig.xml内容示例 <?xml version="1.0" en ...

  4. python学习之路 初识xml

    import requests from xml.etree import ElementTree as ET r = requests.get('http://www.webxml.com.cn// ...

  5. Java中CAS原理分析(volatile和synchronized浅析)

    CAS是什么? CAS英文解释是比较和交换,是cpu底层的源语,是解决共享变量原子性实现方案,它定义了三个变量,内存地址值对应V,期待值E和要修改的值U,如下图所示,这些变量都是在高速缓存中的,如果两 ...

  6. 00-JAVA语法基础

    1. 原码为数的二进制数,反码是将其二进制数每一位按位取反.补码则不同,正数的补码是其原码本身,负数的补码是其除符号位以外其他每一位按位取反再加一,符号位不变. int a=100; a=a>& ...

  7. PHP代码审计学习-PHP-Audit-Labs-day1

    0x01 前言 偶然间看到红日团队的PHP代码审计教程,想起之前立的flag,随决定赶紧搞起来.要不以后怎么跟00后竞争呢.虽然现在PHP代码审计不吃香,但是php代码好歹能看懂,CTF中也经常遇到, ...

  8. idea 最好用的插件

    1.lombok 不用写get,set方法 2.MyBatisCodeHelperPro 3.Rainbow Brackets 彩虹括号 5.activate-power-mode 动感打字 7.Ba ...

  9. Windows单机安装hadoop

    版本信息 Hadoop 3.2.0 java version "1.8.0_201" Windows 7专业版,64位 安装过程 jdk安装 下载jdk,解压到目录,D:\Java ...

  10. Web项目访问在C盘的图片(不在当前项目路径下的图片)

    使用ASPX页面处理 前台显示 <img src="/UeImg.aspx?path=C:/YxFile/ueditor/upload/image/20200211/637170508 ...