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