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

借鉴博客:

  他这篇博客写得不错,挺全的: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. Android Studio开发环境配置以及相关说明

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里简单记录下在开发的时候使用的Android Studio开发环境版本以及相关注意事项. 一般来讲,每隔一段时间就要检查下Andr ...

  2. DotNetCore跨平台~2.0提前发布喽

    回到目录 提前1个多月把2.0发布出来了,小微真的把持不住了,哈哈! windows上安装 http://mp.weixin.qq.com/s/ueJdhaBBCHga0sQlVD6YiQ https ...

  3. 深度解密Go语言之Slice

    目录 当我们在说 slice 时,到底在说什么 slice 的创建 直接声明 字面量 make 截取 slice 和数组的区别在哪 append 到底做了什么 为什么 nil slice 可以直接 a ...

  4. C#语法——委托,架构的血液

    本篇文章主要介绍委托的应用. 委托是大家最常见的语法了,但会用与精通之间的差别是巨大的. 一个程序员如果不能精通委托,那么,他永远无法成为高级程序员. 所以,让我们把委托刻到血液里吧. 这样,你才能称 ...

  5. [JavaScript] Cookie,localStorage,sessionStorage概述

    Cookie Cookie 是一些数据, 存储于你电脑上的文本文件中,当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息.Cookie 的作用就是存储 web 页面 ...

  6. EF基于方法的查询语法

    实体框架(Entity Framework )是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术. LINQ to Entities 提供语言集成查询 (LINQ) 支持,它允许开发人员 ...

  7. mysql触发器new和old

    下面为您介绍mysql触发器new old的相关知识,供您参考学习,如果您在mysql触发器方面遇到过类似的问题,不妨一看,相信对您会有所帮助. mysql触发器new old: "NEW ...

  8. 折腾Java设计模式之观察者模式

    观察者模式 Define a one-to-many dependency between objects where a state change in one object results in ...

  9. Uncaught ReferenceError: jQuery is not defined

    页面调试时,明明引入了JQ文件,却一直提示Uncaught ReferenceError: jQuery is not defined错误. 转自:http://blog.csdn.net/baicp ...

  10. 关于elementui表单数字校验踩坑记

    需求:1.输入类型是数字.2.数字大小有限制.3.非必填 做法: <el-form-item label="熟悉程度" prop="averageCaseRunTi ...