微信支付-掃碼支付案例

  • 下載SDK:

下載網址https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

下載得到以下壓縮包


解壓:獲得一個maven項目


將此項目導入maven倉庫當成一個jar使用,maven項目pom文件引入如下

<dependency>
   <groupId>com.github.wxpay</groupId>
   <artifactId>wxpay-sdk</artifactId>
   <version>0.0.3</version>
 </dependency>
  • 案例:根據訂單生成二維碼,掃碼支付後跳轉成功頁面

                     

準備微信支付參數    

/**
 * 微信支付參數
 */
public class PayConfig {
	//企業方公衆號Id
	public static String appid = "wx8397f8696b538317";
	//財付通平臺的商戶賬號
	public static String partner = "1473426802";
	//財付通平臺的商戶密鑰
	public static String partnerkey = "8A627A4578ACE384017C997F12D68B23";  
	//回調URL
	public static String notifyurl = "http://a31ef7db.ngrok.io/WeChatPay/WeChatPayNotify";
}

httpclient工具類

package cn.itcast.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;

/**
 * http請求客戶端
 * 
 * @author Administrator
 * 
 */
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);
	}

	/**
	 * set http post,put param
	 */
	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;
	}

}

頁面使用angularjs發送get請求獲取返回的數據生成二維碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/angular.min.js"></script>
<script type="text/javascript" src="js/qrcode.js"></script>
<script type="text/javascript">
	var app = angular.module("weixinpay",[]);
	app.controller("payController",function($scope,$http){
		//生成二維碼
		$scope.createNative = function(){
			$http.get("NativeServlet").success(function(response){
				if(response.return_code =="SUCCESS"){
					var ewm = qrcode("10","H");//參數1: 二維碼大小 2-10  參數2:容錯級別
					ewm.addData(response.code_url);
					ewm.make();
					document.getElementById("qr").innerHTML=ewm.createImgTag();
					//顯示訂單號
					$scope.out_trade_no  = response.out_trade_no;
					//查詢訂單狀態
					checkPayStatus($scope.out_trade_no);
				}else{
					alert("請求失敗!!!");
				}
			});
		}
		
		checkPayStatus = function(out_trade_no){
			$http.get("PayStatusCheckServlet?out_trade_no="+out_trade_no).success(function(response){
				if(response.trade_state=="SUCCESS"){
					location.href="success.html"
				}else{
					alert("交易出錯!!!");
				}
			});
		}
	});
</script>
</head>
<body ng-app="weixinpay" ng-controller="payController" ng-init="createNative()">
	請掃碼支付<br>
	<div id="qr"></div>
	訂單號:{{out_trade_no}}
</body>
</html>


向微信支付遠端接口(url)發送xml 數據(https請求,需要證書);並生成二面二維碼

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//向微信支付遠端接口(url)  發送xml 數據(https)
		
		//1.創建發送的數據(XML)
		Map<String,String> prarm=new HashMap<String, String>();
		prarm.put("appid", PayConfig.appid);//公衆賬號ID
		prarm.put("mch_id",PayConfig.partner);//商戶號
		prarm.put("nonce_str", WXPayUtil.generateNonceStr() );//隨機字符串
		prarm.put("body", "測試商品");//商品信息
		prarm.put("out_trade_no", WXPayUtil.getCurrentTimestamp()+"");//訂單號(後邊查詢會用)
		prarm.put("total_fee", "1");//金額(分)
		prarm.put("spbill_create_ip", "127.0.0.1");//終端IP
		prarm.put("notify_url",PayConfig.notifyurl);//回調地址(不起作用,但是必須給)
		prarm.put("trade_type", "NATIVE");//掃碼支付
		
		try {
			String xmlParam = WXPayUtil.generateSignedXml(prarm, PayConfig.partnerkey);
			System.out.println("----請求的參數----");
			System.out.println(xmlParam);
			System.out.println("----------------");
			
			//2.通過httpClient向遠端發送數據
			String url="https://api.mch.weixin.qq.com/pay/unifiedorder";
			HttpClient client=new HttpClient(url);
			client.setHttps(true);
			client.setXmlParam(xmlParam);
			client.post();//發送請求
			
			//3.獲取返回結果(XML)並解析
			String xmlResult = client.getContent();//請求的結果(XML)
			System.out.println("----響應的結果-----");
			System.out.println(xmlResult);
			System.out.println("-----------------");
			
			Map<String, String> mapResult = WXPayUtil.xmlToMap(xmlResult);
			
			Map<String,String> map=new HashMap<String, String>();
			if(mapResult.get("return_code").equals("SUCCESS")){//如果成功
				map.put("code_url", mapResult.get("code_url"));//生成二維碼的url
				map.put("return_code", "SUCCESS");				
			}else{
				map.put("code_url", "");
				map.put("return_code", "ERROR");	
			}
			map.put("out_trade_no", prarm.get("out_trade_no"));//訂單號
			String jsonString = JSON.toJSONString(map);
			response.getWriter().print(jsonString);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
			
	}

生成二維碼後,頁面一直監聽付款狀態,每3秒監聽一次,成功跳轉頁面

微信查詢接口 https://api.mch.weixin.qq.com/pay/orderquery

證書不需要

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String out_trade_no = request.getParameter("out_trade_no");
		while(true){
			Map map = queryOrder(out_trade_no);//調用訂單接口查詢訂單信息
			if(map==null){//出錯
				map = new HashMap<String, String>();
				map.put("trade_state", "ERROR");
				String jsonString = JSON.toJSONString(map);
				response.getWriter().print(jsonString);
				break;
			}
			if("SUCCESS".equals(map.get("trade_state"))){
				//支付成功
				String jsonString = JSON.toJSONString(map);
				response.getWriter().print(jsonString);
				break;
			}
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
	//調用訂單查詢接口
	
	private Map queryOrder(String out_trade_no){
		
		Map param = new HashMap<String,String>();
		param.put("appid", PayConfig.appid);
		param.put("mch_id", PayConfig.partner);
		param.put("out_trade_no", out_trade_no);
		param.put("nonce_str", WXPayUtil.generateNonceStr());
		try {
			String xmlParam = WXPayUtil.generateSignedXml(param, PayConfig.partnerkey);
			HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
			httpClient.setHttps(true);
			httpClient.setXmlParam(xmlParam);
			httpClient.post();
			String resultMap = httpClient.getContent();
			Map<String, String> map = WXPayUtil.xmlToMap(resultMap);
			System.out.println(map);
			return map ;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	



                

發佈了24 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章