• 去微信支付申请得到三个参数 API_KEY、APP_ID、MCH_ID
  • 微信支付配置域名的时候直接配置一级域名。
  • 下面参数说明。文档地址https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=9_20&index=1
  • 调用微信统一下单接口,得到微信那边给过来的链接 ,前端直接 跳转打开这个链接 回自动唤醒微信支付功能。然后回调地址也必须是外网可以访问 。回调地址必须是微信支付配置的域名下,redirect_url可以用来做跳转页面,不管成功或者失败都会调到这个地址上面 (redirect_url 文档说明)
  • spbill_create_ip 不能是127.0.0.1 ,设置服务器IP地址即可
  • 代码里面有很多工具类,自己百度搞下就有
package com.example.demo.pay.service.Impl;import com.example.demo.common.constants.Message;
import com.example.demo.common.enums.ResponseEnum;
import com.example.demo.common.utils.*;
import com.example.demo.pay.service.WeChatService;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.*;@Service
public class WeChatServiceImpl implements WeChatService {private final static Logger logger = LoggerFactory.getLogger(WeChatServiceImpl.class);//API_KEYprivate static String API_KEY = "xxxxxxx";//公众账号IDprivate static  String APP_ID="xxxxxxx";//商户号private static String MCH_ID="xxxxxxxxx";//回调地址private static String NOTIFY_URL="http://xxxxxxxx/wx/callBlack";//支付回调页面private static String REDIRECT_URL="http://xxxxxxxxxxxc/REDIRECT_URL.html?orderNo=";//服务端IPprivate static String SPBILL_CREATE_IP="xxx.xxx.xx.xx";// 微信支付统一接口(POST)private final static String WX_PAY_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";// 微信订单查询接口(POST)public final static String WX_CHECK_ORDER_URL = "https://api.mch.weixin.qq.com/pay/orderquery";/*** 微信h5支付** @return*/@Overridepublic Message wxpay(HttpServletRequest request,String orderNo) {String nonce_str = generateNonceStr();int total_fee = 1;double money=total_fee;String body = "购买xxxxxxxxxx" + (money / 100) + "元";String out_trade_no = orderNo;String spbill_create_ip = SPBILL_CREATE_IP;//String time_start= DateUtil.getAtPersent();//交易起始时间//String time_expire= DateUtil.getBeformTime(5);//交易结束时间String trade_type = "MWEB";//H5支付的交易类型为 MWEBString scene_info = "{'h5_info': {'type':'Wap','wap_url': 'https://pay.qq.com','wap_name': '产品购买'}}";SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();packageParams.put("appid", APP_ID);// 公众账号IDpackageParams.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", total_fee);// 总金额(单位分)packageParams.put("spbill_create_ip", spbill_create_ip);//发起人IP地址packageParams.put("notify_url", NOTIFY_URL);// 回调地址packageParams.put("trade_type", trade_type);// 交易类型packageParams.put("scene_info", scene_info);String sign = PayCommonUtil.createSign("UTF-8", packageParams, API_KEY);// 签名packageParams.put("sign", sign);String mweb_url = "";Map<String,Object> data=new HashMap<>();try {String requestXML = PayCommonUtil.getRequestXml(packageParams);String resXml = HttpRequest.postData(WX_PAY_URL, requestXML);Map map = XMLUtil.doXMLParse(resXml);logger.info("map:{}"+map);String returnCode = (String) map.get("return_code");if ("SUCCESS".equals(returnCode)) {String resultCode = (String) map.get("result_code");if ("SUCCESS".equals(resultCode)) {logger.info("订单号:{}发起H5支付成功", out_trade_no);mweb_url = (String) map.get("mweb_url");} else {String errCodeDes = (String) map.get("err_code_des");logger.info("订单号:{}发起H5支付(系统)失败:{}", out_trade_no, errCodeDes);}} else {String returnMsg = (String) map.get("return_msg");logger.info("(订单号:{}发起H5支付(通信)失败:{}", out_trade_no, map);}} catch (Exception e) {logger.error("订单号:{}发起H5支付失败(系统异常))", out_trade_no, e);}try {String url = URLEncoder.encode(REDIRECT_URL+out_trade_no, "utf-8");//redirect_url参数,来指定回调页面mweb_url=mweb_url+"&redirect_url="+url;}catch (Exception e){logger.error("URl进行Encode异常:{}", e);}data.put("url",mweb_url);data.put("orderNo",out_trade_no);return new Message(ResponseEnum.SUCCESS, data);}/*** 微信h5支付回调方法** @param request* @param response*/@Overridepublic void weixinCallback(HttpServletRequest request, HttpServletResponse response) {try {// 读取参数InputStream inputStream = request.getInputStream();StringBuffer sb = new StringBuffer();String s;BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));while ((s = in.readLine()) != null) {sb.append(s);}in.close();inputStream.close();// 解析xml成mapMap<String, String> m = new HashMap<String, String>();m = XMLUtil.doXMLParse(sb.toString());// 过滤空 设置 TreeMapSortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator it = m.keySet().iterator();while (it.hasNext()) {String parameter =String.valueOf( it.next());String parameterValue = m.get(parameter);String v = "";if (null != parameterValue) {v = parameterValue.trim();}packageParams.put(parameter, v);}logger.info("回调参数 map:{}"+packageParams);// 账号信息String key = API_KEY; // key// 判断签名是否正确if (PayCommonUtil.isTenpaySign("UTF-8", packageParams, key)) {logger.info("微信支付成功回调");// ------------------------------// 处理业务开始// ------------------------------String resXml = "";if ("SUCCESS".equals(String.valueOf(packageParams.get("result_code")))) {// 这里是支付成功String orderNo = String.valueOf(packageParams.get("out_trade_no"));logger.info("付款成功,微信订单号:{}", orderNo);// 这里 根据实际业务场景 做相应的操作// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.resXml = "<xml>"+ "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";} else {logger.info("支付失败,错误信息:{}", packageParams.get("err_code"));resXml = "<xml>"+ "<return_code><![CDATA[FAIL]]></return_code>"+ "<return_msg><![CDATA[报文为空]]></return_msg>"+ "</xml> ";}// ------------------------------// 处理业务完毕// ------------------------------BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();} else {logger.info("通知签名验证失败");}} catch (Exception e) {logger.error("微信H5支付回调异常{}:", e.toString(), e);}}/*** 微信订单查询** @param request* @param out_trade_no* @return*/@Overridepublic Message weChatQuery(HttpServletRequest request, String out_trade_no) {String nonce_str = generateNonceStr();SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();packageParams.put("appid", APP_ID);// 公众账号IDpackageParams.put("mch_id", MCH_ID);// 商户号packageParams.put("nonce_str", nonce_str);// 随机字符串packageParams.put("out_trade_no",out_trade_no);//订单NoString sign = PayCommonUtil.createSign("UTF-8", packageParams, API_KEY);// 签名packageParams.put("sign", sign);Map<String,Object> data=new HashMap<>();data.put("pay_success_url",PAY_SUCCESS_URL);data.put("pay_error_url",PAY_ERROR_URL);try {String requestXML = PayCommonUtil.getRequestXml(packageParams);String resXml = HttpRequest.postData(WX_CHECK_ORDER_URL, requestXML);Map map = XMLUtil.doXMLParse(resXml);logger.info("map:{}"+map);String returnCode = (String) map.get("return_code");if ("SUCCESS".equals(returnCode)) {String resultCode = (String) map.get("result_code");if ("SUCCESS".equals(resultCode)) {String tradeState = (String) map.get("trade_state");logger.info("tradeState:{}" + tradeState);logger.info("订单号:{}", out_trade_no);data.put("orders",map);boolean paySuccess=paySuccess(tradeState);if (paySuccess == true)return new Message(ResponseEnum.SUCCESS, data);} else {String errCodeDes = (String) map.get("err_code_des");logger.info("订单号:{}订单查询失败(系统)失败:{}", out_trade_no, errCodeDes);}} else {String returnMsg = (String) map.get("return_msg");logger.info("(订单号:{}订单查询失败:{}", out_trade_no, returnMsg);}} catch (Exception e) {logger.error("订单号:{}订单查询失败(系统异常))", out_trade_no, e);}return new Message(ResponseEnum.FALL,data);}/*** 获取随机字符串 Nonce Str** @return String 随机字符串*/public static String generateNonceStr() {String noncestr = RandomStringUtils.randomAlphanumeric(16);return noncestr;}/*** 生成系统当前时间戳** @return*/public static String create_timestamp() {return Long.toString(System.currentTimeMillis() / 1000);}public static boolean paySuccess(String tradeState){if("SUCCESS".equalsIgnoreCase(tradeState)){return  true;}return  false;}
}

