前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好

借鉴博客:

  他这篇博客写得不错,挺全的:https://www.cnblogs.com/xu-xiang/p/5797575.html

废话不多说,开撸:

  先声明:微信支付接口官方文档还是要看的,多看几遍所需要的参数,支付流程,再看一下别人博客的支付代码基本就明白了整个流程。

  1、先说说获取微信支付二维码所需要的几个重要配置参数:

      APP_ID (微信支付 公众号ID )

      MCH_ID  (商户号ID)
      API_KEY  (微信商户平台key密钥)
      NOTIFY_URL  (扫码支付成功后,微信要回调你服务器的接口地址)

        UFDODER_URL  (微信官方获取支付二维码的接口地址)

  上代码图:

  2、整个获取微信支付二维码所用到的代码文件

    HttpUtil03.java  发送get,post请求的工具类

    PayCommonUtil.java    请求微信接口时需要sign签名参数,里面有生成签名算法的方法

    PayConfigUtil.java  配置参数文件,放一些公众号ID、商户号ID、key、微信接口路径呀什么的配置参数

    WXGetScanCodePayUtil.java  处理发送参数,并发送参数获取二维码code的工具

    WXScanCodePayTest.java  main方法,编订单死数据,测试接口的

    XMLUtil4jdom.java  由于微信获取支付二维码code的接口所需要的参数是xml格式的,所以专门搞个工具类来把map转xml,或者把xml转String

    上图:

  3、上代码开始测试:

    3.1、我在WXScanCodePayTest.java这个类的main方法中测试运行整个请求处理接口流程,微信支付二维码接口需要一些订单商品参数,目前只是测试玩玩,所以写死

     String orderId = "201805150001";

        String order_price = "100";//100分,其实这里是10块钱
