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