SpringBoot 微信H5支付相关推荐

  1. 【微信开发第四章】SpringBoot实现微信H5支付

    前言 在进行微信公众号业务开发的时候,微信支付可以说是非常重要的一环.该篇文章每一步都有记录,力争理解的同时各位小伙伴也能够实现功能 文章目录 前言 1.公众号配置 2.微信支付实现代码 总结 1.公 ...

  2. 微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」

    前言 微信支付-微信H5外部浏览器支付「本文」 微信H5内部浏览器支付「待写」 PC端扫码支付「待写」 一直计划着写一写微信支付相关的文章,希望能加深一下自己的印象,拖了一天又一天- 最近终于空出时间 ...

  3. 微信h5支付,微信外浏览器支付实现

    对接第三方比较重要的点都有什么? 1.按规则 2.单独封装 3.做好出入参 2021-02-07修改 看一下官方文档还是很必要的,知道必不可少的参数是什么:https://pay.weixin.qq. ...

  4. 解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转)

    解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转) 参考文章: (1)解决iOS微信H5支付跳转微信后不返回App问题(Swift-WKWebview)(转) ( ...

  5. app 访问h5 如何截取_微信H5支付申请相关问题

    之前的文章「微信支付申请相关问题」里说过微信公众号和 APP 申请微信支付,今天来说下微信 H5 支付的申请. 背景介绍 H5 支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认 ...

  6. Android 应用内微信 H5 支付

    一般情况下,要实现应用内支付接入 App 支付 SDK 即可满足业务需求,不过考虑到对于一些类似游戏中心的场景,更多是需要支持 H5 支付.相对微信来说,支付宝的对接简单完善很多,所以本篇文章主要说说 ...

  7. php根据浏览器调用支付_Android通过外部浏览器调用微信H5支付,Android+PHP详解

    看了好多关于讲解微信H5支付开发的文章,大多数都是通过微信内部浏览器来调用支付接口(其实就是公众号支付),可能是因为H5支付接口刚开放不久吧. 微信官方体验链接:http://wxpay.wxutil ...

  8. php微信h5支付demo,微信h5支付 demo-HTML5微信支付DEMO下载 最新版--pc6下载站

    在微信支付已经霸占了大部分人生活习惯的年代,一个不支持微信支付的商家都不好意思开店了,程序猿们可以下载查看HTML5微信支付DEMO来帮助您熟悉微信支付的代码,马上下载查看微信h5支付demo的内容吧 ...

  9. Android中使用微信H5支付时支付结果刷新问题

    目录 前言: 1.查找资料: 2.解决问题的思路: a.核心逻辑就是截取回调地址,截图如下: b.设置isWxPay为true c.用户支付取消.失败.成功返回App时刷新界面: 3.通过以上几步解决 ...

  10. 微信H5支付(报跨域问题)

    H5支付开发文档 在开发微信H5[支付]的时候, 后端返回的是一个文件, 我在前端打开的时候会报一个跨域的错误, 后来查阅到, 让后端返回微信支付转跳链接地址, 然后前端直接location.href ...

最新文章

  1. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
  2. OpenCV使用Kinect和其他OpenNI兼容的深度传感器
  3. HashCode和hashMap、hashTable
  4. linux 远程拒绝服务,Linux Kernel SCTP远程拒绝服务漏洞
  5. 【Python】Python3.7.3 - sys.path 模块搜索路径详解
  6. 数据类型的基本表达式
  7. 如何建立数据平台?看上市公司的选择!
  8. NeHe_Lesson8 Blending
  9. 基于STM32的医院呼叫系统设计
  10. 博弈论 | 三姬分金与囚徒困境
  11. Nginx配置防盗链和内核参数优化
  12. Unity 生命周期
  13. 条码打印软件制作数字+字母的流水号二维码
  14. 什么是枚举?(个人理解)
  15. 计算机二级 ms office高级应用,全国计算机等级考试二级教程:MS Office高级应用...
  16. 业务“多面手”,基于低代码平台的CRM系统
  17. 耀之阳电商:高点击率主图的制作方法
  18. python长房集团登陆j_password参数破解
  19. live555资料整合
  20. 太恐怖了!什么都能查!!

热门文章

  1. eps提取高程点在哪里_Eps总结(3)——Eps使用点云生成等高线及高程点
  2. ITIL4实用指南 | ITSM的未来属于敏捷
  3. proteus中的米字(14段)数码管用法
  4. html导出excel设置宽度,导出excel图片如何把大小控制
  5. shell脚本学习指南-学习(2)
  6. OpenGL编程指南-光照
  7. 基于node.js的网上书店系统的设计与实现.rar(项目源码+论文)(开发文档+nodejs配置+安装+运行教学.zip)
  8. 谈谈eXeScope这款exe修改器
  9. Delphi7中利用定时器和TRzProgressBar去显示进度条
  10. vc2008对话框中mschart控件应用