微信支付

微信支付開發文檔
微信支付提供了SDK, 下載後打開源碼,install到本地倉庫,下面時通過掃碼支付模式二的統一下單爲示例
在這裏插入圖片描述
在這裏插入圖片描述

<dependency>
	<groupId>com.github.wxpay</groupId>
	<artifactId>wxpay-sdk</artifactId>
	<version>3.0.9</version>
</dependency>

主要會用到微信支付SDK的以下功能:
(1)獲取隨機字符串
WXPayUtil.generateNonceStr()
(2)MAP轉換爲XML字符串(自動添加簽名)
WXPayUtil.generateSignedXml(param, partnerkey)
(3)XML字符串轉換爲MAP
WXPayUtil.xmlToMap(result)

HttpClient是Apache Jakarta Common下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。HttpClient已經應用在很多的項目中,比如Apache Jakarta上很著名的另外兩個開源項目Cactus和HTMLUnit都使用了HttpClient。
HttpClient通俗的講就是模擬了瀏覽器的行爲,如果我們需要在後端向某一地址提交數據獲取結果,就可以使用HttpClient.
爲了簡化HttpClient的使用,下面提供了工具類HttpClient(對原生HttpClient進行了封裝)

package utils;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;


public class HttpClient {
	private String url;
	private Map<String, String> param;
	private int statusCode;
	private String content;
	private String xmlParam;
	private boolean isHttps;

	public boolean isHttps() {
		return isHttps;
	}

	public void setHttps(boolean isHttps) {
		this.isHttps = isHttps;
	}

	public String getXmlParam() {
		return xmlParam;
	}

	public void setXmlParam(String xmlParam) {
		this.xmlParam = xmlParam;
	}

	public HttpClient(String url, Map<String, String> param) {
		this.url = url;
		this.param = param;
	}

	public HttpClient(String url) {
		this.url = url;
	}

	public void setParameter(Map<String, String> map) {
		param = map;
	}

	public void addParameter(String key, String value) {
		if (param == null)
			param = new HashMap<String, String>();
		param.put(key, value);
	}

	public void post() throws ClientProtocolException, IOException {
		HttpPost http = new HttpPost(url);
		setEntity(http);
		execute(http);
	}

	public void put() throws ClientProtocolException, IOException {
		HttpPut http = new HttpPut(url);
		setEntity(http);
		execute(http);
	}

	public void get() throws ClientProtocolException, IOException {
		if (param != null) {
			StringBuilder url = new StringBuilder(this.url);
			boolean isFirst = true;
			for (String key : param.keySet()) {
				if (isFirst)
					url.append("?");
				else
					url.append("&");
				url.append(key).append("=").append(param.get(key));
			}
			this.url = url.toString();
		}
		HttpGet http = new HttpGet(url);
		execute(http);
	}


	private void setEntity(HttpEntityEnclosingRequestBase http) {
		if (param != null) {
			List<NameValuePair> nvps = new LinkedList<NameValuePair>();
			for (String key : param.keySet())
				nvps.add(new BasicNameValuePair(key, param.get(key)));
			http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); 
		}
		if (xmlParam != null) {
			http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
		}
	}

	private void execute(HttpUriRequest http) throws ClientProtocolException,
			IOException {
		CloseableHttpClient httpClient = null;
		try {
			if (isHttps) {
				SSLContext sslContext = new SSLContextBuilder()
						.loadTrustMaterial(null, new TrustStrategy() {
							// 信任所有
							public boolean isTrusted(X509Certificate[] chain,
									String authType)
									throws CertificateException {
								return true;
							}
						}).build();
				SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
						sslContext);
				httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
						.build();
			} else {
				httpClient = HttpClients.createDefault();
			}
			CloseableHttpResponse response = httpClient.execute(http);
			try {
				if (response != null) {
					if (response.getStatusLine() != null)
						statusCode = response.getStatusLine().getStatusCode();
					HttpEntity entity = response.getEntity();
					// 響應內容
					content = EntityUtils.toString(entity, Consts.UTF_8);
				}
			} finally {
				response.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			httpClient.close();
		}
	}

	public int getStatusCode() {
		return statusCode;
	}

	public String getContent() throws ParseException, IOException {
		return content;
	}

}

微信支付代碼

public Map weiXinPay() {
		//1.調用遠程接口
		HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
		//設置傳輸協議
		client.setHttps(true);
		//設置傳遞的參數
		Map<String,String> map = new HashMap<>();
		//微信公衆賬號
		map.put("appid",appid);
		//商戶號
		map.put("mch_id",mch_id);
		//微信工具類提供的生成隨機字符串
		map.put("nonce_str",WXPayUtil.generateNonceStr());
		//頁面顯示的名稱,自己的公司名
		map.put("body","baidu");
		//加密方式,默認是MD5
		map.put("sign_type","MD5");
		//out_trade_no爲自己生成的商品訂單號
		map.put("out_trade_no",out_trade_no);
		//微信支付是以分爲單位,不能有小數點
		map.put("total_fee",1);
		//IP地址
		map.put("spbill_create_ip","127.0.0.1");
		//回調地址,隨便配
		map.put("notify_url","https://www.baidu.com");
		//交易類型
		param.put("trade_type", "NATIVE");
		
		
		//將map轉成帶有簽名的XML,微信工具類提供
		try {
			//partnerkey是微信生成的密鑰
			String xmlParam = WXPayUtil.generateSignedXml(map,partnerkey);
			//發送數據
			System.out.println("發送數據"+xmlParam);
			client.setXmlParam(xmlParam);
			client.post();
			//獲取返回結果
			String content = client.getContent();
			System.out.println("返回結果"+content);
			Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
			
			
			//返回數據生成二維碼
			Map codeMap = new HashMap<>();
			codeMap.put("code_url",resultMap.get("code_url"));
			codeMap.put("out_trade_no",out_trade_no);
			codeMap.put("total_fee",total_fee);
			//頁面接受返回的路徑和金額,設置到二維碼生成工具中即可
			return codeMap;
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			return new HashMap<>();
		}
		
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章