作為開發人員,微信生態我們不能無視,微信提供的開放能力,我們應該有所了解。微信支付作為重要的一部分,平時工作中可能難免會遇到。Go 作為一門新語言,微信支付沒有提供 Go 的 SDK。你可以選擇自己實現,也可以找第三方實現好的。對于第三方,即使不自己實現,看看別人怎么實現的,對自己也會有啟發。今天就為大家推薦一個微信支付 Go SDK,收藏以備不時之需吧。
項目地址:https://github.com/pyihe/wechat-sdk。
一、功能列表
已經實現的功能如下。
Mini Program(小程序)
NameExplaincommentGetUserPhoneForMini小程序獲取電話號碼客戶端調用微信接口獲取加密信息時不能在回調中再次調用登陸接口, 否則會讓session_key失效GetSessionKeyAndOpenId通過小程序授權code獲取session_key和用戶openid
GetAccessTokenForMini小程序獲取AccessToken
GetUserInfoForMini小程序獲取用戶基本信息
Official Accounts(公眾號)
NameExplaincommentGetAppBaseAccessToken公眾號開發獲取基礎接口調用Access_Token用于調用其他接口GetAppOauthAccessToken公眾號開發通過code獲取網頁授權Access_Token此Access_Token用于拉取用戶信息, code只能用一次RefreshOauthToken公眾號開發刷新網頁授權Access_Token
GetAppUserInfo公眾號開發拉取用戶信息返回結果參考微信文檔[1]CheckOauthToken公眾號開發校驗網頁授權Access_Token是否有效
WeChat Pay(微信支付)
NameExplaincommentCloseorder關閉訂單
DownloadBill下載對賬單
DownloadComment拉取訂單評論
DownloadFundFlow下載資金賬單
GetPublicKey獲取RSA加密公鑰
RefundOrder申請退款
RefundNotify解析微信退款回調內容, 主要是對req_info解密
RefundQuery退款查詢
Report向微信發送接口調用結果的報告, 包括接口調用時間
ReverseOrder撤銷訂單
Transfers企業付款到用戶零錢
TransfersQuery查詢企業付款到用戶零錢的結果
TransferBank企業付款到銀行卡未測試TransferBankQuery查詢企業付款到銀行卡的結果未測試UnifiedMicro掃碼下單如果需要傳detail參數, 參數格式參照單品優惠活動detail字段列表說明[2]UnifiedOrder統一下單: H5/APP/MWEB/NATIVE返回給前端的喚起支付參數中, package = prepay_id=xxxxxxxUnifiedQuery下單結果查詢
ProfitSharing(商戶分賬)
NameExplaincommentProfitSharing申請分賬(單次或多次)multiTag標志是否是多次分賬QueryProfitSharing查詢分賬請求的結果非分賬的結果,而是分賬申請的結果AddProfitSharingReceiver添加分賬接收方
RemoveProfitSharingReceiver刪除分賬接受方
FinishProfitSharing完結分賬如果訂單不需要(再)分賬, 且剩余待分賬金額不為0時, 調用本接口將剩余金額凍結給特約商戶ReturnProfitSharing分賬回退對已分賬的訂單進行退款時,先調用本接口將金額從分賬接收方回退給商戶(非異步, 同步回傳回退結果)QueryProfitSharingReturn回退結果查詢用于核實回退結果ProfitSharingNotify分賬動帳通知分賬或分賬回退成功后, 微信會將結果發送給商戶, 通知結果包含加密信息, 此處解密密鑰為ApiV3密鑰。接口返回結果中忽略層級關系,對于需要的字段直接使用Get方法獲取值。通知url在商戶平臺配置,詳情參加分賬動帳通知[3]
RedPack(現金紅包)
NameExplaincommentSendRedPack發放現金紅包
SendGroupRedPack發放裂變紅包
GetRedPackRecords查詢紅包記錄
注意:NewPayer() 必須傳入所有需要使用的微信參數,使用過程中所有請求接口都不需要加入appid/mch_id/ApiKey/secret/sign/ApiV3Key參數
二、使用示例
package main
import ( "fmt"
dev "github.com/pyihe/wechat-sdk"
)func main() { var appId, mchId, apiKey, apiSecret string
client := dev.NewPayer(dev.WithAppId(appId), dev.WithMchId(mchId), dev.WithApiKey(apiKey), dev.WithSecret(apiSecret)) // unified order(統一下單) param := dev.NewParam() param.Add("nonce_str", "yourNonceStr")
param.Add("body", "yourBody")
param.Add("out_trade_no", "yourOutTradeNo")
param.Add("total_fee", 1)
param.Add("spbill_create_ip", "yourIp")
param.Add("notify_url", "yourUrl")
param.Add("trade_type", "JSAPI")
result, err := client.UnifiedOrder(param) if err != nil {
handleErr(err) } appId, _ = result.GetString("apppid")
prepayId, _ := result.GetString("prepay_id")
param = dev.NewParam() param.Add("appId", appId)
param.Add("timeStamp", time.Now().Unix())
param.Add("nonceStr", "nonceStr")
param.Add("package", "prepay_id="+prepayId)
param.Add("signType", "MD5")
//use to evoke wechat pay sign := param.Sign("MD5")
// download bill param = dev.NewParam() param.Add("nonce_str", "yourNonceStr")
param.Add("bill_date", "yourDate")
param.Add("bill_type", "ALL")
param.Add("tar_type", "GZIP")
err = client.DownloadBill(param, "./bill")
if err != nil {
handleErr(err) } // get phone for mini program user
result, err = client.GetUserPhoneForMini("code", "encryptedData", "iv")
if err != nil {
handleErr(err) } var phone string
if countryCode := result.Get("countryCode"); countryCode != nil && countryCode.(string) == "86" {
purePhone := result.Get("purePhoneNumber")
phone = purePhone.(string)
} else {
phoneNumber := result.Get("phoneNumber")
phone = phoneNumber.(string)
} fmt.Printf("user phone is %sn", phone)
}
退款通知的回調。
package main
import ( "fmt"
"net/http"
dev "github.com/pyihe/wechat-sdk"
)func main() {
var appId, mchId, apiKey, apiSecret string
client := dev.NewPayer(dev.WithAppId(appId), dev.WithMchId(mchId), dev.WithApiKey(apiKey), dev.WithSecret(apiSecret)) // handle refund notify
http.HandleFunc("/refund_notify", func(writer http.ResponseWriter, request *http.Request) {
defer request.Body.Close()
result, err := client.RefundNotify(request.Body)
if err != nil {
handleErr(err)
}
fmt.Printf("RefundNotify Result = %vn", result.Data())
})
http.ListenAndServe(":8810", nil)
}
參考資料
[1]
微信文檔: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
[2]
單品優惠活動detail字段列表說明: https://pay.weixin.qq.com/wiki/doc/api/danpin.php?chapter=9_102&index=2
[3]
分賬動帳通知: https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=27_9&index=9