下載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;
}
}