V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
wleven
V2EX  ›  分享创造

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

  •  1
     
  •   wleven · 2020-04-28 22:14:59 +08:00 · 3289 次点击
    这是一个创建于 1457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    微信支付 SDK For Golang

    go 1.14 go.dev doc GitHub license

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

    安装包

    go get -u  github.com/wleven/wxpay
    

    查看文档

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

    支付环境初始化

    WxPay Doc APIClientPath Doc

    	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 // 根证书路径
    	}
    
    

    统一下单

    WxPay Doc UnifiedOrder Doc

    	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)
    	}
    

    小程序支付

    WxPay Doc UnifiedOrder Doc

    	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)
    	}
    
    

    付款码支付

    WxPay Doc Micropay Doc

    	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)
    	}
    
    

    关闭订单

    WxPay Doc

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

    撤销订单

    WxPay Doc ReverseOrder Doc

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

    查询订单

    WxPay Doc OrderQuery Doc

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

    申请退款

    WxPay Doc Refund Doc

    	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)
    	}
    

    查询退款

    WxPay Doc RefundQuery Doc

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

    添加分账接收方

    WxPay Doc Receiver Doc

    	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)
    	}
    
    

    删除分账接收方

    WxPay Doc Receiver Doc

    	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)
    	}
    
    

    发起分账

    WxPay Doc ProfitSharing Doc

    	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)
    	}
    
    

    完成分账

    WxPay Doc ProfitSharingFinish Doc

    	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)
    	}
    
    

    查询分账结果

    WxPay Doc ProfitSharingQuery Doc

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

    分账回退

    WxPay Doc ProfitSharingReturn Doc

    	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)
    	}
    
    

    分账回退结果查询

    WxPay Doc ProfitSharingReturnQuery Doc

    	var WxPay = pay.WxPay{
    		// 支付初始化参数
    	}
    	if result, err := WxPay.ProfitSharingReturnQuery(pay.ProfitSharingReturnQuery{
    		OutOrderNo:  "1111111",
    		OutReturnNo: "1111112",
    	}); err == nil {
    		log.Println(result)
    	} else {
    		log.Println(err)
    	}
    
    
    15 条回复    2020-05-08 22:28:26 +08:00
    shuang
        1
    shuang  
       2020-04-29 12:42:08 +08:00
    请问下微信接口要求分账比例最大不超过 30%,如何突破这个限制呢
    wleven
        2
    wleven  
    OP
       2020-04-29 14:09:27 +08:00
    @shuang 这个没办法的噢,超过的就线下操作呗
    Nxxx
        3
    Nxxx  
       2020-04-29 16:06:26 +08:00
    已 star 刚好可能会用到 现谢谢了
    wleven
        4
    wleven  
    OP
       2020-04-29 22:53:34 +08:00
    @Nxxx 感谢支持
    Aether
        5
    Aether  
       2020-05-05 13:14:23 +08:00
    请问一下
    // 支付初始化参数
    这个地方需要我做什么吗?
    Aether
        6
    Aether  
       2020-05-05 13:18:53 +08:00
    顺便说一下,

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

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

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

    请问一下,
    WxPay 和 pay
    在这里分别是什么?
    wleven
        9
    wleven  
    OP
       2020-05-06 09:10:08 +08:00
    @Aether 初始化参数填写微信商户的商户 ID 支付密钥 等等就可以
    wleven
        10
    wleven  
    OP
       2020-05-06 09:10:33 +08:00
    @Aether 哈哈 ,对的 写错啦
    wleven
        11
    wleven  
    OP
       2020-05-06 09:11:19 +08:00
    @Aether pay 是报名,wxpay 是自定义的全局变量
    wleven
        12
    wleven  
    OP
       2020-05-06 09:14:47 +08:00
    @Aether pay 是包名,wxpay 是自定义的全局变量
    Wichna
        13
    Wichna  
       2020-05-07 10:26:54 +08:00
    不错,欢迎发到 Paybase https://paybase.cn
    Aether
        14
    Aether  
       2020-05-08 21:49:33 +08:00
    @wleven
    请问一下 signType 是 HMAC-SHA256 吗?
    (论如何制造问答式技术文档……🤦‍♂️)
    wleven
        15
    wleven  
    OP
       2020-05-08 22:28:26 +08:00
    @Aether 对的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3186 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:29 · PVG 21:29 · LAX 06:29 · JFK 09:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.