1. 程式人生 > >對接微支付介面開發詳細步驟

對接微支付介面開發詳細步驟

這篇文章是獻給正在開發微信支付,但是對微信支付的流程,或是看微信支付文件有疑問的小夥伴們,我也是一枚小白,在第一次對接微信支付,也是措手不及。ok 不多說了,寫的不好,大家不要噴我哈。

1、第一步

      我們需要從哪裡入手,當然我們需要有微信商家賬號怎樣申請商家賬號呢,當然還是需要有一個已經稽核過的微信公眾號,這樣的話,首先你必須先有個稽核通過的微信公眾號,這裡就不說怎麼稽核公眾號了這個公眾號比較好弄。

如何申請微信商戶號(如圖)

從微信公眾號 申請商戶支付賬戶 點選微信支付(跳轉到微信支付資訊填寫提交)根據提示填寫即可

填寫好資訊需要等待稽核,這裡就不多做解釋了(下圖申請成功後的截圖)


當顯示為稽核通過會在您這邊指定的郵箱裡會收到如下圖展示的郵件資訊

現在就可以登入商戶支付平臺進行設定資訊了(如圖進行登入)

第一次需要安裝證書,根據提示安裝即可。安裝好後點擊(如下圖)祕鑰進行設定


設定好祕鑰後要記住,這個開發的時候會使用到。

2、第二步開發(到此上面的商戶號就已經可以使用了)

     建立一個WeiXinConfig.java 這裡是微信的一些配置資訊

public static String key="";//上圖設定好的KEY
	//閘道器
	public static String gatewayUrl ="https://api.mch.weixin.qq.com/pay/unifiedorder";
	//公眾號ID
	public static String appid="";
	//公眾賬號ID
	public static String mch_id="";
	//裝置號
	public static String device_info="";
	//隨機字串
	public static String nonce_str="";
	//簽名
	public static String sign="";
	//簽名型別
	public static String sign_type="MD5";
	//商品描述
	public static String body="";
	//商品詳情
	public static String detail="";
	//附加資料
	public static String attach="";
	//商城訂單號
	public static String out_trade_no="";
	//幣種
	public static String fee_type="CNY";
	//交易金額(為分)例如12.53 應該(12.53*100) 放入當前值
	public static int total_fee=0;
	//客戶IP
	public static String spbill_create_ip="";
	//交易起始時間yyyyMMddHHmmss
	public static String time_start="";
	//交易結束時間
	public static String time_expire="";
	//這個欄位空著即可(訂單優惠標記)
	public static String goods_tag="";
	//微信回撥介面(重要)
	public static String notify_url="";
	//支付交易型別
	public static String trade_type="NATIVE";
	//支付訂單號
	public static String product_id="";
	//指定支付方式是否限定使用者使用者信用卡 (這個可以空著)
	public static String limit_pay="";
	//掃描支付不需要可以空著
	public static String openid="";
	//場景資訊(可以空著)
	public static String scene_info="";

   建立一個 WeiXinCommonUtil.java 名字可以隨意哈。

public static String weixinPay(String orderNumber,String clientIP,int totalFee){
		SortedMap<String, Object> parameters =new TreeMap<String, Object>();
		parameters.put("appid", WeiXinConfig.appid);
		parameters.put("body", WeiXinConfig.body);
		parameters.put("mch_id", WeiXinConfig.mch_id);
		parameters.put("nonce_str", WeiXinPayCommonUtil.genNonceStr());
		parameters.put("notify_url", WeiXinConfig.notify_url);
		parameters.put("out_trade_no", orderNumber);//訂單號
		parameters.put("spbill_create_ip", clientIP);//使用者IP
		parameters.put("total_fee", totalFee+"");//金額
		parameters.put("trade_type", WeiXinConfig.trade_type);
		//生成簽名
		parameters.put("sign", WeiXinPayCommonUtil.createSign("UTF-8", parameters));
		//生成xml請求
		String reXml= WeiXinPayCommonUtil.getRequestXml(parameters);
		System.out.println(reXml);
		//請求xml
		String xml= HttpRequest.sendPost(WeiXinConfig.gatewayUrl, reXml);
		//解析xml
		String codeUrl= WeiXinXMLUtil.readCodeUrl(xml);
		if("error".equals(codeUrl)){
			return codeUrl;
		}
		return codeUrl;
	}
	

建立一個 WeiXinPayCommonUtil.java

public static String createSign(String characterEncoding, SortedMap<String, Object> parameters) {
		StringBuffer sb = new StringBuffer();
		Set es = parameters.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			Object v = entry.getValue();
			if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
				sb.append(k + "=" + v + "&");
			}
		}
		sb.append("key=" + WeiXinConfig.key);// 最後加密時新增商戶金鑰,由於key值放在最後,所以不用新增到SortMap裡面去,單獨處理,編碼方式採用UTF-8
		String sign = WeiXinMD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
		return sign;
	}

	
	public static String getRequestXml(SortedMap<String, Object> parameters) {
		StringBuffer sb = new StringBuffer();
		sb.append("<xml>");
		Set es = parameters.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			if ("sign".equalsIgnoreCase(k)) {

			} else if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k)) {
				sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
			} else {
				sb.append("<" + k + ">" + v + "</" + k + ">");
			}
		}
		sb.append("<" + "sign" + ">" + "<![CDATA[" + parameters.get("sign") + "]]></" + "sign" + ">");
		sb.append("</xml>");
		return sb.toString();
	}
	
	public static String genNonceStr() {  
        Random random = new Random();  
        return  WeiXinMD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "");  
    } 
	
	
建立 WeiXinMD5Util.java 
private static String byteArrayToHexString(byte b[]) {
		StringBuffer resultSb = new StringBuffer();
		for (int i = 0; i < b.length; i++)
			resultSb.append(byteToHexString(b[i]));

		return resultSb.toString();
	}

	private static String byteToHexString(byte b) {
		int n = b;
		if (n < 0)
			n += 256;
		int d1 = n / 16;
		int d2 = n % 16;
		return hexDigits[d1] + hexDigits[d2];
	}

	public static String MD5Encode(String origin, String charsetname) {
		String resultString = null;
		try {
			resultString = new String(origin);
			MessageDigest md = MessageDigest.getInstance("MD5");
			if (charsetname == null || "".equals(charsetname))
				resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
			else
				resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
		} catch (Exception exception) {
		}
		return resultString;
	}

	private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d","e", "f" };

ok 到此 程式碼已經貼出,WeiXinConfig 返回的codeUrl 就是我們需要的這個生成一下二維碼,用掃描就可以支付了。