// 微信支付URL需要传入的金额单位是分,此处将订单金额转换成'分'单位
BigDecimal fen = new BigDecimal(order_price);
fen = fen.setScale(0, BigDecimal.ROUND_HALF_UP);
order_price = fen.toString(); // 微信支付显示标题
String body = "给老子100万"; // 微信支交易订单号,不能重复
String out_trade_no = "" + System.currentTimeMillis(); // 组装参数
Map<String, Object> param = new HashMap<String, Object>();
param.put("order_price", order_price);
param.put("body", body);//商品描述
param.put("out_trade_no", out_trade_no);//微信支付交易订单号,自己生成
param.put("attach", orderId);//订单id
param.put("time_expire", DateUtil.getOrderExpireTime(1*60*1000L));//设置二维码失效时间:1分钟 // 生成微信支付二维码链接
Map<String, String> result = WXGetScanCodePayUtil.doUnifiedOrder(param, null);
if ("FAIL".equals(result.get("return_code"))){ log.error("生成二维码错误: " + result.get("return_msg"));
// request.getSession().setAttribute("create_wx_qrcode_error_msg", result.get("return_msg"));
// session.setAttribute("create_wx_qrcode_error_msg", result.get("return_msg"));
} else {
String urlCode = result.get("code_url");
System.out.println("生成的二维码连接:" + urlCode); // BufferedImage bufferedImage = MatrixToImage.encodeQrcode(urlCode, 250, 250);
// ImageIO.write(bufferedImage, "jpg", response.getOutputStream());         以下代码是用在controller测试代码里的,用生成二维码图片的工具生成一个二维码图片,以流的形式返回给jsp页面的<img src="获取二维码图片流的controller接口地址">标签,以前测试玩的,我就不弄了
// 生成微信二维码,输出到response流中
// String icon = UserController.class.getClassLoader().getResource("coffee_icon.png").getPath();
//二维码绘图工具
// BufferedImage bufferedImage = MatrixToImageWriterWithLogo.genBarcode(urlCode, 512, 512, icon); // 二维码的内容,宽,高,二维码中心的图片地址
// ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
}

      3.2、在WXGetScanCodePayUtil.doUnifiedOrder(param, null);方法里处理要传的参数,并处理发送(使用HttpUtil03.java工具)post请求给微信支付二维码接口

 /**
*
* @Description:调用微信支付接口返回URL
* @author:zrt
* @param param 订单价格,订单显示内容,订单号
* @param request
* @return
* @throws Exception
* @version:2018年5月15日下午12:02:06
*/
@SuppressWarnings("unchecked")
public static Map<String, String> doUnifiedOrder(Map<String, Object> param, HttpServletRequest request) throws Exception { String appid = PayConfigUtil.APP_ID; // appid
String mch_id = PayConfigUtil.MCH_ID; // 商户号
String key = PayConfigUtil.API_KEY; // key String trade_type = "NATIVE";
// String spbill_create_ip = PayCommonUtil.getIpAddress(request); // 获取发起电脑 ip
String spbill_create_ip = "192.168.2.59";
String notify_url = PayConfigUtil.NOTIFY_URL; // 回调接口 String currTime = PayCommonUtil.getCurrTime();
String strTime = currTime.substring(8, currTime.length());
String strRandom = PayCommonUtil.buildRandom(4) + "";
String nonce_str = strTime + strRandom; // 随机字符串 String order_price = (String) param.get("order_price"); // 价格 注意:价格的单位是分
String body = (String) param.get("body"); // 商品名称
String out_trade_no = (String) param.get("out_trade_no"); // 订单号 String attach = (String) param.get("attach"); // 附加参数,这里传的是我们的订单号orderId
String time_expire = (String) param.get("time_expire");//设置二维码失效时间 SortedMap<String,String> packageParams = new TreeMap<String,String>();
packageParams.put("appid", appid);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", body);
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("total_fee", order_price);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", notify_url);
packageParams.put("trade_type", trade_type);
packageParams.put("attach", attach);
packageParams.put("time_expire", time_expire); // 签名
String sign = PayCommonUtil.createSign("UTF-8", packageParams, key);
packageParams.put("sign", sign); // 微信支付接口传输数据使用xml方式进行的,此处将参数装换为xml
// map --> xml
String requestXML = PayCommonUtil.getRequestXml(packageParams);
System.out.println("---------- Request XML: " + requestXML); //设置请求头
Map<String, String> headers = new HashMap<String, String>();
headers.put("content-type", "text/html; charset=UTF-8"); // String resXml = HttpUtil.postData(PayConfigUtil.UFDODER_URL, requestXML);
HttpEntity httpEntity = HttpUtil03.sendHttpsPost(UFDODER_URL, headers, requestXML, true);
BufferedReader reader = new BufferedReader(new InputStreamReader(httpEntity.getContent(), "UTF-8"));
StringBuilder resXml = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
resXml.append(line);
resXml.append("\r\n");
} System.out.println("---------- Response XML: " + resXml.toString()); // xml --> map
return XMLUtil4jdom.doXMLParse(resXml.toString());
}

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

整个获取微信支付二维码的处理流程就是这样

上最后效果图:不要问为什么生成的支付二维码是红色的,我用生成二维码图片的插件自己调颜色大小时瞎调的,懒得改了

