目录

使用须知:

一:maven

二:java代码

三:页面调用

四:测试


使用须知:

    需先在微信中开通支付宝H5支付,开通细节暂不描述。。

一:maven

        <dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version></dependency>

二:java代码

package com.vrv.Govern.controller.Wx;import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.vrv.Govern.util.DateUtils;
import com.vrv.Govern.util.PrintWriterUtils;
import com.vrv.Govern.util.ResultEntitylayui;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping("/Home_WxPay")
public class Home_WxPayController {/*** Created By Mengkai* 微信发起回调页面** @return*/@RequestMapping("/index")public String index() {return "Wx/index";}/*** Created By Mengkai* 支付成功回调页面** @return*/@RequestMapping(value = "succ", produces = "application/json;charset=utf-8")@ResponseBodypublic String succ() {return "Wx/succ";}/*** Created By Mengkai* 发起支付方法** @param response* @param request*/@RequestMapping(value = "pay", produces = "application/json;charset=utf-8")@ResponseBodypublic void pay(HttpServletResponse response, HttpServletRequest request) {Gson gson = new GsonBuilder().serializeNulls().setDateFormat(DateUtils.DateFormat4).create();ResultEntitylayui mResultEntity = new ResultEntitylayui();try {long time = System.currentTimeMillis();XCFWXPayConfig xcfwxPayConfig = new XCFWXPayConfig(request);WXPay wxPay = new WXPay(xcfwxPayConfig);String spbill_create_ip = request.getParameter("ip");Map<String, String> map = new HashMap<>();map.put("nonce_str", WXPayUtil.generateNonceStr());map.put("body", "缴纳");map.put("out_trade_no", "Dj" + time);map.put("total_fee", "1");map.put("spbill_create_ip", spbill_create_ip);map.put("notify_url", "http://cs/cs/css/payNotify.active");map.put("trade_type", "MWEB");Map<String, String> res = wxPay.unifiedOrder(map);//拼接链接String mweb_url = "";if (res.containsKey("mweb_url")) {String redirectUrl = "http://cs/cs/cs/succ.active";mweb_url = res.get("mweb_url") + "&redirect_url=" + URLEncoder.encode(redirectUrl, "GBK");}//返回链接,为前台提供跳转mweb_url,唤起微信mResultEntity.setData(mweb_url);PrintWriterUtils.printWriter(response, gson.toJson(mResultEntity));} catch (Exception e) {e.printStackTrace();}}/*** Created By Mengkai* 处理回调** @param request* @param response*/@RequestMapping(value = "payNotify", produces = "application/json;charset=utf-8")@ResponseBodypublic synchronized void payNotify(HttpServletRequest request, HttpServletResponse response) {System.out.println("进入回调");try {String resXml = "";XCFWXPayConfig xcfwxPayConfig = new XCFWXPayConfig(request);WXPay wxPay = new WXPay(xcfwxPayConfig);InputStream inStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outSteam.write(buffer, 0, len);}outSteam.close();inStream.close();String result = new String(outSteam.toByteArray(), "utf-8");// 获取微信调用我们notify_url的返回信息Map<String, String> map = WXPayUtil.xmlToMap(result); //微信回调后详细参数if (wxPay.isPayResultNotifySignatureValid(map)) {//TODO::业务处理开始System.out.println("业务处理开始");//订单入库//TODO::业务处理结束}BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
}

特别说明:

这两个工具类是调用及返回json数据的工具类,在使用时可换为自己使用的方式调用

此工具类为实体类,用于封装数据,使用时也可换为自己使用的方式,内容示例,

回调地址:

这两项需更换,其他页面跳转自行调整

工具类

package com.vrv.Govern.controller.Wx;import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;/*** Http客户端工具类<br/>* 这是内部调用类,请不要在外部调用。** @author miklchen**/
public class HttpUtil {private final static int CONNECT_TIMEOUT = 5000; // in millisecondsprivate final static String DEFAULT_ENCODING = "UTF-8";public static String postData(String urlStr, String data) {return postData(urlStr, data, null);}public static String postData(String urlStr, String data, String contentType) {BufferedReader reader = null;try {URL url = new URL(urlStr);URLConnection conn = url.openConnection();conn.setDoOutput(true);conn.setConnectTimeout(CONNECT_TIMEOUT);conn.setReadTimeout(CONNECT_TIMEOUT);if (contentType != null)conn.setRequestProperty("content-type", contentType);OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);if (data == null)data = "";writer.write(data);writer.flush();writer.close();reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));StringBuilder sb = new StringBuilder();String line = null;while ((line = reader.readLine()) != null) {sb.append(line);sb.append("\r\n");}return sb.toString();} catch (IOException e) {} finally {try {if (reader != null)reader.close();} catch (IOException e) {}}return null;}/*** 获取真实ip地址 通过阿帕奇代理的也能获取到真实ip* @param request* @return*/public static String getRealIp(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}}

配置类:

package com.vrv.Govern.controller.Wx;import com.github.wxpay.sdk.WXPayConfig;import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;/*** Created by 15117 on 2018/11/27.*/public class XCFWXPayConfig implements WXPayConfig {private byte[] certData;public XCFWXPayConfig(HttpServletRequest request) throws Exception {//获取apiclient_cert.pem的路径String savedDir = request.getSession().getServletContext().getRealPath("/");String certPath = savedDir + "common/Wx/cert/apiclient_cert.pem";File file = new File(certPath);InputStream stream = new FileInputStream(file);this.certData = new byte[(int) file.length()];stream.read(this.certData);stream.close();}@Overridepublic String getAppID() {return "wx311357d055a3595wa";}@Overridepublic String getMchID() {return "15352222781";}@Overridepublic String getKey() {return "YzCkxvBtqdJbLxHM3333GxwoeGLUUcb";}@Overridepublic InputStream getCertStream() {return new ByteArrayInputStream(this.certData);}@Overridepublic int getHttpConnectTimeoutMs() {return 8000;}@Overridepublic int getHttpReadTimeoutMs() {return 10000;}
}

特别注意:

此文件下载地址:https://download.csdn.net/download/qq_41712834/11694154

绑定appid

按照申请的微信支付的数值填入

三:页面调用

页面访问:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>微信支付</title><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"><!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 --><!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 --><!--[if lt IE 9]><script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script><script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script><![endif]-->
</head>
<body>
<div class="container"><h1>微信支付!!</h1><form role="form"><div class="form-group"><label for="price">支付金额</label><input type="text" class="form-control" value="0.01" readonly id="price" placeholder=""></div><button type="button" onclick="sub()" class="btn btn-default">提交</button></form>
</div><script type="text/javascript" src="../common/js/jquery-3.3.1.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="../common/app/js/bootstrap.min.js"></script>
<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
<script>var ip = returnCitySN.cip;function sub(){$.ajax({url:"../Home_WxPay/pay.active",data:{'ip':ip},type:'post',dataType:'json',success:function(r){location.href=r.data;}});}</script>
</body>
</html>

使用时需要更换jquery  的路径

成功或失败调用的页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><title>支付成功</title><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"><!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 --><!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 --><!--[if lt IE 9]><script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script><script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script><![endif]-->
</head>
<body>
<h1><span class="glyphicon glyphicon-ok"></span> 支付成功!</h1>
<script src="../common/app/js/jquery.min.js"></script>
<!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<script src="../common/app/js/bootstrap.min.js"></script></body>
</html>

使用时需要更换jquery  的路径

四:测试

调用页面

ps:不清楚的可私聊哦,

java 微信 H5支付相关推荐

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

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

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

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

  3. 记一次微信H5支付失败(网络环境未能通过安全验证,请稍后再试)解决方案

    产品过来反馈,在调起微信支付时,报以下错误,上网搜了下,好像是IP不一致导致的,解决方案如下: -------------------------------------------------- 官 ...

  4. 记录下关于微信h5支付那点事儿(百分之80拷贝官方)

    LZ-Says:困意上来,感觉简直痛不欲生~ 生亦何欢~!!! 前言 这俩天在玩微信的H5支付,不得不说,腾讯出品,Enmmm,懂就好... 原想着这是一件很easy的东西,WebView加载一个地址 ...

  5. 微信H5支付 终于跑起来了

    <!-- 微信 --> <dependency><groupId>com.github.binarywang</groupId><artifact ...

  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. 音频监控叫好又叫座,核心部件拾音器怎么装?
  2. Chrome DevTools — Network 1
  3. 华为鸿蒙麒麟玉兔_华为P50除了麒麟9000,还预装鸿蒙系统,比iPhone12值得买
  4. matplotlib绘制箭头
  5. 强制推送代码到远程仓库
  6. 《node.js开发指南》读后感
  7. 【编译器】VSCode配置Go语言开发环境
  8. 并发控制技术手段之多版本(三)
  9. 微电子学概论简要笔记
  10. eclipse java常用插件_Java 开发的 10 大必备 Eclipse 插件
  11. jiacu的css,css 加粗(css font
  12. Yate学习--基于Windows安装和运行Yate
  13. 猪齿鱼2.0版本发布,解锁更多新特性,提升研发管理效率
  14. EVE-NG模拟器教程(四)——常用镜像导入和使用
  15. EPICS--areaDetector--ADEiger
  16. 人之间的尊重是相互的_人与人之间彼此尊重是相互的,你若敬我一尺,我必敬你一丈...
  17. 面向开发者的 Android 8.0 Oreo 详细介绍
  18. Flink DataStream API(基础版)
  19. PHICH介绍(2)
  20. 机器学习——神经网络模型

热门文章

  1. Android 资源
  2. 【研究计划书】疾病检测中的语音生物标识研究
  3. 上界通配符和下界通配符
  4. android adb卸载软件
  5. 数据工程系列精讲(第三讲): Data-centric AI 之特征工程
  6. net程序员应该掌握的常用类库
  7. NYOJ101两点距离
  8. C语言calloc()函数
  9. 基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位
  10. H5移动端痛点问题(不定期更新)