/wechat-sdk

WeChatPay package written in Go

Primary LanguageGoMIT LicenseMIT

wechat-sdk

Update

更新至V3版本微信API

如何在项目中引用

V2版本微信API

// get go mod
go get github.com/pyihe/wechat-sdk@v1.0.0

// import in project
import "github.com/pyihe/wechat-sdk"

v2版本API文档

V3版本微信API

// get go mod
go get github.com/pyihe/wechat-sdk/v3@v3.0.0

// import in project
import "github.com/pyihe/wechat-sdk/v3"

Usage

NOTE:

  1. 考虑v3版本的微信API参数较多且存在很多嵌套的结构体, 对于只需要body参数的API, 本package统统使用interface{}作为函数形参,请调用者自己构造可序列化的参数体( 结构体、map或者序列化好了的json字符串或者字节切片[]byte)!
  2. 对于非interface{}的形参, 调用者只需要按照函数规定传参即可!
  3. 对于不同功能但应答参数相似的API(如预支付API和支付查询API等), 本package为了避免重复声明接收API应答参数的结构体, 最终使用了公共的结构体, 调用者处理API返回结果时, 请严格参考 微信官方文档 忽略掉文档没有的参数!
  4. 对于微信异步回调回来的通知, 本package会将通知结果反序列化至对应的应答结构体, 请调用者根据结果处理自己的业务逻辑, 并在处理完成后一定告知微信服务器!
package main

import (
	"github.com/pyihe/wechat-sdk/v3/service"
	"github.com/pyihe/wechat-sdk/v3/service/mini"
	"github.com/pyihe/wechat-sdk/v3/service/official"
	"github.com/pyihe/wechat-sdk/v3/service/payment/merchant"
)

// WechatConfig 微信相关参数配置
var WechatConfig struct {
	AppId          string `json:"appid"`       // 应用ID
	MchId          string `json:"mchid"`       // 商户号
	SerialNo       string `json:"serial_no"`   // 商户证书序列号
	Apikey         string `json:"apikey"`      // API v3 Key
	PrivateKeyPath string `json:"private_key"` // 商户平台私钥文件
	PublicKeyPath  string `json:"public_key"`  // 商户微信支付平台公钥文件
}

// PayBody 支付请求参数
type PayBody struct {
	AppId       string  `json:"appid"`        // 应用ID
	MchId       string  `json:"mchid"`        // 商户号
	Description string  `json:"description"`  // 商品描述
	OutTradeNo  string  `json:"out_trade_no"` // 商户订单号
	NotifyUrl   string  `json:"notify_url"`   // 支付异步回调通知
	Amount      *Amount `json:"amount"`       // 订单金额信息
	Payer       *Payer  `json:"payer"`        // 支付者
}

type Amount struct {
	Total    int64  `json:"total"`              // 订单总金额
	Currency string `json:"currency,omitempty"` // 货币类型
}

type Payer struct {
	OpenId string `json:"openid"` // 用户标识
}

func handleErr(err error) {
	//...
}

func main() {
    var opts = []service.Option{
        service.WithAppId(WechatConfig.AppId),
        service.WithMchId(WechatConfig.MchId),
        service.WithApiV3Key(WechatConfig.Apikey),
        service.WithSerialNo(WechatConfig.SerialNo),
    }
    var srvConfig = service.NewConfig(opts...)
    
    var param = &PayBody{
        AppId:       "wxdace645e0bc2cXXX",
        MchId:       "1900006XXX",
        Description: "Image形象店-深圳腾大-QQ公仔",
        OutTradeNo:  "1217752501201407033233368318",
        NotifyUrl:   "https://weixin.qq.com/",
        Amount: &Amount{
            Total:    1,
            Currency: "CNY",
        },
        Payer: &Payer{OpenId: "o4GgauInH_RCEdvrrNGrntXDuXXX"},
    }
    // 普通商户支付
    merchantResponse, err := merchant.JSAPI(srvConfig, param)
    if err != nil {
        handleErr(err)
    }
    // 小程序获取用户openid
    miniData, err := mini.GetOpenId(srvConfig, "your jsCode")
    if err != nil {
        handleErr(err)
    }
    // 公众号获取用户openid
    officialData, err := official.GetOpenId(srvConfig, "your grant code")
    if err != nil {
        handleErr(err)
    }
}

TODO

致谢

感谢Jetbrains开源开发许可证 提供的免费开发工具支持!