自用的 golang 微信支付 sdk,支持微信商户/服务商账户支付和分账

2020-04-28 22:14:59 +08:00
 wleven

微信支付 SDK For Golang

支持微信商户支付 /商户分账 /服务商支付 /服务商分账

安装包

go get -u  github.com/wleven/wxpay

查看文档

// 执行命令
godoc -http:=8888 -play
// 浏览器打开文档
http://127.0.0.1:8888/pkg/github.com/wleven/wxpay/

支付环境初始化

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}

	// WxPay 支付环境
	type WxPay struct {
		AppID         string        // 商户 /服务商 AppId(公众号 /小程序)
		MchID         string        // 商户 /服务商 商户号
		SubAppID      string        // 子商户公众号 ID
		SubMchID      string        // 子商户商户号
		PayNotify     string        // 支付结果回调地址
		RefundNotify  string        // 退款结果回调地址
		Secret        string        // 微信支付密钥
		APIClientPath pay.APIClientPath // API 证书路径
	}

	// APIClientPath 微信支付 API 证书
	type APIClientPath struct {
		Cert string // 证书路径
		Key  string // 证书密钥路径
		Root string // 根证书路径
	}

统一下单

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
    if result, err := WxPay.UnifiedOrder(pay.UnifiedOrder{
		Attach:         "支付测试",
		OutTradeNo:     "11111111111114",
		TotalFee:       1,
		SpbillCreateIP: "127.0.0.1",
		OpenID:         "owJNp5PDj8lja9S3m2l2M_jt3aHY",
		Receipt:        "Y",
		Body:           "测试",
		TradeType:      "JSAPI",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

小程序支付

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := pay.WxAppPay(UnifiedOrder{
		Attach:         "支付测试",
		OutTradeNo:     "11111111111115 ",
		TotalFee:       1,
		SpbillCreateIP: "127.0.0.1",
		OpenID:         "owJNp5PDj8lja9S3m2l2M_jt3aHY",
		Receipt:        "Y",
		Body:           "测试",
		TradeType:      "JSAPI",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

付款码支付

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := pay.Micropay(Micropay{
		Attach:         "支付测试",
		OutTradeNo:     "11111111111115",
		TotalFee:       1,
		SpbillCreateIP: "127.0.0.1",
		Receipt:        "Y",
		Body:           "测试",
		AuthCode:       "12312312312",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

关闭订单

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.CloseOrder("11111111111112"); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

撤销订单

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := pay.ReverseOrder(ReverseOrder{
		OutTradeNo: "11111111111112",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

查询订单

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.OrderQuery(pay.OrderQuery{
		OutTradeNo: "11111111111113",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println.Error(err)
	}

申请退款

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.Refund(pay.Refund{
		OutTradeNo:  "11111111111113",
		TotalFee:    100,
		RefundFee:   1,
		OutRefundNo: "11111111111113",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

查询退款

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := pay.RefundQuery(RefundQuery{
		OutTradeNo: "11111111111113",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

添加分账接收方

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.ProfitSharingAddReceiver(pay.Receiver{
		Type:         "PERSONAL_OPENID",
		Account:      "owJNp5PDj8lja9S3m2l2M_jt3aHY",
		RelationType: "DISTRIBUTOR",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

删除分账接收方

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
    if result, err := WxPay.ProfitSharingRemoveReceiver(pay.Receiver{
		Type:    "PERSONAL_OPENID",
		Account: "owJNp5PDj8lja9S3m2l2M_jt3aHY",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

发起分账

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	// 第二个参数 options 为 multi 为多次分账  默认为单次
	if result, err := WxPay.ProfitSharing(pay.ProfitSharing{
		TransactionID: "11111",
		OutOrderNo:    "111111",
		Receivers:     []Receiver{{Type: "PERSONAL_OPENID", Account: "owJNp5PDj8lja9S3m2l2M_jt3aHY", Amount: 1, Description: "个人分成"}},
	}, "multi"); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

完成分账

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.ProfitSharingFinish(pay.ProfitSharingFinish{
		TransactionID: "11111",
		OutOrderNo:    "111111",
		Description:   "分账完成",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

查询分账结果

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.ProfitSharingQuery(pay.ProfitSharingQuery{
		TransactionID: "11111",
		OutOrderNo:    "111111",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

分账回退

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.ProfitSharingReturn(pay.ProfitSharingReturn{
		OutOrderNo:    "1111111",
		OutReturnNo:   "1111112",
		ReturnAccount: "12312312",
		ReturnAmount:  100,
		Description:   "回退",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

分账回退结果查询

	var WxPay = pay.WxPay{
		// 支付初始化参数
	}
	if result, err := WxPay.ProfitSharingReturnQuery(pay.ProfitSharingReturnQuery{
		OutOrderNo:  "1111111",
		OutReturnNo: "1111112",
	}); err == nil {
		log.Println(result)
	} else {
		log.Println(err)
	}

3313 次点击
所在节点    分享创造
15 条回复
shuang
2020-04-29 12:42:08 +08:00
请问下微信接口要求分账比例最大不超过 30%,如何突破这个限制呢
wleven
2020-04-29 14:09:27 +08:00
@shuang 这个没办法的噢,超过的就线下操作呗
Nxxx
2020-04-29 16:06:26 +08:00
已 star 刚好可能会用到 现谢谢了
wleven
2020-04-29 22:53:34 +08:00
@Nxxx 感谢支持
Aether
2020-05-05 13:14:23 +08:00
请问一下
// 支付初始化参数
这个地方需要我做什么吗?
Aether
2020-05-05 13:18:53 +08:00
顺便说一下,

···
// 执行命令
godoc -http:=8888 -play
···

这里是不是笔误?
好像应该是:

···
// 执行命令
godoc -http=:8888 -play
···
Aether
2020-05-05 14:48:24 +08:00
请问一下,
// 证书路径
怎么填好呢?
写本地相对 GO project 的绝对路径吗?
Aether
2020-05-05 20:42:27 +08:00
WxPay.UnifiedOrder(pay.UnifiedOrder

请问一下,
WxPay 和 pay
在这里分别是什么?
wleven
2020-05-06 09:10:08 +08:00
@Aether 初始化参数填写微信商户的商户 ID 支付密钥 等等就可以
wleven
2020-05-06 09:10:33 +08:00
@Aether 哈哈 ,对的 写错啦
wleven
2020-05-06 09:11:19 +08:00
@Aether pay 是报名,wxpay 是自定义的全局变量
wleven
2020-05-06 09:14:47 +08:00
@Aether pay 是包名,wxpay 是自定义的全局变量
Wichna
2020-05-07 10:26:54 +08:00
不错,欢迎发到 Paybase https://paybase.cn
Aether
2020-05-08 21:49:33 +08:00
@wleven
请问一下 signType 是 HMAC-SHA256 吗?
(论如何制造问答式技术文档……🤦‍♂️)
wleven
2020-05-08 22:28:26 +08:00
@Aether 对的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX