1、调用微信统一下单接口,必要参数:appid(公众账号ID)、mch_id(商户号)、nonce_str(随机字符串)、sign(签名)、body(商品描述)、out_trade_no(商户订单号)、total_fee(标价金额)、spbill_create_ip(终端IP)、notify_url(通知地址)、trade_type(交易类型)

notify_url必须是外网可访问的

(官方接口文档https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)

        SortedMap<String, Object> parameters = new TreeMap<String, Object>();//微信给的appidparameters.put("appid", "wxd678efh567hg6787");//微信给的商户号parameters.put("mch_id", "1230000109");// 默认 "WEB"parameters.put("device_info", "WEB");//商品描述parameters.put("body", "大马猴");// 32 位随机字符串parameters.put("nonce_str", wxUtils.gen32RandomString());//通知地址(支付成功后,微信会携带参数访问该地址,接口内根据支付状态进行下一步处理)parameters.put("notify_url", notifyUrl);//商户订单号 也能用gen32RandomString(),但是一定要从头到尾都是一个编号,生成就存库parameters.put("out_trade_no", orderId);//标价金额 参数单位为(分*100) 为元parameters.put("total_fee", price.multiply(BigDecimal.valueOf(100)).intValue());//终端IPparameters.put("spbill_create_ip", getIpAddr(HttpServletRequest));//交易类型parameters.put("trade_type", "APP");//附加数据(商户内部做判断的参数,微信访问回调地址时会把他原封不动带回来)parameters.put("attach", "1");// 签名 sign 必须在最后,key是微信给的商家私钥parameters.put("sign", wxUtils.createSign(parameters, key));// 执行 HTTP 请求,统一下单地址:https://api.mch.weixin.qq.com/pay/unifiedorderString result = wxUtils.executeHttpPost(placeUrl, parameters);

生成32位随机字符串的方法(对应参数nonce_str)

    /*** 生成 32 位随机字符串,包含:数字、字母大小写** @return*/public String gen32RandomString() {char[] dict = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0','A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z','a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};StringBuffer sb = new StringBuffer();Random random = new Random();for (int i = 0; i < 32; i++) {sb.append(String.valueOf(dict[(int) (Math.random() * 36)]));}return sb.toString();}

获取终端ip方法(对应参数spbill_create_ip)


package com.wyzz.model.common.ip;import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.servlet.http.HttpServletRequest;public class IpUtil {public IpUtil() {}public static String getIpAddr(HttpServletRequest request) {String ipAddress = null;try {ipAddress = request.getHeader("x-forwarded-for");if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getHeader("Proxy-Client-IP");}if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getHeader("WL-Proxy-Client-IP");}if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {ipAddress = request.getRemoteAddr();if (ipAddress.equals("127.0.0.1")) {InetAddress inet = null;try {inet = InetAddress.getLocalHost();} catch (UnknownHostException var4) {var4.printStackTrace();}ipAddress = inet.getHostAddress();}}if (ipAddress != null && ipAddress.length() > 15 && ipAddress.indexOf(",") > 0) {ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));}} catch (Exception var5) {ipAddress = "";}return ipAddress;}
}

