欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java微信支付接入流程詳解

 更新時(shí)間:2019年05月05日 08:39:20   作者:只要你能好  
這篇文章主要為大家詳細(xì)介紹了java微信支付接入流程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

背景

由于項(xiàng)目是采用java編寫的,微信包括微信支付大都是php相關(guān),于是微信支付官方文檔對(duì)java的支持就不是很友好,在網(wǎng)上找了很多文章,基本上沒(méi)有一篇是真正跑的通的,經(jīng)過(guò)一番整理,先將java接入微信支付詳細(xì)流程總結(jié)出來(lái)以便后續(xù)使用。

步驟一

準(zhǔn)備階段:已認(rèn)證微信號(hào),且通過(guò)微信支付認(rèn)證,這個(gè)可以看微信文檔,很詳細(xì),這里就不再重復(fù)。

步驟二

配置授權(quán)目錄,官方推薦使用https類型的url,不知道http能不能行,個(gè)人也推薦使用https的保證不會(huì)錯(cuò)。

配置授權(quán)域名

 


步驟三

微信支付二次開(kāi)發(fā)所需要的參數(shù):

APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)

APP_ID和PARTNER_KEY(AppSecret)

PARTNER

 

APP_KEY(自行設(shè)置32位字符)

步驟四

4.1通過(guò)頁(yè)面跳轉(zhuǎn)到確認(rèn)支付頁(yè)面,其中的redirect_uri必須是配置授權(quán)目錄下的

<html>
 <head>
 <title>支付測(cè)試</title>
 </head>
 <body>
 <a >支付測(cè)試</a>
 </body>
</html>

4.2 獲取到openid,再經(jīng)服務(wù)器向微信請(qǐng)求獲取prepay_id,封裝字段并進(jìn)行簽名后通過(guò)jsapi調(diào)起微信支付

網(wǎng)頁(yè)端

<%@ 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>測(cè)試支付</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支付測(cè)試</div>
 <div class="branch_con">
 <ul>
 <li><span class="name">測(cè)試支付信息[]</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,  //公眾號(hào)名稱,由商戶傳入  
    "timeStamp": timeStamp,   //時(shí)間戳,自1970年以來(lái)的秒數(shù)  
    "nonceStr" : nonceStr, //隨機(jī)串  
    "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("頁(yè)面找不到!"+ urladdress +"");
  }
   } catch(e){
   callback("請(qǐng)求發(fā)送失敗,請(qǐng)重試!" + 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>

服務(wù)器端

@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", "測(cè)試");
 paraMap.put("body", "測(cè)試購(gòu)買支付");
 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");// 此路徑是微信服務(wù)器調(diào)用支付結(jié)果通知路徑
 String sign = getSign(paraMap, paternerKey);
 paraMap.put("sign", sign);
 // 統(tǒng)一下單 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);
 
 // 預(yù)付商品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();
 }
 }

測(cè)試結(jié)果

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • dubbo如何實(shí)現(xiàn)consumer從多個(gè)group中調(diào)用指定group的provider

    dubbo如何實(shí)現(xiàn)consumer從多個(gè)group中調(diào)用指定group的provider

    這篇文章主要介紹了dubbo如何實(shí)現(xiàn)consumer從多個(gè)group中調(diào)用指定group的provider問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • SpringBoot定時(shí)任務(wù)詳解與案例代碼

    SpringBoot定時(shí)任務(wù)詳解與案例代碼

    SpringBoot是一個(gè)流行的Java開(kāi)發(fā)框架,它提供了許多便捷的特性來(lái)簡(jiǎn)化開(kāi)發(fā)過(guò)程,其中之一就是定時(shí)任務(wù)的支持,讓開(kāi)發(fā)人員可以輕松地在應(yīng)用程序中執(zhí)行定時(shí)任務(wù),本文將詳細(xì)介紹如何在Spring?Boot中使用定時(shí)任務(wù),并提供相關(guān)的代碼示例
    2023-06-06
  • java求整數(shù)的位數(shù)方式

    java求整數(shù)的位數(shù)方式

    這篇文章主要介紹了java求整數(shù)的位數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java編譯器和JVM的區(qū)別

    java編譯器和JVM的區(qū)別

    在本篇文章里小編給大家整理的是一篇關(guān)于java編譯器和JVM的區(qū)別的相關(guān)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • RPC框架之Thrift的入門教程

    RPC框架之Thrift的入門教程

    Thrift是一個(gè)跨語(yǔ)言的服務(wù)部署框架,主要用于各個(gè)服務(wù)之間的RPC通信,支持跨語(yǔ)言,下面小編就來(lái)和大家講講Thrift框架的具體使用,希望對(duì)大家有所幫助
    2023-10-10
  • java稀疏數(shù)組的示例代碼

    java稀疏數(shù)組的示例代碼

    這篇文章主要介紹了java稀疏數(shù)組,稀疏數(shù)組,記錄一共有幾行幾列,有多少個(gè)不同值,把具有不同值的元素和行里了及值記錄在一個(gè)小規(guī)模的數(shù)組中,從而縮小程序的規(guī)模,對(duì)java稀疏數(shù)組相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-07-07
  • SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    本文主要對(duì)SpringBoot2.x集成騰訊云短信進(jìn)行簡(jiǎn)單總結(jié),其中SpringBoot使用的2.4.5版本,本文通過(guò)業(yè)務(wù)流程圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • MyBatis結(jié)果映射(ResultMap)的使用

    MyBatis結(jié)果映射(ResultMap)的使用

    在MyBatis中,結(jié)果映射是實(shí)現(xiàn)數(shù)據(jù)庫(kù)結(jié)果集到Java對(duì)象映射的核心,它不僅支持簡(jiǎn)單的字段映射,還能處理字段名不一致、嵌套對(duì)象和集合映射等復(fù)雜場(chǎng)景,通過(guò)ResultMap,開(kāi)發(fā)者可以靈活定義映射關(guān)系,以適應(yīng)各種需求,感興趣的可以了解一下
    2024-09-09
  • java實(shí)現(xiàn)多文件上傳至本地服務(wù)器功能

    java實(shí)現(xiàn)多文件上傳至本地服務(wù)器功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)多文件上傳至本地服務(wù)器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 解決idea web項(xiàng)目中out目錄更新不同步問(wèn)題

    解決idea web項(xiàng)目中out目錄更新不同步問(wèn)題

    這篇文章給大家介紹了idea web項(xiàng)目中out(maven中是target)目錄更新不同步,導(dǎo)致訪問(wèn)404的問(wèn)題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09

最新評(píng)論