本文直接从代码调用微信扫码支付讲起。账号配置,参数生成等请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1

微信扫码支付。简单来说,就是你把微信支付需要的信息,生成到二维码图片中。通过微信扫一扫,发起支付。我们需要做的就是二件事:

一是:按照微信扫码支付规则生成二维码信息.

二是:微信没有提供生成二维码图片的接口。需要我们自己把二维码信息生成到二维码图片中。

1.模式选择:

微信扫码支付,有两种模式,文档中有介绍。第二种模式,微信接口会返回二维码信息给我们。而第一种模式则需要我们自己去生成二维码信息。会有些麻烦。尤其 是参数大小写,还有签名的问题,容易出错。总的来说第二种模式比第一种模式简单。所有我采用的是第二种模式,比较通用。京东与携程亦用的是第二种模式。

2.调用统一下单接口获取带有二维码信息的url:(模式二)

模式二的微信扫码支付,需要先调用微信的统一下单接口,生成预交易单。(参数传递与接收都是XML 数据格式。)

正确调用后,会返回含有交易标示ID,和二维码链接的URL。

3.实现扫码支付(模式二)

  private static String APPID = "";  

  private static String MCHID= "";
  private static String KEY= "";
  private static String APPSECRET= "";
  private static String body= "";
  private static String notify_url= "";    //回调地址。测试回调必须保证外网能访问到此地址
   /*** 统一下单接口* 微信二维码支付* @param params* @return*/public String weixin_pay(String out_trade_no,String product_id) {JSONObject retJson = new JSONObject();try {String currTime = PayCommonUtil.getCurrTime();String strTime = currTime.substring(8, currTime.length());String strRandom = PayCommonUtil.buildRandom(4) + "";String nonce_str = strTime + strRandom;      //生成随机字符串
JSONObject requestObj = JSONObject.fromObject(params);// 正式上线的时候价格根据订单id查询String order_price = "1"; // 价格 注意:价格的单位是分
SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();packageParams.put("appid", APPID);packageParams.put("mch_id", MCHID);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", "用户端ip");packageParams.put("notify_url", notify_url);packageParams.put("trade_type", "NATIVE");packageParams.put("product_id", product_id);Calendar nowTime = Calendar.getInstance();packageParams.put("time_start", DateFormatUtil.formatDate(nowTime.getTime(), "yyyyMMddHHmmss"));nowTime.add(Calendar.MINUTE, requestObj.getInt("expire_time"));packageParams.put("time_expire", DateFormatUtil.formatDate(nowTime.getTime(), "yyyyMMddHHmmss"));String sign = PayCommonUtil.createSign("UTF-8", packageParams,KEY);packageParams.put("sign", sign);        //加密
String requestXML = PayCommonUtil.getRequestXml(packageParams);logger.info("支付请求:" + requestXML);long startTime=System.currentTimeMillis();String resXml = HttpRequest.postData("https://api.mch.weixin.qq.com/pay/unifiedorder",requestXML);long endTime=System.currentTimeMillis();Integer execute_time = (int) ((endTime-startTime)/1000);logger.info("支付结果:" + resXml);Map map = XMLUtil.doXMLParse(resXml);JSONObject reportParams = new JSONObject();reportParams.put("url", "https://api.mch.weixin.qq.com/pay/unifiedorder");reportParams.put("execute_time", execute_time);reportParams.put("return_code", map.get("return_code").toString());reportParams.put("return_msg", map.get("return_msg").toString());reportParams.put("result_code", map.get("result_code").toString());if (map.get("err_code") != null) {reportParams.put("err_code", map.get("err_code").toString());reportParams.put("err_code_des", map.get("err_code_des").toString());}reportParams.put("out_trade_no", out_trade_no);//交易保障
            report(reportParams.toString());if (map.get("return_code").toString().equals("SUCCESS") && map.get("result_code").toString().equals("SUCCESS")) {String urlCode = (String) map.get("code_url");          //微信二维码短链接retJson.put("code", 0);retJson.put("message", "下单成功.");retJson.put("data", urlCode);} else {retJson.put("code", 1);retJson.put("message", map.get("err_code_des").toString());retJson.put("data", "");}return retJson.toString();} catch (Exception e) {// TODO: handle exception
            e.printStackTrace();}}

4.支付工具类

public class PayCommonUtil {public static Logger log = LoggerFactory.getLogger(PayCommonUtil.class);/*** 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。* @return boolean*/  public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  StringBuffer sb = new StringBuffer();  Set es = packageParams.entrySet();  Iterator it = es.iterator();  while(it.hasNext()) {  Map.Entry entry = (Map.Entry)it.next();  String k = (String)entry.getKey();  String v = (String)entry.getValue();  if(!"sign".equals(k) && null != v && !"".equals(v)) {  sb.append(k + "=" + v + "&");  }  }  sb.append("key=" + API_KEY);  //算出摘要  String mysign = MD5.MD5Encode(sb.toString(), characterEncoding).toLowerCase();  String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();  //System.out.println(tenpaySign + "    " + mysign);  return tenpaySign.equals(mysign);  }  /*** @author* @date 2016-4-22* @Description:sign签名* @param characterEncoding*            编码格式* @param parameters*            请求参数* @return*/  public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  StringBuffer sb = new StringBuffer();  Set es = packageParams.entrySet();  Iterator it = es.iterator();  while (it.hasNext()) {  Map.Entry entry = (Map.Entry) it.next();  String k = (String) entry.getKey();  String v = "";try {v = (String) entry.getValue();} catch (Exception e) {// TODO: handle exceptionv = entry.getValue() + "";}if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  sb.append(k + "=" + v + "&");  }  }  sb.append("key=" + API_KEY);  String sign = MD5.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  return sign;  }  /*** @author* @date 2016-4-22* @Description:将请求参数转换为xml格式的string* @param parameters*            请求参数* @return*/  public static String getRequestXml(SortedMap<Object, Object> parameters) {  StringBuffer sb = new StringBuffer();  sb.append("<xml>");  Set es = parameters.entrySet();  Iterator it = es.iterator();  while (it.hasNext()) {  Map.Entry entry = (Map.Entry) it.next();  String k = (String) entry.getKey();String v = "";try {v = (String) entry.getValue();} catch (Exception e) {// TODO: handle exceptionv = entry.getValue() + "";}if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {  sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");  } else {  sb.append("<" + k + ">" + v + "</" + k + ">");  }  }  sb.append("</xml>");  return sb.toString();  }  /*** 取出一个指定长度大小的随机正整数.*  * @param length*            int 设定所取出随机数的长度。length小于11* @return int 返回生成的随机数。*/  public static int buildRandom(int length) {  int num = 1;  double random = Math.random();  if (random < 0.1) {  random = random + 0.1;  }  for (int i = 0; i < length; i++) {  num = num * 10;  }  return (int) ((random * num));  }  /*** 获取当前时间 yyyyMMddHHmmss*  * @return String*/  public static String getCurrTime() {  Date now = new Date();  SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");  String s = outFormat.format(now);  return s;  }  public static JSONObject httpsRequestToJsonObject(String requestUrl,String requestMethod, String outputStr) {JSONObject jsonObject = null;try {StringBuffer buffer = httpsRequest(requestUrl, requestMethod,outputStr);jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("连接超时:" + ce.getMessage());} catch (Exception e) {log.error("https请求异常:" + e.getMessage());}return jsonObject;}private static StringBuffer httpsRequest(String requestUrl,String requestMethod, String output)throws NoSuchAlgorithmException, NoSuchProviderException,KeyManagementException, MalformedURLException, IOException,ProtocolException, UnsupportedEncodingException {URL url = new URL(requestUrl);HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setRequestMethod(requestMethod);if (null != output) {OutputStream outputStream = connection.getOutputStream();outputStream.write(output.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = connection.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;connection.disconnect();return buffer;}
}

转载于:https://www.cnblogs.com/fanyu666/p/5868536.html

java实现微信支付之扫码支付相关推荐

  1. Java PC端微信、支付宝扫码支付(二)

    Java PC端微信.支付宝扫码支付(二) 前几天写了微信支付,附上链接 https://blog.csdn.net/qq_43494610/article/details/90411391 ,今天抽 ...

  2. 微信PC端扫码支付 java 模式二的扫码支付

    前言 这次分享的是java对接微信的支付接口,实现电脑端扫码支付后,跳转支付成功页面的例子.之所以分享是微信的Api太坑了.留下的文档也少,对接过程中容易出现各种各样的问题,在实现这扫码支付功能的时候 ...

  3. 第三篇、记录微信统一支付、扫码支付开发

    项目中使用了微信的统一支付以及扫码支付,记录下学习记录 目录 项目中使用了微信的统一支付以及扫码支付,记录下学习记录 1.配置wechat4j.properties 文件 2.编写支付工具类 3.统一 ...

  4. VB.net开发微信、支付宝扫码支付源码

    扫码消费机介绍:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21914722028.2.2b826baawDkx32&id=170 ...

  5. VFP开发微信、支付宝扫码支付

    &&扫码消费机介绍:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-21914722028.4.2b826baa9cTxs0& ...

  6. 微信支付之扫码支付与小程序支付

    微信支付之扫码支付与小程序支付 前言:最近的需求中,频繁出现微信支付功能的开发,于是研读了微信官方开发文档以及相关代码做了以下总结,并记录在此,以备不时之需.如有不足之处,欢迎批评指正. 微信官方开发 ...

  7. php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南

    此文章入选<PHP领域内容榜>第4名 文章介绍 本文主要介绍通过thinkPHP5和第三方支付类包(WeChatDeveloper)实现快速接入微信扫码支付和微信H5手机网站支付(非微信浏 ...

  8. html+css+js实现微信和支付宝扫码支付前端

    本章教程,主要利用html+css+js技术实现微信和支付宝扫码支付前端页面. 目录 一.效果图预览 (1)支付宝扫码支付 (2)微信扫码支付 二.项目部分源码文件 (1)目录结构 (2)alipay ...

  9. 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

    前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...

  10. 手机H5支付和扫码支付的区别是什么?

    H5支付就是网页发起的微信.支付宝唤醒,通过微信自带的微信浏览器内jssdk发起的微信支付.支付宝也可以拉起手机浏览器唤醒支付宝发起支付宝支付. 扫码支付即通过手机app进行扫码付款,最常用的软件如微 ...

最新文章

  1. 力所能及的做些自己喜欢和有趣的事
  2. 中兴被禁在全球芯片市场掀起的波澜
  3. ES cross cluster search跨集群查询
  4. 【Vegas原创】GridView设定DataFormatString属性失效的解决方法
  5. 从零入门 FreeRTOS 操作系统之任务调度器
  6. 关于APP更新,两包共存的解决方案
  7. oracle java写目录权限_oracle分配权限 学习笔记--转载
  8. excel使用MySQL数据,如何使用mysql完成excel中的数据生成
  9. Linux 常用命令六 cp和mv
  10. TypeScript学习笔记(第一天)------创建简单的web应用
  11. 日报系统、周报系统如何便捷使用?——领导篇
  12. 利用讯飞语音识别技术开发离线语音控制系统(Windows平台)
  13. Kotlin by lazy解析及在findviewById场景中的使用
  14. 2021年安徽省大数据与人工智能应用竞赛 大数据-本科组赛题(省赛)
  15. 常见算法:c语言矩阵算法问题
  16. 从我自己的角度总结一下移动互联网的技术
  17. python的歌曲评论数据分析_用Python分析44万条数据,揭秘如何成为网易云音乐评论区的网红段子手...
  18. python一些方法
  19. 升级版王者荣耀铭文多功能助手微信小程序源码下载
  20. winform实现拖曳功能

热门文章

  1. 网页设计常用色彩搭配表
  2. java pdf417_java生成PDF417条码
  3. 三星s9Android9内测申请链接,国行三星S9/S9+开启安卓9.0内测
  4. linux 16.04系统下载,【Ubuntu1604镜像下载】乌班图系统Ubuntu 16.04 官方正式版-开心电玩...
  5. 酷派春雷com.yulong.android,酷派7260 (春雷)一键刷机教程,亲测可用
  6. android开发手机字体大小设置,安卓代码动态设置字体大小
  7. 众神的盛宴!阿里巴巴数学竞赛颁奖典礼,在江湖中一直流传许久的传说一一现身!...
  8. 程序设计基础C语言电子书,程序设计基础..pdf
  9. IEBrowser IE升级工具 下载
  10. 方舟php服务器控制,方舟基本管理命令代码