<!-- 微信 -->
<dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.github.liyiorg</groupId><artifactId>weixin-popular</artifactId><version>2.8.14</version></dependency>

微信H5支付,参考了很多资料踩了不少坑,终于做出来了,做个记录


import java.util.UUID;import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import weixin.popular.api.PayMchAPI;
import weixin.popular.bean.paymch.Refundquery;
import weixin.popular.bean.paymch.RefundqueryResult;
import weixin.popular.bean.paymch.SecapiPayRefund;
import weixin.popular.bean.paymch.SecapiPayRefundResult;
import weixin.popular.client.LocalHttpClient;public class WeixinPayUtils {/*** 公众号AppId*/public static final String APP_ID = "你的公众号AppId";/*** 公众号AppSecret*/public static final String APP_SECRET = "你的公众号AppSecret";/*** 微信支付商户号*/public static final String MCH_ID = "你的商户号";/*** 微信支付API秘钥*/public static final String API_KEY = "你的支付API秘钥";/*** 回调域名* 全域名比如 https://www.baidu.com*/public static final String REDIRECT_DOMAIN = "你的全域名";// 商户支付证书路径// 退款必备private static final String API_CLIENT_CERT_PATH = "/opt/cert_wxh5pay/apiclient_cert.p12";// 加载商户支付证书文件;// 退款必备static {LocalHttpClient.initMchKeyStore(MCH_ID, API_CLIENT_CERT_PATH);}private static final WxMpService wxMpService = new WxMpServiceImpl();private static final WxPayService wxPayService = new WxPayServiceImpl();static {WxMpInMemoryConfigStorage config = new WxMpInMemoryConfigStorage();config.setAppId(APP_ID);config.setSecret(APP_SECRET);wxMpService.setWxMpConfigStorage(config);WxPayConfig payConfig = new WxPayConfig();payConfig.setAppId(APP_ID);payConfig.setMchId(MCH_ID);payConfig.setMchKey(API_KEY);payConfig.setSignType(WxPayConstants.SignType.MD5);// h5公众号支付payConfig.setTradeType("MWEB");// 这里是调用支付接口之后 微信调用的回调路径payConfig.setNotifyUrl(REDIRECT_DOMAIN + "/ymlwx");wxPayService.setConfig(payConfig);}public static WxMpService wxMpService() {return wxMpService;}public static WxPayService wxPayService() {return wxPayService;}/*** @description:微信退款业务封装(支付押金退还);* @param PayLog*            order:支付订单信息 Double refundAmount:退款金额* @return 微信退款接口返回数据 true 退款成功 false 退款失败*/public static boolean refundOrder(String orderId, Integer refundAmount) {// 调用微信支付退款接口;SecapiPayRefund payRefund = new SecapiPayRefund();payRefund.setAppid(APP_ID);payRefund.setMch_id(MCH_ID);payRefund.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));payRefund.setOut_trade_no(orderId);// 支付订单号payRefund.setOut_refund_no(orderId);// 退款单号payRefund.setTotal_fee(refundAmount);// 原订单金额,单位:分;payRefund.setRefund_fee(refundAmount);// 退款订单金额,单位:分;SecapiPayRefundResult refundResult = PayMchAPI.secapiPayRefund(payRefund, API_KEY);// 微信支付退款接口返回数据验签;if (refundResult.getSign_status() != null && refundResult.getSign_status()) {// 退款信息提交成功;if ("SUCCESS".equals(refundResult.getReturn_code())) {return true;} else {System.out.println("微信退款接口(getResult_code):" + refundResult.getResult_code());}}return false;}// 微信退款结果查询public static boolean refundQuery(String orderId) {Refundquery refundquery = new Refundquery();refundquery.setAppid(APP_ID);refundquery.setMch_id(MCH_ID);refundquery.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));refundquery.setOut_refund_no(orderId);RefundqueryResult payRefundquery = PayMchAPI.payRefundquery(refundquery, API_KEY);if (null != payRefundquery && payRefundquery.getSign_status()) {if ("SUCCESS".equals(payRefundquery.getReturn_code())) {return true;} else {System.out.println("微信退款查询接口(result_code):" + payRefundquery.getResult_code());}}return false;}}

注意上面的金额做好处理,特别double类型,处理不好就是个坑

   // 微信支付@RequestMapping(value = "/wechatPay")@ResponseBodypublic ApiJsonRes h5Pay(HttpServletRequest request, HttpServletResponse response, String id) {Map<String, Object> result = new HashMap<>();ApiJsonRes apiJsonRes = new ApiJsonRes("0", "");Order findoneById = orderService.findoneById(id);if (null == findoneById) {apiJsonRes.setApiResCodeDesc("无此订单");return apiJsonRes;}result.put("success", false);try {WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();String goodsName = findoneById.getGoodsName();orderRequest.setBody(goodsName);orderRequest.setOutTradeNo(id);// 商品支付金额Integer salePrice = findoneById.getSalePrice();String total_fee = salePrice .toString().trim();// 金额做处理,否则容易报错String string = new BigDecimal(total_fee).multiply(new BigDecimal(100)).toString().split("\\.")[0];orderRequest.setTotalFee(Integer.valueOf(string));orderRequest.setSpbillCreateIp(HttpUtil.getRealIp(request));// H5支付标识为MWEBorderRequest.setTradeType("MWEB");orderRequest.setSceneInfo("{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"" + WeixinPayUtils.REDIRECT_DOMAIN+ "\",\"wap_name\": \"" + goodsName + "\"}}");orderRequest.setSignType("MD5");// 签名创建Map<String, String> packageParams = new HashMap<>();packageParams.put("appid", WeixinPayUtils.APP_ID);packageParams.put("mch_id", WeixinPayUtils.MCH_ID);packageParams.put("nonce_str", UUID.randomUUID().toString().replace("-", ""));packageParams.put("signType", orderRequest.getSignType());String sign = SignUtils.createSign(packageParams, "MD5", WeixinPayUtils.API_KEY, false);orderRequest.setSign(sign);WxPayMwebOrderResult orderResult = WeixinPayUtils.wxPayService().createOrder(orderRequest);String mwebUrl = orderResult.getMwebUrl();// response.sendRedirect(mwebUrl);result.put("success", true);apiJsonRes.setApiResCode("200");apiJsonRes.setData(mwebUrl);return apiJsonRes;} catch (Exception e) {result.put("errormsg", e.getMessage());}return apiJsonRes;}

可以先写自己的业务代码,再去支付

@RequestMapping("/ymlwx")public void weixin_notify(HttpServletRequest request, HttpServletResponse response, ModelMap model)throws Exception {String xmlMsg = readData(request);@SuppressWarnings("unchecked")Map<String, Object> params = XMLUtil.doXMLParse(xmlMsg);// 微信支付订单号String transaction_id = (String) params.get("transaction_id");// 商户订单号String out_trade_no = (String) params.get("out_trade_no");try {// 过滤空 设置 TreeMapSortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator<String> it = params.keySet().iterator();while (it.hasNext()) {String parameter = (String) it.next();String parameterValue = params.get(parameter) + "";String v = "";if (null != parameterValue) {v = parameterValue.trim();}packageParams.put(parameter, v);}// 查看回调参数String resXml = "";if ("SUCCESS".equals((String) packageParams.get("result_code"))) {// 支付成功之后写自己的业务代码orderService.doCallback(out_trade_no, transaction_id);mobileService.updateStatusById(out_trade_no, 2);// 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了.resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";} else {model.put("sHtmlText", "支付失败");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();} catch (Exception e) {e.printStackTrace();}}public static String readData(HttpServletRequest request) {BufferedReader br = null;try {StringBuilder result = new StringBuilder();br = request.getReader();for (String line; (line = br.readLine()) != null;) {if (result.length() > 0) {result.append("\n");}result.append(line);}return result.toString();} catch (IOException e) {throw new RuntimeException(e);} finally {if (br != null)try {br.close();} catch (IOException e) {e.printStackTrace();}}}

才开始写博客,有什么遗漏的可以留言我

微信H5支付 终于跑起来了相关推荐

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

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

  2. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

  3. Django整合微信h5支付

    终于在踩完了无数坑之后,发现这个流程必须记录下来.在这之前,本人不仅尝试过网上各种各样的帖子,也参考了微信支付的官方文档,都最后都是发现:要么难以理解,要么甚至按照微信支付的官方文档也会遇到问题. 虽 ...

  4. app中接入微信H5支付总结

    1. 支付宝app支付  2. 支付宝当面付 3. 支付宝手机网站支付 1.为什么没有直接接入微信app支付,而是采用H5支付? 因为app支付需要另外去微信开放平台申请一个appId,而公司的app ...

  5. 微信H5支付跳回app的问题

    最近使用到H5支付,需要在支付完成或者取消之后跳回到app.但是苹果做好H5支付只会跳转到Safair浏览器,这就需要找方法去解决了. 1.首先先配置微信支付的白名单. 在Xcode中,在plist文 ...

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

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

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

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

  8. Android 应用内微信 H5 支付

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

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

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

最新文章

  1. 实操教程|详细记录solov2的ncnn实现和优化
  2. 大厂围猎春招,年轻人却卸甲出逃
  3. 《Servlet和JSP学习指南》一第2章 Session管理 2.1 网址重写
  4. 去培训机构参加IT培训值不值
  5. QML中类似QMap的用法
  6. c语言利用sin约等于x-,用泰勒公式求sin(x)的近似值
  7. Shell--cut用法
  8. QT信号与槽机制需要注意的问题
  9. 数据库抽象类PDOStatement对象使用
  10. 【Linux】与用户管理相关的命令总结
  11. malloc和free
  12. SpringSecurity 跨域问题 Cors
  13. 搜狗深入布局人工智能 Q2营收利润创新高
  14. Nginx+PHP+MySQL+Ubuntu14.04 64位环境搭建
  15. linq 连接mysql_如何:使用 LINQ 查询数据库 - Visual Basic | Microsoft Docs
  16. 写完APDL命令流之后,如何运行TXT文件,直接生成k文件
  17. 计算机连接公用网络受限,本地连接受限制不能上网的原因及解决方法
  18. layui table表格隐藏
  19. Kubernetes核心原理(二)之Controller Manager
  20. Ip2region 离线IP地址定位库

热门文章

  1. MacBook Pro(13 英寸,2011 年末)A1278安装Windows11蓝屏代码WDF_VIOLATION问题解决
  2. Why Erlang suggest avoiding defensive programming( Joe Armstrong )
  3. WPF实现地震波警示效果
  4. 财务自由第一步:如何实现家庭现金流自由化
  5. 5岁了!我们和AWS中国一起成长
  6. 【React】找不到模块“./index.module.scss”或其相应的类型声明
  7. TwinCAT(倍福)获取驱动器电流教程
  8. 学会这三招,Docker 容器权限管理乐无忧!
  9. 想用“信息差”赚钱?你必须会这项基本技能!
  10. OPPO入股少儿编程教育平台编程猫 官网域名为纯字母域名codemao.cn