微信支付集成工具

微信支付集成工具

最近老闆又安排了新項目,要接入微信支付,看了看之前的支付代碼(多年之前別人寫的)實在不忍直視,就去找了找微信官方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

在Spring中使用的例子

微信支付工具都經過實例化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();
        }        
    }
    
}

接口完成列表

已完成接口微信

  • 統一下單接口 UnifiedOrderRequest
  • 查詢訂單接口 OrderQueryRequest
  • 申請退款接口(須要證書) RefundRequest
  • 退款查詢接口 RefundQueryRequest
  • 支付結果通知 UnifiedOrderCallback

未完成接口數據結構

  • 關閉訂單
  • 海關申報
  • 下載對帳單
  • 下載資金帳單
  • 交易保障
  • 拉取訂單評價數據
  • 退款結果通知(由於須要AES-256-ECB解密,jdk默認不支持,暫時不實現了)

代碼風格

微信接口中會有大量的 javabean xml map 之間的轉換,我處理的仍是比較隨意的,在xml -- javabean 之間主要經過fastjson進行轉換,由於用起來比較順手,因此也沒在乎效率的問題。 總體api風格設計借鑑 阿里雲SDK 風格,xxxRequest 對應 xxxResponse,這種api設計很直觀,並且經過一個api接口能夠統一調用。 在參數校驗層面,爲了偷懶大量的校驗與數據結構轉換在Request中進行,因此Request類並非簡單類,在調試中可能會遇到點麻煩,見諒工具

官方文檔版本

在寫文檔時參照最新微信支付官方文檔(20190805),接口若有變更請以官方文檔爲準,相關字段含義也請參照官方文檔測試

相關文章
相關標籤/搜索