微信支付-扫码支付案例

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



                

猜你喜欢

转载自blog.csdn.net/wyb_night/article/details/80252510