生成签名方法(对应参数sign)

    /*** 第一次签名** @param parameters 数据为服务器生成,下单时必须的字段排序签名* @param key* @return*/public String createSign(SortedMap<String, Object> parameters, String key) {StringBuffer sb = new StringBuffer();//所有参与传参的参数按照accsii排序(升序)Set es = parameters.entrySet();Iterator it = es.iterator();while (it.hasNext()) {Map.Entry entry = (Map.Entry) it.next();String k = (String) entry.getKey();Object v = entry.getValue();if (null != v && !"".equals(v)&& !"sign".equals(k) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + key);return encodeMD5(sb.toString());}

2、解析返回结果,并返给前端,前端通过这些参数调起微信支付

    /*** 第二次签名** @param result 数据为微信返回给服务器的数据(XML 的 String),再次签名后传回给客户端(APP)使用*/public Map<String, Object> createSign2(String result, String key) throws IOException {SortedMap<String, Object> map = new TreeMap<>(transferXmlToMap(result));CreateOrderDto createOrderDto = new CreateOrderDto();Map<String, Object> app = new HashMap<>();app.put("appid", map.get("appid"));app.put("partnerid", map.get("mch_id"));app.put("prepayid", map.get("prepay_id"));// 固定字段,保留,不可修改app.put("package", "Sign=WXPay");app.put("noncestr", map.get("nonce_str"));// 时间为秒,JDK 生成的是毫秒,故除以 1000app.put("timestamp", System.currentTimeMillis() / 1000);String sign = createSign(new TreeMap<>(app), key);app.put("sign", sign);return app;}

3、支付成功后,微信访问商户服务器的回调接口(步骤一中的notify_url参数

    /*** 微信回调** @param request  请求对象* @param response 返回对象*/@SneakyThrows@RequestMapping(value = "/wxpayNotify", method = {RequestMethod.POST, RequestMethod.GET})@ApiIgnorepublic void wxNotify(HttpServletRequest request, HttpServletResponse response) {try {// 预先设定返回的 response 类型为 xmlresponse.setHeader("Content-type", "application/xml");// 读取参数,解析Xml为mapMap<String, String> map = wxUtils.transferXmlToMap(wxUtils.readRequest(request));//此段根据返回数据处理商户的订单信息,如:修改订单状态为支付成功,发货,充值等操作//如果处理成功返回success,失败返回fail//String result = success();//String result = fail();response.getWriter().write(result);} catch (Exception e) {response.setHeader("Content-type", "application/xml");response.getWriter().write(wxUtils.fail());}}
    public String fail() {return "<xml>\n" +"  <return_code><![CDATA[FAIL]]></return_code>\n" +"  <return_msg><![CDATA[]]></return_msg>\n" +"</xml>";}public String success() {return "<xml>\n" +"  <return_code><![CDATA[SUCCESS]]></return_code>\n" +"  <return_msg><![CDATA[OK]]></return_msg>\n" +"</xml>";}

springboot 微信支付接口相关推荐

  1. PC网站微信扫码支付,Native支付,“当前商户号暂不支持关联该类型的appid“,“签名错误,请检查后再试““springBoot 微信支付“

    springBoot 微信支付 PC网站微信扫码支付-Native支付 一.采坑大合集 1.当前商户号暂不支持关联该类型的appid 2.签名错误,请检查后再试 二.springboot集成微信支付D ...

  2. 微信支付接口开发过程

    第一步,微信支付接口申请: [1]首先须要申请成为服务号.并在申请微信认证后: [2]填写商户基本资料.业务基本资料.財务审核资料. [3]通过审核进入开发流程.通过开发接口文档的指引,完毕开发. [ ...

  3. Magento微信支付接口开发小记

    姗姗来迟的Magento微信支付接口插件 半年之前,有朋友网站需要接入微信支付,是Magento站,于是花费了近二周时间,研究微信开发文档.示例代码,并初步制作了个支付模块,不巧的是,朋友的微信支付接 ...

  4. 调用微信支付接口总结

        项目里面用到了微信支付的功能,照着文档学习了一下,这里做个总结来记录.项目用到的是anglusJS来做前端开发,我这边简化了,用的ajax进行异步的调用,然后业务也直接写在了控制层(不过不应该 ...

  5. java后台提供ios微信支付接口

    提供微信支付接口,需要先在微信开放平台(https://open.weixin.qq.com/)申请账号,进行开发者资格认证通过后创建应用. 创建成功后会有对应应用的AppID和AppSecret这个 ...

  6. 关于个人如何接入微信支付接口,适用于h5,小程序等应用场景

    关于个人如何接入微信支付接口,适用于h5,小程序等应用场景, 众所周知,要想使用微信支付实现公众号.商城.小程序.h5网页等产品或者服务购买,需要申请微信小程序或者服务号,并且要企业认证,还要提交微信 ...

  7. php微信支付需要哪些设置,如何申请和配置微信支付接口?

    如何让自己的网站能够在电脑端和移动端能够使用微信支付呢?你只需要申请微信支付接口并搭建一个支持微信支付的网站(同时支持电脑端.手机.微信公众号),我们以米拓企业建站系统及米拓商城模块为例. 安装米拓企 ...

  8. php 调用微信支付的时间戳,前端调用微信支付接口

    支付按钮的点击事件$(´.Save_Patient_Msg´).click(function(){ $(´.Save_Patient_Msg´).off(´click´); var hrdfId = ...

  9. 后端---最全最简单细致的Java接入微信支付接口(Native接入)

    首先,我简单总结一下这几天搞微信支付和支付宝支付接口的体会,通过这几天的动手实操,加强了自己对SSM框架的认识,以及对业务逻辑的思路,明白了许多以前不懂的许多空白. 做支付宝接口的接入完全可以按照支付 ...

  10. Android_APP 微信支付接口开发

    1.首先说一下我们在开发微信支付接口的时候遇到最多和最疑惑的问题,那就是明明 appid.商户号.API密钥 都对照了好几遍确实是和自己的一样,并且也没有在Log日志中出现签名错误等信息,却始终调不起 ...

最新文章

  1. [转] Nodejs 进阶:Express 常用中间件 body-parser 实现解析
  2. Python将新项添加到字典[重复]
  3. Hi3516A开发--/etc/passwd
  4. Android 通过Uri获取Bitmap对象
  5. 华为荣耀20和x10比较_华为和荣耀旗舰该如何选?其实懂手机的朋友只选择前者...
  6. java AST 表达式_java AST JCTree简要分析
  7. 如果现在单位让你内退,拿基本工资,不用上班,你是否愿意?
  8. Linux下10 个最酷的 Linux 单行命令(转载)
  9. 回复《论WEB标准专家》。
  10. awk当中使用外部变量
  11. php伪静态后301,php伪静态htaccess实现301重定向方法
  12. 挑战程序设计竞赛(第一章)
  13. 禁止华硕触摸板的纠结历程
  14. froala editor导出html,angular2 富文本编辑器 -- froala editor 吐血推荐
  15. 【书记舞】MMD动作+镜头+配音下载
  16. HDU-4515,小Q系列故事——世界上最遥远的距离(日期计算)
  17. (原创)android6.0系统 PowerManager深入分析
  18. Jenkins笔记02-Jenkins安装和持续集成环境配置
  19. 扑克牌java发牌_Java练习——扑克牌发牌器
  20. 100天精通Python(进阶篇)——第34天:正则表达式大总结(基础+代码实战)

热门文章

  1. QData QPair的组合使用例子一
  2. 中小尺寸常见显示屏分辨率列表
  3. 澳门科技大学计算机专业研究生,澳门科技大学 计算机专业
  4. 读书笔记——《图解TCP/IP》(1/4)
  5. 测试开发工作者日记:2020.6.10-6.11
  6. 计算机毕设(附源码)JAVA-SSM基于java学科竞赛管理系统
  7. 基于人工智能的搜索引擎优化软件-市场现状及未来发展趋势
  8. 树莓派正式开售CM4以及CM4 Lite,32个不同配置,最低25美元起售!
  9. 在虚拟机中ping了停不下来怎么办?
  10. 软件开发实习做什么_为什么要有开发人员实习时间