golang 實現微信支付
微信 v3
推薦使用 v3 接口,官方在 v3 接口實現未覆蓋或 gopay 未開發的接口,還繼續用 v2 接口,歡迎參與完善 v3 接口。
-
已實現 API 列表附錄:API 列表附錄
-
微信官方文檔:官方文檔
-
接口規則:平臺證書
-
接入規範:最佳實踐
-
GoPay 微信 v2 文檔:GoPay 微信 v2 文檔 (部分接口僅 v2 版本支持)
1、初始化微信 v3 客戶端並做配置
注意:v3 版本接口持續增加中,不支持沙箱支付,測試請用 1 分錢測試法
具體 API 使用介紹,請參考
gopay/wechat/v3/client_test.go
import (
"github.com/go-pay/gopay/pkg/xlog"
"github.com/go-pay/gopay/wechat/v3"
)
// NewClientV3 初始化微信客戶端 v3
// mchid:商戶ID 或者服務商模式的 sp_mchid
// serialNo:商戶證書的證書序列號
// apiV3Key:apiV3Key,商戶平臺獲取
// privateKey:私鑰 apiclient_key.pem 讀取後的內容
client, err = wechat.NewClientV3(MchId, SerialNo, APIv3Key, PrivateKey)
if err != nil {
xlog.Error(err)
return
}
// 啓用自動同步返回驗籤,並定時更新微信平臺API證書
err = client.AutoVerifySign()
if err != nil {
xlog.Error(err)
return
}
// 打開Debug開關,輸出日誌,默認是關閉的
client.DebugSwitch = gopay.DebugOn
2、API 方法調用及入參
具體參數請根據不同接口查看:微信支付 V3 的 API 字典概覽
- JSAPI 下單 示例
import (
"github.com/go-pay/gopay"
)
expire := time.Now().Add(10 * time.Minute).Format(time.RFC3339)
// 初始化 BodyMap
bm := make(gopay.BodyMap)
bm.Set("sp_appid", "sp_appid").
Set("sp_mchid", "sp_mchid").
Set("sub_mchid", "sub_mchid").
Set("description", "測試Jsapi支付商品").
Set("out_trade_no", tradeNo).
Set("time_expire", expire).
Set("notify_url", "https://www.fmm.ink").
SetBodyMap("amount", func(bm gopay.BodyMap) {
bm.Set("total", 1).
Set("currency", "CNY")
}).
SetBodyMap("payer", func(bm gopay.BodyMap) {
bm.Set("sp_openid", "asdas")
})
wxRsp, err := client.V3TransactionJsapi(bm)
if err != nil {
xlog.Error(err)
return
}
3、下單後,獲取微信小程序支付、APP 支付、JSAPI 支付所需要的 pay sign
小程序調起支付 API:小程序調起支付 API
APP 調起支付 API:APP 調起支付 API
JSAPI 調起支付 API:JSAPI 調起支付 API
// 小程序
applet, err := client.PaySignOfApplet("appid", "prepayid")
// app
app, err := client.PaySignOfApp("appid", "prepayid")
// jsapi
jsapi, err := client.PaySignOfJSAPI("appid", "prepayid")
4、同步返回參數驗籤 Sign、異步通知參數解析和驗籤 Sign、異步通知返回
異步通知請求參數需要先解析,解析出來的結構體或 BodyMap 再驗籤(此處需要注意,
http.Request.Body
只能解析一次,如果需要解析前調試,請處理好 Body 複用問題)
Gin Web 框架(推薦)
Echo Web 框架
- 同步返回驗籤,手動驗籤(如已開啓自動驗籤,則無需手動驗籤操作)
import (
"github.com/go-pay/gopay/wechat/v3"
"github.com/go-pay/gopay/pkg/xlog"
)
// ========同步返回 手動驗籤(如已開啓自動驗籤,則無需手動驗籤操作)========
wxRsp, err := client.V3TransactionJsapi(bm)
if err != nil {
xlog.Error(err)
return
}
err = wechat.V3VerifySign(wxRsp.SignInfo.HeaderTimestamp, wxRsp.SignInfo.HeaderNonce, wxRsp.SignInfo.SignBody, wxRsp.SignInfo.HeaderSignature, WxPkContent)
if err != nil {
xlog.Error(err)
return
}
// ========異步通知驗籤========
notifyReq, err := wechat.V3ParseNotify()
if err != nil {
xlog.Error(err)
return
}
// WxPkContent 是通過 wechat.GetPlatformCerts() 接口向微信獲取的微信平臺公鑰證書內容
err = notifyReq.VerifySign(WxPkContent)
if err != nil {
xlog.Error(err)
return
}
// ========異步通知敏感信息解密========
// 普通支付通知解密
result, err := notifyReq.DecryptCipherText(apiV3Key)
// 合單支付通知解密
result, err := notifyReq.DecryptCombineCipherText(apiV3Key)
// 退款通知解密
result, err := notifyReq.DecryptRefundCipherText(apiV3Key)
// ========異步通知應答========
// 退款通知http應答碼爲200且返回狀態碼爲SUCCESS纔會當做商戶接收成功,否則會重試。
// 注意:重試過多會導致微信支付端積壓過多通知而堵塞,影響其他正常通知。
// 此寫法是 gin 框架返回微信的寫法
c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})
// 此寫法是 echo 框架返回微信的寫法
return c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})
- 異步通知驗籤 及 敏感參數解密
import (
"github.com/go-pay/gopay/wechat/v3"
"github.com/go-pay/gopay/pkg/xlog"
)
notifyReq, err := wechat.V3ParseNotify()
if err != nil {
xlog.Error(err)
return
}
// WxPkContent 是通過 wechat.GetPlatformCerts() 接口向微信獲取的微信平臺公鑰證書內容
err = notifyReq.VerifySign("WxPkContent")
if err != nil {
xlog.Error(err)
return
}
// ========異步通知敏感信息解密========
// 普通支付通知解密
result, err := notifyReq.DecryptCipherText(apiV3Key)
// 合單支付通知解密
result, err := notifyReq.DecryptCombineCipherText(apiV3Key)
// 退款通知解密
result, err := notifyReq.DecryptRefundCipherText(apiV3Key)
// ========異步通知應答========
// 退款通知http應答碼爲200且返回狀態碼爲SUCCESS纔會當做商戶接收成功,否則會重試。
// 注意:重試過多會導致微信支付端積壓過多通知而堵塞,影響其他正常通知。
// 此寫法是 gin 框架返回微信的寫法
c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})
// 此寫法是 echo 框架返回微信的寫法
return c.JSON(http.StatusOK, &wechat.V3NotifyRsp{Code: gopay.SUCCESS, Message: "成功"})
5、微信 v3 公共 API(僅部分說明)
import (
"github.com/go-pay/gopay/wechat/v3"
)
// 獲取微信平臺證書和序列號信息
wechat.GetPlatformCerts()
// 請求參數 敏感信息加密
wechat.V3EncryptText() 或 client.V3EncryptText()
// 返回參數 敏感信息解密
wechat.V3DecryptText() 或 client.V3DecryptText()
// 回調通知敏感信息解密
wechat.V3DecryptNotifyCipherText()
wechat.V3DecryptRefundNotifyCipherText()
wechat.V3DecryptCombineNotifyCipherText()
...
附錄:
微信支付 v3 API
-
基礎支付
-
APP 下單:
client.V3TransactionApp()
-
JSAPI / 小程序下單:
client.V3TransactionJsapi()
-
Native 下單:
client.V3TransactionNative()
-
H5 下單:
client.V3TransactionH5()
-
查詢訂單:
client.V3TransactionQueryOrder()
-
關閉訂單:
client.V3TransactionCloseOrder()
-
基礎支付(服務商)
-
APP 下單:
client.V3PartnerTransactionApp()
-
JSAPI / 小程序下單:
client.V3PartnerTransactionJsapi()
-
Native 下單:
client.V3PartnerTransactionNative()
-
H5 下單:
client.V3PartnerTransactionH5()
-
查詢訂單:
client.V3PartnerQueryOrder()
-
關閉訂單:
client.V3PartnerCloseOrder()
-
合單支付
-
合單 APP 下單:
client.V3CombineTransactionApp()
-
合單 JSAPI / 小程序下單:
client.V3CombineTransactionJsapi()
-
合單 Native 下單:
client.V3CombineTransactionNative()
-
合單 H5 下單:
client.V3CombineTransactionH5()
-
合單查詢訂單:
client.V3CombineQueryOrder()
-
合單關閉訂單:
client.V3CombineCloseOrder()
-
退款
-
申請退款:
client.V3Refund()
-
查詢單筆退款:
client.V3RefundQuery()
-
賬單
-
申請交易賬單:
client.V3BillTradeBill()
-
申請資金賬單:
client.V3BillFundFlowBill()
-
申請特約商戶資金賬單:
client.V3BillEcommerceFundFlowBill()
-
下載賬單:
client.V3BillDownLoadBill()
-
提現(服務商)
-
待實現 - 文檔
-
微信支付分(公共 API)
-
創建支付分訂單:
client.V3ScoreOrderCreate()
-
查詢支付分訂單:
client.V3ScoreOrderQuery()
-
取消支付分訂單:
client.V3ScoreOrderCancel()
-
修改訂單金額:
client.V3ScoreOrderModify()
-
完結支付分訂單:
client.V3ScoreOrderComplete()
-
商戶發起催收扣款:
client.V3ScoreOrderPay()
-
同步服務訂單信息:
client.V3ScoreOrderSync()
-
微信支付分(免確認模式)
-
創單結單合併:
client.V3ScoreDirectComplete()
-
微信支付分(免確認預授權模式)
-
商戶預授權:
client.V3ScorePermission()
-
查詢用戶授權記錄(授權協議號):
client.V3ScorePermissionQuery()
-
解除用戶授權關係(授權協議號):
client.V3ScorePermissionTerminate()
-
查詢用戶授權記錄(openid):
client.V3ScorePermissionOpenidQuery()
-
解除用戶授權關係(openid):
client.V3ScorePermissionOpenidTerminate()
-
微信先享卡
-
預受理領卡請求:
client.V3DiscountCardApply()
-
增加用戶記錄:
client.V3DiscountCardAddUser()
-
查詢先享卡訂單:
client.V3DiscountCardQuery()
-
支付即服務
-
服務人員註冊:
client.V3SmartGuideReg()
-
服務人員分配:
client.V3SmartGuideAssign()
-
服務人員查詢:
client.V3SmartGuideQuery()
-
服務人員信息更新:
client.V3SmartGuideUpdate()
-
點金計劃(服務商)
-
待實現 - 文檔
-
智慧商圈
-
商圈積分同步:
client.V3BusinessPointsSync()
-
商圈積分授權查詢:
client.V3BusinessAuthPointsQuery()
-
微信支付分停車服務
-
待實現 - 文檔
-
代金券
-
創建代金券批次:
client.V3FavorBatchCreate()
-
激活代金券批次:
client.V3FavorBatchStart()
-
發放代金券批次:
client.V3FavorBatchGrant()
-
暫停代金券批次:
client.V3FavorBatchPause()
-
重啓代金券批次:
client.V3FavorBatchRestart()
-
條件查詢批次列表:
client.V3FavorBatchList()
-
查詢批次詳情:
client.V3FavorBatchDetail()
-
查詢代金券詳情:
client.V3FavorDetail()
-
查詢代金券可用商戶:
client.V3FavorMerchant()
-
查詢代金券可用單品:
client.V3FavorItems()
-
根據商戶號查用戶的券:
client.V3FavorUserCoupons()
-
下載批次覈銷明細:
client.V3FavorUseFlowDownload()
-
下載批次退款明細:
client.V3FavorRefundFlowDownload()
-
設置消息通知地址:
client.V3FavorCallbackUrlSet()
-
商家券
-
創建商家券:
client.V3BusiFavorBatchCreate()
-
查詢商家券詳情:
client.V3BusiFavorBatchDetail()
-
覈銷用戶券:
client.V3BusiFavorUse()
-
根據過濾條件查詢用戶券:
client.V3BusiFavorUserCoupons()
-
查詢用戶單張券詳情:
client.V3BusiFavorUserCouponDetail()
-
上傳預存 code:
client.V3BusiFavorCodeUpload()
-
設置商家券事件通知地址:
client.V3BusiFavorCallbackUrlSet()
-
查詢商家券事件通知地址:
client.V3BusiFavorCallbackUrl()
-
關聯訂單信息:
client.V3BusiFavorAssociate()
-
取消關聯訂單信息:
client.V3BusiFavorDisassociate()
-
修改批次預算:
client.V3BusiFavorBatchUpdate()
-
修改商家券基本信息:
client.V3BusiFavorInfoUpdate()
-
發放消費卡:
client.V3BusiFavorSend()
-
申請退券:
client.V3BusiFavorReturn()
-
使券失效:
client.V3BusiFavorDeactivate()
-
營銷補差付款:
client.V3BusiFavorSubsidyPay()
-
查詢營銷補差付款單詳情:
client.V3BusiFavorSubsidyPayDetail()
-
委託營銷
-
建立合作關係:
client.V3PartnershipsBuild()
-
終止合作關係:
client.V3PartnershipsTerminate()
-
查詢合作關係列表:
client.V3PartnershipsList()
-
支付有禮
-
待實現 - 文檔
-
分賬
-
請求分賬:
client.V3ProfitShareOrder()
-
查詢分賬結果:
client.V3ProfitShareOrderQuery()
-
請求分賬回退:
client.V3ProfitShareReturn()
-
查詢分賬回退結果:
client.V3ProfitShareReturnResult()
-
解凍剩餘資金:
client.V3ProfitShareOrderUnfreeze()
-
查詢剩餘待分金額:
client.V3ProfitShareUnsplitAmount()
-
添加分賬接收方:
client.V3ProfitShareAddReceiver()
-
刪除分賬接收方:
client.V3ProfitShareDeleteReceiver()
-
消費者投訴 2.0
-
查詢投訴單列表:
client.V3ComplaintList()
-
查詢投訴單詳情:
client.V3ComplaintDetail()
-
查詢投訴協商曆史:
client.V3ComplaintNegotiationHistory()
-
創建投訴通知回調地址:
client.V3ComplaintNotifyUrlCreate()
-
查詢投訴通知回調地址:
client.V3ComplaintNotifyUrlQuery()
-
更新投訴通知回調地址:
client.V3ComplaintNotifyUrlUpdate()
-
刪除投訴通知回調地址:
client.V3ComplaintNotifyUrlDelete()
-
提交回復:
client.V3ComplaintResponse()
-
反饋處理完成:
client.V3ComplaintComplete()
-
商戶上傳反饋圖片:
client.V3ComplaintUploadImage()
-
其他能力
-
圖片上傳:
client.V3MediaUploadImage()
-
視頻上傳:
client.V3MediaUploadVideo()
-
圖片上傳(營銷專用):
client.V3FavorMediaUploadImage()
-
批量轉賬
-
發起批量轉賬:
client.V3Transfer()
-
微信批次單號查詢批次單:
client.V3TransferQuery()
-
微信明細單號查詢明細單:
client.V3TransferDetailQuery()
-
商家批次單號查詢批次單:
client.V3TransferMerchantQuery()
-
商家明細單號查詢明細單:
client.V3TransferMerchantDetailQuery()
-
轉賬電子回單申請受理:
client.V3TransferReceipt()
-
查詢轉賬電子回單:
client.V3TransferReceiptQuery()
-
轉賬明細電子回單受理:
client.V3TransferDetailReceipt()
-
查詢轉賬明細電子回單受理結果:
client.V3TransferDetailReceiptQuery()
-
餘額查詢
-
查詢特約商戶賬戶實時餘額(服務商):
client.V3EcommerceBalance()
-
查詢賬戶實時餘額:
client.V3MerchantBalance()
-
查詢賬戶日終餘額:
client.V3MerchantDayBalance()
-
來賬識別
-
商戶銀行來賬查詢:
client.V3MerchantIncomeRecord()
-
特約商戶銀行來賬查詢:
client.V3EcommerceIncomeRecord()
-
特約商戶進件(服務商)
-
提交申請單:
client.V3Apply4SubSubmit()
-
查詢申請單狀態(BusinessCode):
client.V3Apply4SubQueryByBusinessCode()
-
查詢申請單狀態(ApplyId):
client.V3Apply4SubQueryByApplyId()
-
修改結算賬號:
client.V3Apply4SubModifySettlement()
-
查詢結算賬戶:
client.V3Apply4SubQuerySettlement()
微信 v3 公共 API
-
wechat.GetPlatformCerts()
=> 獲取微信平臺證書公鑰 -
client.GetAndSelectNewestCert()
=> 獲取並選擇最新的有效證書 -
wechat.V3VerifySign()
=> 微信 V3 版本驗籤(同步 / 異步) -
wechat.V3ParseNotify()
=> 解析微信回調請求的參數到 V3NotifyReq 結構體 -
client.V3EncryptText()
=> 敏感參數信息加密 -
client.V3DecryptText()
=> 敏感參數信息解密 -
wechat.V3EncryptText()
=> 敏感參數信息加密 -
wechat.V3DecryptText()
=> 敏感參數信息解密 -
wechat.V3DecryptNotifyCipherText()
=> 解密 普通支付 回調中的加密信息 -
wechat.V3DecryptRefundNotifyCipherText()
=> 解密 普通退款 回調中的加密信息 -
wechat.V3DecryptCombineNotifyCipherText()
=> 解密 合單支付 回調中的加密信息 -
wechat.V3DecryptScoreNotifyCipherText()
=> 解密 支付分 回調中的加密信息 -
client.PaySignOfJSAPI()
=> 獲取 JSAPI 支付 paySign -
client.PaySignOfApp()
=> 獲取 APP 支付 paySign -
client.PaySignOfApplet()
=> 獲取 小程序 支付 paySign
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/6plXxL-9pdcv0RW8XjucNA