# 微信支付
這是用Golang封裝了微信的所有API接口的SDK,并自動生成和解析XML數據,包括微信支付、公眾號、小程序、移動端的工具函數。
* 支持境內普通商戶和境內服務商(境外和銀行服務商沒有條件測試)。
* 支持全局配置應用ID、商家ID等信息。
* 全部參數和返回值均使用`struct`類型傳遞,而不是`map`類型。
### 安裝
```shell
go get -u gitee.com/cuckoopark/wechat
```
### 初始化
```go
const (
isProd = true // 生產環境或沙盒環境
isMch = false // 是否是企業模式,僅當調用企業付款時為true
serviceType = wechat.ServiceTypeNormalDomestic // 普通商戶或服務商等類型
apiKey = "xxxxxxxx" // 微信支付上設置的API Key
certFilepath = "/xxx/yyy/apiclient_cert.p12" // 微信證書文件的本地路徑,僅部分接口使用,如果不使用這些接口,可以傳遞空值
)
config := wechat.Config{
AppId: AppID,
MchId: MchID,
SubAppId: SubAppId, // 僅服務商模式有效
SubMchId: SubMchID, // 僅服務商模式有效
}
client := wechat.NewClient(isProd, isMch, serviceType, apiKey, certFilepath, config)
```
### 使用
以下是通用的接口,使用上面初始化時生成的實例`client`進行相應函數的調用。其中帶有`(*Client)`字樣的接口,需要使用`wechat.NewClient`創建的實例對象來調用,而不帶的接口,則可以直接使用`wechat.XXX`調用。
使用樣例:
```go
func Test() {
// 初始化參數
body := wechat.QueryOrderBody{}
body.OutTradeNo = "YgENQFTovdeJdFouNyy3nFVOhGD6ZvPH"
// 請求訂單查詢
wxRsp, err := client.QueryOrder(body)
if err != nil {
return
}
fmt.Printf("返回值: %+v\n", wxRsp)
}
```
注意事項:
* 參數或返回值的類型,請查看接口對應的文件,里面有`XXXBody`和`XXXResponse`與之對應。
* 參數或返回值中的常量,請參照constant.go文件。
* 具體使用方法,請參照接口對應的測試文件。
#### 微信支付
對應文件:`wx_pay_xxxxxx.go`
* 提交付款碼支付:`(*Client) Micropay`。
* 統一下單:`(*Client) UnifiedOrder`。
* 查詢訂單:`(*Client) QueryOrder`。
* 關閉訂單:`(*Client) CloseOrder`。
* 撤銷訂單:`(*Client) Reverse`。
* 申請退款:`(*Client) Refund`。
* 查詢退款:`(*Client) QueryRefund`。
* 下載對賬單:`(*Client) DownloadBill`。
* 交易保障(JSAPI):`(*Client) ReportJsApi`。
* 交易保障(MICROPAY):`(*Client) ReportMicropay`。
* 下載資金賬單:TODO,client.DownloadFundFlow()。
* 拉取訂單評價數據:TODO,client.BatchQueryComment()。
* 企業付款到零錢:`(*Client) Change`。
* 查詢企業付款到零錢:`(*Client) QueryChange`。
#### 微信支付回調
對應文件:`wx_notify_xxxxxx.go`
* 支付回調:`(*Client) NotifyPay`。
* 退款回調:`(*Client) NotifyRefund`。
#### 微信公眾號
對應文件:`wx_service_xxxxxx.go`
* 授權碼查詢OpenId:`(*Client) OpenIdByAuthCode`。
* 獲取基礎支持的AccessToken:`GetBasicAccessToken`。
* 獲取用戶基本信息(UnionId機制):`GetUserInfo`。
* 獲取H5支付簽名:`GetH5PaySign`。
#### 微信小程序
對應文件:`wx_applet_xxxxxx.go`
* 獲取小程序支付簽名:`GetAppletPaySign`。
* 獲取小程序碼:`GetAppletUnlimitQrcode`。
#### 移動端
對應文件:`wx_app_xxxxxx.go`
* 獲取APP支付簽名:`GetAppPaySign`。
### 文檔
* 微信支付文檔:[https://pay.weixin.qq.com/wiki/doc/api/index.html](https://pay.weixin.qq.com/wiki/doc/api/index.html)
* 隨機數生成算法:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3)
* 簽名生成算法:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_3)
* 交易金額:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 交易類型:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 貨幣類型:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 時間規則:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 時間戳:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 商戶訂單號:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 銀行類型:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=4_2)
* 單品優惠功能字段:[https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_101&index=1](https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_101&index=1)
* 代金券或立減優惠:[https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=12_1](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=12_1)
* 最新縣及縣以上行政區劃代碼:[https://pay.weixin.qq.com/wiki/doc/api/download/store_adress.csv](https://pay.weixin.qq.com/wiki/doc/api/download/store_adress.csv)
### 開發進度
* 境內普通商戶
* [付款碼支付](https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1)
* [JSAPI支付](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1)
* [Native支付](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1)
* [APP支付](https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_1)
* [H5支付](https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1)
* [小程序支付](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1)
* (TODO) [代金券或立減優惠](https://pay.weixin.qq.com/wiki/doc/api/tools/sp_coupon.php?chapter=12_1)
* (TODO) [現金紅包](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1)
* [企業付款](https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1)
* 境內服務商
* [付款碼支付](https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=5_1)
* [JSAPI支付](https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=7_1)
* [Native支付](https://pay.weixin.qq.com/wiki/doc/api/native_sl.php?chapter=6_1)
* [APP支付](https://pay.weixin.qq.com/wiki/doc/api/app/app_sl.php?chapter=8_1)
* [H5支付](https://pay.weixin.qq.com/wiki/doc/api/H5_sl.php?chapter=15_1)
* [小程序支付](https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=7_3&index=1)
* [現金紅包](https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon_sl.php?chapter=13_1)
### 測試方法
修改`client_test.go`中的生成測試Client的代碼,調整沙盒/生產環境、普通商戶/服務商等選項,或者修改環境變量,來調整商戶參數。
環境變量的腳本在`env`文件中,修改后加載環境變量:
```shell
source env
go test
```
### TODO
- 測試改為不同情境使用不同的用例。
- 繼續調試境內普通商戶和境內服務商的其他模塊API文檔。
- 選擇性調試境外接口。
- 繼續增加公眾號和小程序相關接口。
- 移除`service`開頭的文件。