1. 程式人生 > >Java使用微信支付-發起統一下單支付介面

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, 網上雖

JavaAPP支付-統一下單

最近因為公司的業務需要,需要自主開發一套類似淘寶、京東的購物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

JavaH5支付實際例子

最近看過不少微信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支付的關鍵點,其他內容請先去看我的微信支付(公眾號支付)那篇文