最近老闆又安排了新項目,要接入微信支付,看了看之前的支付代碼(多年之前別人寫的)實在不忍直視,就去找了找微信官方sdk,結果官方sdk用起來實在太不「面向對象」了,因爲平時用阿里雲比較多,因而決定用阿里雲sdk的API風格寫一套。java
下單和支付結果通知在線上項目經過測試,其餘已完成接口,簡單作了一兩次測試,都經過了。其餘未完成接口會擇期逐步完成 github: https://github.com/BekeyChao/wxpay/tree/master
在OSCHINA上混,帶上個碼雲倉庫: https://gitee.com/BekeyChao/wxpaygit
cd yourpath git clone gitAddress cd wxpay mvn install
克隆源碼到本地,經過mvn安裝到本地,在pom文件中引入github
<dependency> <groupId>xyz.bekey</groupId> <artifactId>wxpay</artifactId> <version>version</version> </dependency>
目前最新版本是0.0.5, jdk最低要求1.8,代碼中並無大量應用java8新內容,若是但願兼容,只需修改統一下單接口中的LocalDateTime類型json
微信支付工具都經過實例化WechatPay類來使用,在Spring中建議註冊爲單例方便使用。api
@Configuration public class WechatPayConfig { @Value("${mch_id}") private String mch_id; @Value("${key}") private String key; @Value("${cert_path}") private String cert_path; // 微信證書路徑 @Bean public WechatPay wechatPay() { // wxConfig提供了兩種構造方法, 默認簽名類型爲MD5, 默認微信支付服務地址取自官方文檔 WxpayConfig wxConfig = new WxpayConfig(WechatApplication.Yepaofu_Subscribe.getAppid() , mch_id, key, cert_path); // 自定義 能夠忽略不設 wxConfig.setConnectTimeou(10000); wxConfig.setSocketTimeout(10000); return new WechatPay(wxConfig); } }
以統一下單接口爲例,調用方法bash
@Service public class PayService { @Autowired private WechatPay wechatPay; // 統一下單接口 public void toPay() { UnifiedOrderRequest request = new UnifiedOrderRequest(); request.setTotal_fee(100); request.setSpbill_create_ip("10.10.10.10"); request.setOut_trade_no("test123"); request.setBody("測試訂單"); request.setTrade_type(TradeType.MWEB); request.setOpenid("openid"); request.setNotify_url("http://mycallbak.com"); // some else... UnifiedOrderResponse response = wechatPay.getWechatPayResponse(request); boolean success = response.isSuccess(); if (success) { System.out.println(JSON.toJSONString(response)); } else { System.out.println(response.getErr_code_des()); } } // 支付結果回調,請從response中獲取xml字符串 public void handleCallback(String xml) { try { UnifiedOrderCallback callback = wechatPay.unifiedorderCallback(xml); if (callback.isSuccess()) { System.out.println(JSON.toJSONString(callback)); } else { System.out.println(callback.getErr_code_des()); } } catch (InvalidSignException e) { // 處理簽名異常 e.printStackTrace(); } } }
已完成接口微信
未完成接口數據結構
微信接口中會有大量的 javabean xml map 之間的轉換,我處理的仍是比較隨意的,在xml -- javabean 之間主要經過fastjson進行轉換,由於用起來比較順手,因此也沒在乎效率的問題。 總體api風格設計借鑑 阿里雲SDK 風格,xxxRequest 對應 xxxResponse,這種api設計很直觀,並且經過一個api接口能夠統一調用。 在參數校驗層面,爲了偷懶大量的校驗與數據結構轉換在Request中進行,因此Request類並非簡單類,在調試中可能會遇到點麻煩,見諒工具
在寫文檔時參照最新微信支付官方文檔(20190805),接口若有變更請以官方文檔爲準,相關字段含義也請參照官方文檔測試