java微信支付接入流程详解

作者:只要你能好 时间:2023-07-28 18:37:46 

背景

由于项目是采用java编写的,微信包括微信支付大都是php相关,于是微信支付官方文档对java的支持就不是很友好,在网上找了很多文章,基本上没有一篇是真正跑的通的,经过一番整理,先将java接入微信支付详细流程总结出来以便后续使用。

步骤一

准备阶段:已认证微信号,且通过微信支付认证,这个可以看微信文档,很详细,这里就不再重复。

java微信支付接入流程详解

步骤二

配置授权目录,官方推荐使用https类型的url,不知道http能不能行,个人也推荐使用https的保证不会错。

java微信支付接入流程详解

配置授权域名

 java微信支付接入流程详解java微信支付接入流程详解

java微信支付接入流程详解

步骤三

微信支付二次开发所需要的参数:

APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)

java微信支付接入流程详解java微信支付接入流程详解

APP_ID和PARTNER_KEY(AppSecret)

java微信支付接入流程详解

PARTNER

 java微信支付接入流程详解java微信支付接入流程详解

APP_KEY(自行设置32位字符)

步骤四

4.1通过页面跳转到确认支付页面,其中的redirect_uri必须是配置授权目录下的


<html>
<head>
<title>支付测试</title>
</head>
<body>
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx619890d997071358&redirect_uri=https%3A%2F%2Fm.yangji.com%2Fpay%2FpayTest.jsp&response_type=code&scope=snsapi_base&state=123#wechat_redirect">支付测试</a>
</body>
</html>

4.2 获取到openid,再经服务器向微信请求获取prepay_id,封装字段并进行签名后通过jsapi调起微信支付

网页端


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="format-detection" content="telephone=no" />
<title>测试支付</title>
<link href="../css/css.css?v=1.0" rel="external nofollow" rel="stylesheet" type="text/css">
</head>
<body>
<div class="index_box">
<div class="apply_name">微信js支付测试</div>
<div class="branch_con">
<ul>
<li><span class="name">测试支付信息[]</span></li>
</ul>
<p class="cz_btn"><a href="javascript:pay();" rel="external nofollow" class="btn_1">立即支付</a></p>
</div>
</div>
<%
String code = request.getParameter("code");
%>
<input type="text" id="code" value="<%out.print(code); %>"/>
<input type="text" id="path" value="${pageContext.request.contextPath}"/>
<div><hr/>
code:<%out.print(code); %>
</div>
<script type="text/javascript">
 var appId,timeStamp,nonceStr,pg,signType,paySign;
function onBridgeReady(){
 WeixinJSBridge.invoke(
  'getBrandWCPayRequest', {
   "appId" : appId,  //公众号名称,由商户传入  
   "timeStamp": timeStamp,   //时间戳,自1970年以来的秒数  
   "nonceStr" : nonceStr, //随机串  
   "package" : "prepay_id=" + pg,  
   "signType" : signType,   //微信签名方式:  
   "paySign" : paySign //微信签名
  },
  function(res){  
   if(res.err_msg == "get_brand_wcpay_request:ok" ) {

alert("支付成功");
   }
  }
 );
}
 function pay(){
 var code = document.getElementById("code").value;
 var path = document.getElementById("path").value;
 send_request(function(value){
var json = eval("(" + value + ")");
if(json.length > 0){
 appId = json[0].appId;
 timeStamp = json[0].timeStamp;
 nonceStr = json[0].nonceStr;
 pg = json[0].pg;
 signType = json[0].signType;
 paySign = json[0].paySign;
 if (typeof WeixinJSBridge == "undefined"){
 if( document.addEventListener ){
  document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
 }else if (document.attachEvent){
  document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
  document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
 }
 }else{
 onBridgeReady();
 }
}
},path+"/pay/payparm.htm?openId="+code, true);
 }
function send_request(callback, urladdress,isReturnData){  
var xmlhttp = getXMLHttpRequest();
xmlhttp.onreadystatechange = function(){
  if (xmlhttp.readyState == 4) {
 try{
 if(xmlhttp.status == 200){
 if(isReturnData && isReturnData==true){
 callback(xmlhttp.responseText);
 }
 }else{
 callback("页面找不到!"+ urladdress +"");
 }
  } catch(e){
  callback("请求发送失败,请重试!" + e);
  }
 }
}
xmlhttp.open("POST", urladdress, true);
xmlhttp.send(null);
}
function getXMLHttpRequest() {
var xmlhttp;
if (window.XMLHttpRequest) {
try {
xmlhttp = new XMLHttpRequest();
xmlhttp.overrideMimeType("text/html;charset=UTF-8");
} catch (e) {}
} else if (window.ActiveXObject) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHttp");
} catch (e) {
try {
 xmlhttp = new ActiveXObject("Msxml3.XMLHttp");
} catch (e) {}
}
}
}
return xmlhttp;
}
</script>
</body>
</html>

