目錄
一.開發前提:
下載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