微信開發----微信支付/退款/沙箱的教程

目錄

 

開發前提:

下載demo:

沙箱準備:

退款證書:

微信支付Key

後臺操作

代碼

操作:


一.開發前提:

下載demo:

這裏使用的是官方的demo

沙箱準備:

沙箱可以在模擬環境中進行測試調用,你最好需要這個先調好api,然後再放到真實環境中.

上圖的"支付驗收指引"裏面有微信沙箱使用的簡介,你可以看,也可以不看,因爲官方demo裏有相應的代碼。

退款證書:

在一些涉及退款等敏感資源時,微信要求商戶在訪問時提供證書。怎麼獲取證書?請登陸微信支付平臺,在這裏下載:

 下載證書大概長這樣:

其中java需要的是apiclient_cert.p12,windows環境下還需要安裝,安裝請看官方指引

微信支付Key

在上圖下載證書的地方往下拉,還有一個設置支付密鑰的地方,你需要這個

當然你還需要微信公衆號的appid和商戶平臺的商戶id 

二.後臺操作

代碼

把下載好的demo放到開發工具裏你就會發現長這樣,下圖紅圈裏的

打開WxPayConfig,你可以看到有這幾個要求子類重寫的方法。請在前面加上protected或者public

/**
     * 獲取 App ID
     *
     * @return App ID
     */
    abstract String getAppID();


    /**
     * 獲取 Mch ID
     *
     * @return Mch ID
     */
    abstract String getMchID();


    /**
     * 獲取 API 密鑰
     *
     * @return API密鑰
     */
    abstract String getKey();
	

    /**
     * 獲取商戶證書內容
     *
     * @return 商戶證書內容
     */
    abstract InputStream getCertStream();
	 /**
     * 獲取WXPayDomain, 用於多域名容災自動切換
     * @return
     */
    abstract IWXPayDomain getWXPayDomain();

然後我們在外邊新建一個WXPayConfigImpl去繼承WXPayConfig

public class WXPayConfigImpl extends WXPayConfig {
	private String key = "xxxxx";

	@Override
	protected String getAppID() {

		return "xxxxx";
	}

	@Override
	protected String getMchID() {

		return "xxxxx";
	}

	@Override
	protected String getKey() {

		return key;
	}

	@Override
	protected InputStream getCertStream() {
		//return null;
		return this.getClass().getResourceAsStream("apiclient_cert.p12");
	}

	@Override
	protected IWXPayDomain getWXPayDomain() {
		IWXPayDomain iwxPayDomain = new IWXPayDomain() {
			@Override
			public void report(String domain, long elapsedTimeMillis, Exception ex) {

			}
			@Override
			public DomainInfo getDomain(WXPayConfig config) {
				return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);
			}
		};
		return iwxPayDomain;
	}

	@Override
	public boolean shouldAutoReport() {

		return false;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public WXPayConfigImpl(String key) {
		super();
		this.key = key;
	}

	public WXPayConfigImpl() {
		super();
		
	}

	/**
	 * 獲取沙箱密鑰
	 * 
	 * @return
	 * @throws Exception
	 */
	public static String getsignkey() throws Exception {
		WXPayConfigImpl config = new WXPayConfigImpl();
		WXPay pay = new WXPay(new WXPayConfigImpl());
		int readTimeoutMs = 5000;
		int connectTimeoutMs = 5000;
		Map<String, String> reqData = new HashMap<>();
		reqData.put("mch_id", config.getMchID());
		reqData.put("nonce_str", WXPayUtil.generateNonceStr());
		String urlSuffix = "/sandboxnew/pay/getsignkey";
		String string = pay.requestWithoutCert(urlSuffix, pay.fillRequestData(reqData), connectTimeoutMs,
				readTimeoutMs);
		Map<String, String> map = WXPayUtil.xmlToMap(string);
		return map.get("sandbox_signkey");
	}

}

對代碼解釋如下:

1.你需要把appid,商戶id,支付key填到相應的地方。

2.如果你需要使用證書,請把證書複製到WXPayConfigImpl旁邊,getCertStream方法就是獲取證書的方法。

3.getWXPayDomain方法是配置微信支付服務器的域名,微信支付有多個服務器(爲了防災備份),這裏配置了最爲常用的那個。

4.shouldAutoReport方法是把支付情況(如果出現了Bug?)上報到微信服務器,懶得上報,這裏選了false

5.在沙箱環境中,key不再能用,而是需要一個臨時的沙箱key。我們需要使用getsignkey去獲取沙箱key。

操作:

通過上述配置,代碼就非常的方便。我們測試一下

package com;

import java.util.HashMap;
import java.util.Map;

import com.github.wxpay.sdk.WXPay;

public class Test {
	/**
	 * 退款測試
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		//testRefund();//退款
		testRefundBySandBox();//沙箱退款
	}
	/**
	 * 退款
	 * @throws Exception
	 */
	private static void testRefund() throws Exception{
		Map<String, String> reqData = new HashMap<>();
		reqData.put("out_trade_no", "000");
		reqData.put("out_refund_no", "000");
		reqData.put("total_fee", "100");
		reqData.put("refund_fee", "100");
		
		WXPay pay = new WXPay(new WXPayConfigImpl());//關鍵在此構造
		Map<String, String> map = pay.refund(reqData);
		
		System.out.println(map);
	}
	/**
	 * 沙箱退款
	 * @throws Exception
	 */
	private static void testRefundBySandBox() throws Exception{
		Map<String, String> reqData = new HashMap<>();
		reqData.put("out_trade_no", "000");
		reqData.put("out_refund_no", "000");
		reqData.put("total_fee", "100");
		reqData.put("refund_fee", "100");
		
		WXPay pay = new WXPay(new WXPayConfigImpl(WXPayConfigImpl.getsignkey()), false, true);//關鍵在此構造
		Map<String, String> map = pay.refund(reqData);
		System.out.println(map);
	}
	
}

對上代碼解釋:

1.具體傳什麼參數,請參考官方文檔。

2.沙箱和正式的寫法只有WxPay的構造方法的區別。

上述代碼是申請退款,統一下單的比葫蘆畫瓢就行。只是統一下單還需要另外做些工作。

統一下單:https://blog.csdn.net/dmw412724/article/details/82770939

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章