Java使用微信支付-發起統一下單支付介面
package com.tenpay.util; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.InetAddress; import java.net.URL; import java.security.KeyStore; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.net.ssl.SSLContext; import org.apache.http.Consts; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.SSLContexts; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.glassfish.jersey.internal.util.Base64; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import com.zhiweism.util.MD5; import com.zhiweism.util.Util; /* * 使用者發起統一下單請求 * 作者:董志平 */ public class WXRequestUtil { public static void main(String[] args) { SendPayment("蘋果","20170106113324",1,"1"); } /* * 發起支付請求 * body 商品描述 * out_trade_no 訂單號 * total_fee 訂單金額 單位 元 * product_id 商品ID */ public static Map<String,String> SendPayment(String body,String out_trade_no,double total_fee,String product_id){ String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; String xml = WXParamGenerate(body,out_trade_no,total_fee,product_id); String res = httpsRequest(url,"POST",xml); Map<String,String> data = null; try { data = doXMLParse(res); } catch (Exception e) { } return data; } public static String NonceStr(){ String res = Base64.encodeAsString(Math.random()+"::"+new Date().toString()).substring(0, 30); return res; } public static String GetIp() { InetAddress ia=null; try { ia=InetAddress.getLocalHost(); String localip=ia.getHostAddress(); return localip; } catch (Exception e) { return null; } } public static String GetSign(Map<String,String> param){ String StringA = Util.formatUrlMap(param, false, false); String stringSignTemp = MD5.md5(StringA+"&key="+ConstantUtil.API_KEY).toUpperCase(); return stringSignTemp; } //Map轉xml資料 public static String GetMapToXML(Map<String,String> param){ StringBuffer sb = new StringBuffer(); sb.append("<xml>"); for (Map.Entry<String,String> entry : param.entrySet()) { sb.append("<"+ entry.getKey() +">"); sb.append(entry.getValue()); sb.append("</"+ entry.getKey() +">"); } sb.append("</xml>"); return sb.toString(); } //微信統一下單引數設定 public static String WXParamGenerate(String description,String out_trade_no,double total_fee,String product_id){ int fee = (int)(total_fee * 100.00); Map<String,String> param = new HashMap<String,String>(); param.put("appid", ConstantUtil.APP_ID); param.put("mch_id", ConstantUtil.MCH_ID); param.put("nonce_str",NonceStr()); param.put("body", description); param.put("out_trade_no",out_trade_no); param.put("total_fee", fee+""); param.put("spbill_create_ip", GetIp()); param.put("notify_url", ConstantUtil.WEIXIN_NOTIFY); param.put("trade_type", "NATIVE"); param.put("product_id", product_id+""); String sign = GetSign(param); param.put("sign", sign); return GetMapToXML(param); } //發起微信支付請求 public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) { try { URL url = new URL(requestUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); // 設定請求方式(GET/POST) conn.setRequestMethod(requestMethod); conn.setRequestProperty("content-type", "application/x-www-form-urlencoded"); // 當outputStr不為null時向輸出流寫資料 if (null != outputStr) { OutputStream outputStream = conn.getOutputStream(); // 注意編碼格式 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 從輸入流讀取返回內容 InputStream inputStream = conn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuffer buffer = new StringBuffer(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 釋放資源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null; conn.disconnect(); return buffer.toString(); } catch (ConnectException ce) { System.out.println("連線超時:{}"+ ce); } catch (Exception e) { System.out.println("https請求異常:{}"+ e); } return null; } //退款的請求方法 public static String httpsRequest2(String requestUrl, String requestMethod, String outputStr) throws Exception { KeyStore keyStore = KeyStore.getInstance("PKCS12"); StringBuilder res = new StringBuilder(""); FileInputStream instream = new FileInputStream(new File("/home/apiclient_cert.p12")); try { keyStore.load(instream, "".toCharArray()); } finally { instream.close(); } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom() .loadKeyMaterial(keyStore, "1313329201".toCharArray()) .build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) .build(); try { HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); httpost.addHeader("Connection", "keep-alive"); httpost.addHeader("Accept", "*/*"); httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); httpost.addHeader("Host", "api.mch.weixin.qq.com"); httpost.addHeader("X-Requested-With", "XMLHttpRequest"); httpost.addHeader("Cache-Control", "max-age=0"); httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); StringEntity entity2 = new StringEntity(outputStr ,Consts.UTF_8); httpost.setEntity(entity2); System.out.println("executing request" + httpost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpost); try { HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent())); String text = ""; res.append(text); while ((text = bufferedReader.readLine()) != null) { res.append(text); System.out.println(text); } } EntityUtils.consume(entity); } finally { response.close(); } } finally { httpclient.close(); } return res.toString(); } //xml解析 public static Map<String, String> doXMLParse(String strxml) throws Exception { strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\""); if(null == strxml || "".equals(strxml)) { return null; } Map<String,String> m = new HashMap<String,String>(); InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8")); SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(in); Element root = doc.getRootElement(); List list = root.getChildren(); Iterator it = list.iterator(); while(it.hasNext()) { Element e = (Element) it.next(); String k = e.getName(); String v = ""; List children = e.getChildren(); if(children.isEmpty()) { v = e.getTextNormalize(); } else { v = getChildrenText(children); } m.put(k, v); } //關閉流 in.close(); return m; } public static String getChildrenText(List children) { StringBuffer sb = new StringBuffer(); if(!children.isEmpty()) { Iterator it = children.iterator(); while(it.hasNext()) { Element e = (Element) it.next(); String name = e.getName(); String value = e.getTextNormalize(); List list = e.getChildren(); sb.append("<" + name + ">"); if(!list.isEmpty()) { sb.append(getChildrenText(list)); } sb.append(value); sb.append("</" + name + ">"); } } return sb.toString(); } }
相關推薦
Java使用微信支付-發起統一下單支付介面
package com.tenpay.util; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInp
踩坑: 微信小程式支付流程(統一下單, 支付回撥)
公司最近開發小程式,涉及到支付功能. 現在支付功能已經做完,特此記錄一下自己踩坑經驗: 眾所周知,微信小程式目前只能使用微信支付, 而且微信小程式支付相對於app支付,h5支付都要簡單一些,但是該支付文件對java這語言是非常不友好的,居然沒有demo, 網上雖
Java微信APP支付-統一下單
最近因為公司的業務需要,需要自主開發一套類似淘寶、京東的購物APP系統,本人負責後端線上支付模組介面的開發,主要包含微信、支付寶的統一下單、支付結果通知、申請退款、退款結果通知等介面的開發。費話不多說,我們這一章主要講述微信APP支付的統一下單介面的開發。 這裡我們先講
java微信支付對接之統一下單對接
微信支付對接Java並不友好文件也不經常更新(php更易對接成功) 準備工作。 1,服務號一個(已認證的)企業號更好。 2,微信支付對接demo(官網下載或者網上找)。 3,Java基本開發環境。 對接步驟 1下載demo(非官網的,官網的文件很久沒更新了做了很多
Android 微信支付的統一下單
準備工作 申請微信開發者賬號,新增應用及申請開通微信支付功能,如 檢視開通流程 統一下單的介面文件: 檢視介面 開發 ①下載sdk: sdk和demo下載 ②可以匯入包 在build.gradle檔案中,新增如下依賴即可: depende
淺析微信支付:統一下單介面
本文是【淺析微信支付】系列文章的第五篇,主要講解如何呼叫統一下單介面生成預支付單及調起支付頁面。 淺析微信支付系列已經更新四篇了喲~,沒有看過的朋友們可以看一下哦。 上面是本文的前置文章,有前面幾篇文章的基礎以後看會更加明瞭,如果已經看過的小夥伴可以忽略。 1、什麼是[統一下單介面]? 首先我們要明
微信 統一下單支付 伺服器程式碼和js程式碼
/** * * 類名稱:WeixinController.java 類描述: 微信公共平臺開發 * * @version 1.0 */ @Controller @RequestMapping(value = "/pay") public class Weixi
java微信支付(統一下訂單)
微信支付統一下訂單: 微信公眾號配置共五個地方: 1、設定key:微信商戶平臺——賬戶設定——API安全——金鑰設定 2、頁面授權域名:用來過的openID,公眾號設定——功能設定——設定【網頁授權域名】(【js安全域名】【業務域名】也一併設定了吧) 3、設定支付
5.微信支付之統一下單
統一下單 除刷卡支付場景以外,商戶系統先呼叫該介面在微信支付服務後臺生成預支付交易單,返回正確的預支付交易回話標識後再按掃碼、JSAPI、APP等不同場景生成交易串調起支付。 統一下單時除了被掃支付之外的其他支付方式必須要進行的操作 使用場景 掃碼
微信支付之統一下單
打包簽名檔案debug: app-build-outputs-apk-debug.apk Map集合轉xml串: Map<String, String> params = new HashMap<>(); params.put("ap
Anroid微信支付從統一下單到喚起支付
專案需要整合微信支付功能,老是返回-1,反反覆覆看文件,還有一條條看官方demo程式碼,看了三天看到吐血。 我覺得可以把微信寫官方文件的人拉出去殺了祭天,官方文件都那麼坑。 所以分享一下,給各位免得踩一樣的坑。 下面是下單和喚起的方法,一定要看仔細了。 //微信支付 p
.NET Core 微信小程式支付——(統一下單)
最近公司研發了幾個電商小程式,還有一個核心的電商直播,只要是電商一般都會涉及到交易資訊,離不開支付系統,這裡我們統一實現小程式的支付流程(與服務號實現步驟一樣)。 目錄1、開通小程式的支付能力2、商戶後臺繫結同一主體的APPID並授權3、預先設定回撥地址,商戶後臺設定開發的配置4、程式碼實現統一支付5、微信
java微信支付異步回調接收參數
end 異步 eth out 微信支付 get input 支付 tin response.setHeader( "Content-type", "text/html;charset=UTF-8" ); out = response.getWriter();
java微信支付--------公眾號內H5調起支付
記錄 catch 配置參數 null pid 工具 請求 exception The 謹以此做記錄,方便下次實現,不適合新手拷貝,如有指教,歡迎留言討論! 新手請參考博文:https://blog.csdn.net/javaYouCome/article/details/7
Java微信支付開發之掃碼支付模式一
官方文件 準備工作:已通過微信認證的公眾號, 必須通過ICP備案域名(否則會報支付失敗) 借鑑了很多大神的文章,在此先謝過了 大體過程:先掃碼(還沒有確定實際要支付的金額),這個碼是商品的二維碼,再生成訂單,適用於自動販賣機之類固定金額的。 模式一支付的流程如下圖,稍微有點複雜
Java微信掃碼支付
Java微信掃碼支付 以下內容是基於模式二開發 在開發之前需要先到微信支付官網註冊賬號,並獲取到以下資訊 appid:wx1137939101111111公眾賬號id mch_id:1438111111 商戶號 key:4Inn0va1eSxOnl1neqsxwuha
Java微信H5支付實際例子
最近看過不少微信H5支付的例子,我是根據這個網址來配置的:https://blog.csdn.net/leigelg/article/details/80456758 這裡已經說的很明白,就是在支付的時候老是提示“網路環境未能通過安全驗證,請稍後重試”後來發現真是IP地址問題,這是我實際專案
Java微信支付開發
01. 公眾號支付介紹02. APP支付介紹03. 掃碼支付介紹04. 刷卡支付介紹05. 微信買單支付介紹06. 二維碼介紹07. 支付模式一_時序圖08. 支付模式二_時序圖09. 生成二維碼圖片(google)10. 開發文件(1)11. 開發文件(2)12. p2p微信支付流程13. 回顧p2p微信支
java微信支付開發-公眾號支付
微信支付分為好幾種,我要記錄的是微信公眾號支付和網頁微信掃碼支付這兩種: 現在來講一講微信公眾號支付,(網頁微信掃碼支付會在下一篇部落格講,這篇部落格講的是微信公眾號支付): 無論是微信公眾號支付還是網頁微信掃碼支付都要準備好以下條件,接下來的呼叫介面需要用到: 1.已
手把手教你--JAVA微信支付(H5支付)
概述 之前說過,有時間把微信支付的H5支付講解下,一直拖了半年時間,最近的專案正好又溫習了支付功能,趁著熱乎,抓緊起來。 微信的H5支付,相對公眾號支付,容易了跟多,很多相似的東西,也有不同之處,這裡只介紹H5支付的關鍵點,其他內容請先去看我的微信支付(公眾號支付)那篇文