java微信支付接入流程详解

背景

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

步骤一

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

步骤二

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

配置授权域名

步骤三

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

APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)

APP_ID和PARTNER_KEY(AppSecret)

PARTNER

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();
 }
 }

测试结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信支付java版本之获取Access_token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 公众平台的API调用所需的access_token的使用及生成方式说明: 1.为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器.而其他业务逻辑服务器所使用的ac

  • 微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; import java.io.File; import java.io.FileInputStream; import java.security.KeyStore; import java.text.SimpleDateFormat; import java.util.Date; import

  • 微信支付H5调用支付详解(java版)

    最近项目需要微信支付,然后看了下微信公众号支付,,虽然不难,但是细节还是需要注意的,用了大半天时间写了个demo,并且完整的测试了一下支付流程,下面分享一下微信公众号支付的经验. 一.配置公众号微信支付  需要我们配置微信公众号支付地址和测试白名单. 比如:支付JS页面的地址为 http://www.xxx.com/shop/pay/ 那此处配置www.xxx.com/shop/pay/ 二.开发流程 借用微信公众号支付api(地址 http://pay.weixin.qq.com/wiki/d

  • Java微信支付-微信红包

    微信红包的使用已经很广泛,本篇文章介绍了微信发红包的实例,需要有认证的公众号,且开通了微信支付,商户平台且开通了现金红包的权限即可. https://pay.weixin.qq.com商户登陆地址.选择查看营销中心的现金红包 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1 现金红包的官网文档说明 先看几个图 简单的测试.前提需要你去商户平台先充值.不支持预支付.本文只是总结微信现金红包接口的调用与

  • 使用weixin-java-tools完成微信授权登录、微信支付的示例

    本文为学习记录weixin-java-tools实现公众号微信支付. 码云地址:点我 // 授权登录用到 <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.1.0</version> </dependency> // 微信支付用到 <depende

  • Java编程调用微信支付功能的方法详解

    本文实例讲述了Java编程调用微信支付功能的方法.分享给大家供大家参考,具体如下: 微信开发文档地址:https://mp.weixin.qq.com/wiki/home/ 从调用处开始 我的流程: 1.点击"支付"按钮,去后台 --> 2.后台生成支付所需数据返回页面 --> 3.页面点击"确认支付"调用微信支付js.完成支付功能. 支付按钮 <div class="button" id="pay" onc

  • Java通过JsApi方式实现微信支付

    要使用JsApi进行微信支付,首先要从微信获得一个prepay_id,然后通过调用微信的jsapi完成支付,JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回.由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分. 示例代码如下: function onBridgeReady(){ WeixinJSBridge

  • 微信支付java版本之JSAPI支付+发送模板消息

    本文为大家分享了java版本之JSAPI支付+发送模板消息的相关资料,供大家参考,具体内容如下 1.工具类 工具类见:微信支付JAVA版本之Native付款 2.公众账号设置 3.代码实现 openId:openId为用户与该公众账号之间代表用户的唯一标示  以下类中涉及到生成token,关闭订单接口调用,获取配置文件信息,和工具类,在其他文章中有具体代码实现 package com.zhrd.bussinss.platform.controller.rest; import java.io.F

  • Java微信支付之公众号支付、扫码支付实例

    微信支付现在已经变得越来越流行了,随之也出现了很多以可以快速接入微信支付为噱头的产品,不过方便之余也使得我们做东西慢慢依赖第三方,丧失了独立思考的能力,这次打算分享下我之前开发过的微信支付. 一 .H5公众号支付 要点:正确获取openId以及统一下单接口,正确处理支付结果通知,正确配置支付授权目录 H5的支付方式是使用较为广泛的方式,这种支付方式主要用于微信内自定义菜单的网页,依赖手机上安装的微信客户端,高版本的微信才支持微信支付,下面按我的流程注意说明 1  编写用于支付的页面,由于是测试用

  • java实现微信支付(服务端)

    废话不多说,直接看代码. RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse()); //获取token //两小时内有效,两小时后重新获取 Token = requestHandler.GetToken(); //更新token 到应用中 requestHandler.getTokenReal(); System.out.println("微信支付获取token=====

随机推荐