推荐使用v3接口,官方在v3接口实现未覆盖或gopay未开发的接口,还继续用v2接口。
微信v2官方文档:微信v2官方文档
注意:微信支付下单等操作可用沙箱环境测试是否成功,但真正支付时,请使用正式环境
isProd = true
,不然会报错。
微信证书二选一:只传
apiclient_cert.pem
和apiclient_key.pem
或者只传apiclient_cert.p12
import (
"github.com/go-pay/gopay/wechat"
)
// 初始化微信客户端
// appId:应用ID
// mchId:商户ID
// apiKey:API秘钥值
// isProd:是否是正式环境
client := wechat.NewClient("wxdaa2ab9ef87b5497", mchId, apiKey, false)
// 打开Debug开关,输出请求日志,默认关闭
client.DebugSwitch = gopay.DebugOn
// 自定义配置http请求接收返回结果body大小,默认 10MB
client.SetBodySize() // 没有特殊需求,可忽略此配置
// 设置国家:不设置默认 中国国内
// wechat.China:中国国内
// wechat.China2:中国国内备用
// wechat.SoutheastAsia:东南亚
// wechat.Other:其他国家
client.SetCountry(wechat.China)
// 添加微信pem证书
client.AddCertPemFilePath()
client.AddCertPemFileContent()
或
// 添加微信pkcs12证书
client.AddCertPkcs12FilePath()
client.AddCertPkcs12FileContent()
微信V2接口通用参数(mch_id、appid、sign)无需传入,client 请求时会默认处理
具体参数请根据不同接口查看:微信支付接口文档
import (
"github.com/go-pay/util"
"github.com/go-pay/gopay/wechat"
)
// 初始化 BodyMap
bm := make(gopay.BodyMap)
bm.Set("nonce_str", util.RandomString(32)).
Set("body", "H5支付").
Set("out_trade_no", number).
Set("total_fee", 1).
Set("spbill_create_ip", "127.0.0.1").
Set("notify_url", "https://www.fmm.ink").
Set("trade_type", TradeType_H5).
Set("device_info", "WEB").
Set("sign_type", SignType_MD5).
SetBodyMap("scene_info", func(bm gopay.BodyMap) {
bm.SetBodyMap("h5_info", func(bm gopay.BodyMap) {
bm.Set("type", "Wap")
bm.Set("wap_url", "https://www.fmm.ink")
bm.Set("wap_name", "H5测试支付")
})
}) /*.Set("openid", "o0Df70H2Q0fY8JXh1aFPIRyOBgu8")*/
wxRsp, err := client.UnifiedOrder(bm)
wxRsp, err := client.Micropay(bm)
wxRsp, err := client.QueryOrder(bm)
wxRsp, err := client.CloseOrder(bm)
wxRsp, err := client.Reverse(bm)
wxRsp, err := client.Refund(bm)
wxRsp, err := client.QueryRefund(bm)
wxRsp, err := client.DownloadBill(bm)
wxRsp, err := client.DownloadFundFlow(bm)
wxRsp, err := client.BatchQueryComment(bm)
wxRsp, err := client.Transfer(bm)
...
微信小程序支付官方文档:微信小程序支付API
APP支付官方文档:APP端调起支付的参数列表文档
微信内H5支付官方文档:微信内H5支付文档
import (
"github.com/go-pay/gopay/wechat"
)
// ====微信小程序 paySign====
timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
packages := "prepay_id=" + wxRsp.PrepayId // 此处的 wxRsp.PrepayId ,统一下单成功后得到
// 获取微信小程序支付的 paySign
// appId:AppID
// nonceStr:随机字符串
// packages:统一下单成功后拼接得到的值
// signType:签名方式,务必与统一下单时用的签名方式一致
// timeStamp:时间
// apiKey:API秘钥值
paySign := wechat.GetMiniPaySign(AppID, wxRsp.NonceStr, packages, wechat.SignType_MD5, timeStamp, apiKey)
// ====APP支付 paySign====
timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
// 获取APP支付的 paySign
// 注意:package 参数因为是固定值,无需开发者再传入
// appId:AppID
// partnerid:partnerid
// nonceStr:随机字符串
// prepayId:统一下单成功后得到的值
// signType:签名方式,务必与统一下单时用的签名方式一致
// timeStamp:时间
// apiKey:API秘钥值
paySign := wechat.GetAppPaySign(appid, partnerid, wxRsp.NonceStr, wxRsp.PrepayId, wechat.SignType_MD5, timeStamp, apiKey)
// ====微信内H5支付 paySign====
timeStamp := strconv.FormatInt(time.Now().Unix(), 10)
packages := "prepay_id=" + wxRsp.PrepayId // 此处的 wxRsp.PrepayId ,统一下单成功后得到
// 获取微信内H5支付 paySign
// appId:AppID
// nonceStr:随机字符串
// packages:统一下单成功后拼接得到的值
// signType:签名方式,务必与统一下单时用的签名方式一致
// timeStamp:时间
// apiKey:API秘钥值
paySign := wechat.GetH5PaySign(AppID, wxRsp.NonceStr, packages, wechat.SignType_MD5, timeStamp, apiKey)
异步通知请求参数需要先解析,解析出来的结构体或BodyMap再验签(此处需要注意,
http.Request.Body
只能解析一次,如果需要解析前调试,请处理好Body复用问题)
import (
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/wechat"
)
// ====同步返回参数验签Sign====
wxRsp, err := client.UnifiedOrder(bm)
// 微信同步返回参数验签或异步通知参数验签
// apiKey:API秘钥值
// signType:签名类型(调用API方法时填写的类型)
// bean:微信同步返回的结构体 wxRsp 或 异步通知解析的结构体 notifyReq
// 返回参数 ok:是否验签通过
// 返回参数 err:错误信息
ok, err := wechat.VerifySign(apiKey, wechat.SignType_MD5, wxRsp)
// ====支付异步通知参数解析和验签Sign====
// 解析支付异步通知的参数
// req:*http.Request
// ctx.Request 是 gin 框架的获取 *http.Request
// ctx.Request() 是 echo 框架的获取 *http.Request
// 返回参数 notifyReq:通知的参数
// 返回参数 err:错误信息
notifyReq, err := wechat.ParseNotifyToBodyMap(ctx.Request)
// 验签操作
ok, err := wechat.VerifySign(apiKey, wechat.SignType_MD5, notifyReq)
// ====退款异步通知参数解析,退款通知无sign,不用验签====
//
// 解析退款异步通知的参数,解析出来的 req_info 是加密数据,需解密
// req:*http.Request
// ctx.Request 是 gin 框架的获取 *http.Request
// ctx.Request() 是 echo 框架的获取 *http.Request
// 返回参数 notifyReq:通知的参数
// 返回参数 err:错误信息
notifyReq, err := wechat.ParseNotifyToBodyMap(c.Request)
或
notifyReq, err := wechat.ParseRefundNotify(c.Request)
// ==解密退款异步通知的加密参数 req_info ==
refundNotify, err := wechat.DecryptRefundNotifyReqInfo(notifyReq.ReqInfo, apiKey)
// ==异步通知,返回给微信平台的信息==
rsp := new(wechat.NotifyResponse) // 回复微信的数据
rsp.ReturnCode = gopay.SUCCESS
rsp.ReturnMsg = gopay.OK
// 此写法是 gin 框架返回微信的写法
c.String(http.StatusOK, "%s", rsp.ToXmlString())
// 此写法是 echo 框架返回微信的写法
return c.String(http.StatusOK, rsp.ToXmlString())
client.UnifiedOrder()
client.Micropay()
client.QueryOrder()
client.CloseOrder()
client.Reverse()
client.Refund()
client.QueryRefund()
client.DownloadBill()
client.DownloadFundFlow()
client.Report()
client.BatchQueryComment()
client.Transfer()
client.GetTransferInfo()
client.AuthCodeToOpenId()
client.EntrustPublic()
client.EntrustAppPre()
client.EntrustH5()
client.EntrustPaying()
client.ProfitSharing()
client.MultiProfitSharing()
client.ProfitSharingQuery()
client.ProfitSharingOrderAmountQuery()
client.ProfitSharingMerchantRatioQuery()
client.ProfitSharingAddReceiver()
client.ProfitSharingRemoveReceiver()
client.ProfitSharingFinish()
client.ProfitSharingReturn()
client.ProfitSharingReturnQuery()
client.PayBank()
client.QueryBank()
client.GetRSAPublicKey()
client.SendCashRed()
client.SendGroupCashRed()
client.SendAppletRed()
client.QueryRedRecord()
client.CustomsDeclareOrder()
client.CustomsDeclareQuery()
client.CustomsReDeclareOrder()
client.PostWeChatAPISelf()
wechat.GetParamSign()
=> 获取微信支付所需参数里的Sign值(通过支付参数计算Sign值)wechat.GetSanBoxParamSign()
=> 获取微信支付沙箱环境所需参数里的Sign值(通过支付参数计算Sign值)wechat.GetMiniPaySign()
=> 获取微信小程序支付所需要的paySignwechat.GetH5PaySign()
=> 获取微信内H5支付所需要的paySignwechat.GetAppPaySign()
=> 获取APP支付所需要的paySignwechat.ParseNotifyToBodyMap()
=> 解析微信支付异步通知的参数到BodyMapwechat.ParseNotify()
=> 解析微信支付异步通知的参数wechat.ParseRefundNotify()
=> 解析微信退款异步通知的参数wechat.VerifySign()
=> 微信同步返回参数验签或异步通知参数验签wechat.GetOpenIdByAuthCode()
=> 授权码查询openidwechat.GetOauth2AccessToken()
=> 微信第三方登录,code 换取 access_tokenwechat.RefreshOauth2AccessToken()
=> 刷新微信第三方登录后,获取到的 access_tokenwechat.CheckOauth2AccessToken()
=> 检验授权凭证(access_token)是否有效wechat.DecryptRefundNotifyReqInfo()
=> 解密微信退款异步通知的加密数据