服务器端


@RequestMapping("/pay/payparm")
public void payparm(HttpServletRequest request, HttpServletResponse response){
try {
// 获取openid
String openId = (String) request.getSession().getAttribute("openId");
if (openId == null) {
openId = getUserOpenId(request);
}

String appid = WXConfig.APP_ID;
String paternerKey = WXConfig.PERTNER_KEY;

String out_trade_no = getTradeNo();
Map<String, String> paraMap = new HashMap<String, String>();
paraMap.put("appid", appid);
paraMap.put("attach", "测试");
paraMap.put("body", "测试购买支付");
paraMap.put("mch_id", WXConfig.PARTNER);
paraMap.put("nonce_str", create_nonce_str());
paraMap.put("openid", openId);
paraMap.put("out_trade_no", out_trade_no);
paraMap.put("spbill_create_ip", getAddrIp(request));
paraMap.put("total_fee", "1");
paraMap.put("trade_type", "JSAPI");
paraMap.put("notify_url", "http://m.ebiaotong.com/WXPay/notify");// 此路径是微信服务器调用支付结果通知路径
String sign = getSign(paraMap, paternerKey);
paraMap.put("sign", sign);
// 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

String xml = ArrayToXml(paraMap);

String xmlStr = HttpKit.post(url, xml);

// 预付商品id
String prepay_id = "";

if (xmlStr.indexOf("SUCCESS") != -1) {
Map<String, String> map = doXMLParse(xmlStr);
prepay_id = (String) map.get("prepay_id");
}

String timeStamp = create_timestamp();
String nonceStr = create_nonce_str();
Map<String, String> payMap = new HashMap<String, String>();
payMap.put("appId", appid);
payMap.put("timeStamp", timeStamp);
payMap.put("nonceStr", nonceStr);
payMap.put("signType", "MD5");
payMap.put("package", "prepay_id=" + prepay_id);
String paySign = getSign(payMap, paternerKey);

payMap.put("pg", prepay_id);
payMap.put("paySign", paySign);

// 拼接并返回json
StringBuilder sBuilder = new StringBuilder("[{");
sBuilder.append("appId:'").append(appid).append("',")
 .append("timeStamp:'").append(timeStamp).append("',")
 .append("nonceStr:'").append(nonceStr).append("',")
 .append("pg:'").append(prepay_id).append("',")
 .append("signType:'MD5',")
 .append("paySign:'").append(paySign).append("'");
sBuilder.append("}]");
response.getWriter().print(sBuilder.toString());
response.getWriter().close();
} catch (Exception e) {
e.printStackTrace();
}
}

测试结果

java微信支付接入流程详解java微信支付接入流程详解

来源:https://blog.csdn.net/u012131769/article/details/52669988

标签:java,微信支付
0
投稿

猜你喜欢

  • SpringBoot之导入静态资源详解

    2021-06-22 05:01:30
  • Java获取时间年、月、日的方法

    2022-02-10 16:58:36
  • 如何用java实现分页查询

    2023-09-23 06:50:24
  • Spring Boot与RabbitMQ结合实现延迟队列的示例

    2021-08-31 02:02:01
  • Android使用自定义View实现360手机卫士波浪球进度的效果

    2023-03-21 19:18:34
  • Android时间对话框TimePickerDialog详解

    2022-08-23 05:50:06
  • C#实现斐波那契数列的几种方法整理

    2023-09-02 05:05:58
  • C#中WPF使用多线程调用窗体组件的方法

    2023-04-24 11:47:57
  • Java中字符串String的+和+=及循环操作String原理详解

    2023-05-13 15:10:35
  • 关于后端如何解决跨域的问题说明

    2023-09-19 00:59:10
  • Idea中SpringBoot多模块项目的建立实现

    2023-11-08 07:52:34
  • C#中is,as,using关键字的使用说明

    2023-07-01 22:54:42
  • C# XML序列化方法及常用特性总结分析

    2021-12-27 02:23:33
  • C#实现xml文件反序列化读入数据到object的方法

    2023-08-20 00:43:08
  • Android开发之获取LayoutInflater对象的方法总结

    2023-05-29 21:50:28
  • Android DrawerLayout带有侧滑功能的布局类(1)

    2023-04-09 20:32:07
  • C#中Task.Yield的用途深入讲解

    2022-11-12 00:16:23
  • AndroidStudio 3.6 中 R.layout 找不到对应的xml文件问题及解决方法

    2023-05-19 08:22:02
  • c#使用S22.Imap收剑灵激活码邮件代码示例(imap收邮件)

    2022-11-27 20:59:37
  • java使用Abobe Acrobat DC生成模板

    2022-04-14 21:03:12
  • asp之家 软件编程 m.aspxhome.com