别再问用 Go 语言如何对接微信支付了:看看这个包

Go语言精选

共 4742字,需浏览 10分钟

 ·

2020-08-30 23:57

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言

作为开发人员,微信生态我们不能无视,微信提供的开放能力,我们应该有所了解。微信支付作为重要的一部分,平时工作中可能难免会遇到。Go 作为一门新语言,微信支付没有提供 Go 的 SDK。你可以选择自己实现,也可以找第三方实现好的。对于第三方,即使不自己实现,看看别人怎么实现的,对自己也会有启发。今天就为大家推荐一个微信支付 Go SDK,收藏以备不时之需吧。

项目地址:https://github.com/pyihe/wechat-sdk。

一、功能列表

已经实现的功能如下。

Mini Program(小程序)

NameExplaincomment
GetUserPhoneForMini小程序获取电话号码客户端调用微信接口获取加密信息时不能在回调中再次调用登陆接口, 否则会让session_key失效
GetSessionKeyAndOpenId通过小程序授权code获取session_key和用户openid
GetAccessTokenForMini小程序获取AccessToken
GetUserInfoForMini小程序获取用户基本信息

Official Accounts(公众号)

NameExplaincomment
GetAppBaseAccessToken公众号开发获取基础接口调用Access_Token用于调用其他接口
GetAppOauthAccessToken公众号开发通过code获取网页授权Access_Token此Access_Token用于拉取用户信息, code只能用一次
RefreshOauthToken公众号开发刷新网页授权Access_Token
GetAppUserInfo公众号开发拉取用户信息返回结果参考微信文档[1]
CheckOauthToken公众号开发校验网页授权Access_Token是否有效

WeChat Pay(微信支付)

NameExplaincomment
CloseOrder关闭订单
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=xxxxxxx
UnifiedQuery下单结果查询

ProfitSharing(商户分账)

NameExplaincomment
ProfitSharing申请分账(单次或多次)multiTag标志是否是多次分账
QueryProfitSharing查询分账请求的结果非分账的结果,而是分账申请的结果
AddProfitSharingReceiver添加分账接收方
RemoveProfitSharingReceiver删除分账接受方
FinishProfitSharing完结分账如果订单不需要(再)分账, 且剩余待分账金额不为0时, 调用本接口将剩余金额冻结给特约商户
ReturnProfitSharing分账回退对已分账的订单进行退款时,先调用本接口将金额从分账接收方回退给商户(非异步, 同步回传回退结果)
QueryProfitSharingReturn回退结果查询用于核实回退结果
ProfitSharingNotify分账动帐通知分账或分账回退成功后, 微信会将结果发送给商户, 通知结果包含加密信息, 此处解密密钥为ApiV3密钥。接口返回结果中忽略层级关系,对于需要的字段直接使用Get方法获取值。通知url在商户平台配置,详情参加分账动帐通知[3]

RedPack(现金红包)

NameExplaincomment
SendRedPack发放现金红包
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 %s\n", 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 = %v\n", 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





推荐阅读



学习交流 Go 语言,扫码回复「进群」即可


站长 polarisxu

自己的原创文章

不限于 Go 技术

职场和创业经验


Go语言中文网

每天为你

分享 Go 知识

Go爱好者值得关注


浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报