微信支付之01------获取订单微信支付二维码的接口------Java实现的更多相关文章

  1. 微信小程序开发——获取小程序带参二维码全流程

    前言: 想要获取微信小程序带参数二维码,如这种: 官方文档只说了获取小程序码和二维码的三种接口及调用(参考链接:https://developers.weixin.qq.com/miniprogram ...

  2. 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)

    文章转载地址  http://www.vxzsk.com/87.html  设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ...

  3. 微信获取ticket及生成二维码(临时或永久)

    微信获取ticket及生成二维码(临时或永久) curl.php---- define("APPID",""); define("APPSECRET& ...

  4. 微信小程序开发——使用第三方插件生成二维码

    需求场景: 小程序中指定页面需要根据列表数据生成多张二维码. 实现方案: 鉴于需要生成多张二维码,可以将生成二维码的功能封装到组件中,直接在页面列表循环中调用就好了.也可以给组件添加slot,在页面调 ...

  5. 通过微信公众号ID生成公众号的二维码

    username为公众号id http://open.weixin.qq.com/qr/code/?username=wyjiaolian

  6. 微信公众平台中临时二维码的scene_id为32位非0整型

    原文:微信公众平台中临时二维码的scene_id为32位非0整型                                        微信公众平台中临时二维码的scene_id为32位非0整 ...

  7. PHP实现一个二维码同时支持支付宝和微信支付

    实现思路 生成一个二维码,加入要处理的url连接 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式 ...

  8. 微信支付之二维码支付(native)

    HoJe男孩子你要加油阿 准备材料微信支付需要的参数统一下单二维码回调接口用到的工具类 . 准备材料 首先肯定是要有微信的开发文档开发文档地址再然后就是一些必的参数 注意:回调地址异步接收微信支付结果 ...

  9. 支付二维码整合 - 三码合一支持支付宝、QQ、微信

    支付二维码整合 - 三码合一支持支付宝.QQ.微信 1. 前提:获取各个二维码的具体内容 在写代码前,我们需要先获取不同支付方式的二维码内容.很简单,只需要打开各个支付码,截图,然后随便找个可以扫码的 ...

随机推荐

  1. LindDotNetCore~职责链模式的应用

    回到目录 职责链模式 它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择! 下面是官方标准的定义:责任链模式是一种设计模式.在责任链模 ...

  2. Win32对话框程序(1)

    之前学C语言是一直都是在控制台下面操作的,面对的都是黑框框,严重的打击了学习的兴趣.后来在TC下进行C语言课程设计,做了图形界面编程,但都是点线面画的…… 中间隔了好长一段时间没有碰过C语言,最近才开 ...

  3. 100 - k8s源码分析-准备工作

    今天我们开始讲kubernetes的源码! 之前的其他开源项目还没有说完,后续会陆陆续续更新,我们把主线先放到k8s的源码上. 之前我想详细讲解每一行k8s源码,但是越看越发现一个大型开源项目如果拘泥 ...

  4. 为什么使用 Redis 及其产品定位

    一:传统 MySQL+ Memcached 架构遇到的问题 实际 MySQL 是适合进行海量数据存储的,通过 Memcached 将热点数据加载到 cache,加速访问,很多公司都曾经使用过这样的架构 ...

  5. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  6. SQLServer事务在C#当中的应用

    1:事务是什么 事务指的是一系列SQL操作的逻辑工作单元,,要么完全地执行,要么完全地不执行. 一个逻辑工作单元必须有4个属性,原子性(Atomic).一致性(Consistent).隔离型(Isol ...

  7. Autofac 和 Quartz.Net 自动注入的整合

    一:问题场景 在一次项目开发中,项目中已使用了Autofac.在新需求中要用到Quatrz.Net.在任务中使用注入方法,确始终无法使用注入的方法,经过千百次的度娘,终于找到了解决办法!吐槽下度娘真心 ...

  8. 鼠标事件以及clientX、offsetX、screenX、pageX、x的区别

    鼠标事件 鼠标事件有下面这几种: 1. onclick 鼠标点击事件 box.onclick = function(e){ console.log(e) } 2. onmousedown 鼠标按下事件 ...

  9. react异步加载组件

    1. 创建 asyncComponent 异步加载工具 import React from 'react' function asyncComponent(loadComponent){ class ...

  10. oppo7.0系统手机(亲测有效)激活Xposed框架的流程

    对于喜欢钻研手机的朋友而言,很多时候会使用到xposed框架及种类繁多功能极强的模块,对于5.0以下的系统版本,只要手机能获得root权限,安装和激活xposed框架是异常简单的,但随着系统版本的升级 ...