2025-09-22 15:11:27 +08:00
2020-03-10 07:34:21 +08:00
2025-09-22 15:11:27 +08:00
2025-09-13 14:37:06 +08:00
2020-03-09 20:41:59 +08:00
2025-09-22 15:03:35 +08:00
2025-09-13 15:31:26 +08:00
2025-09-13 15:31:26 +08:00
2025-09-13 15:31:26 +08:00
2025-09-13 15:31:26 +08:00
2020-03-31 20:16:52 +08:00
2025-09-13 15:31:26 +08:00
2025-09-13 15:31:26 +08:00
2025-09-13 15:31:26 +08:00
2025-09-22 15:01:17 +08:00
2025-09-13 14:37:06 +08:00
2020-03-23 07:55:04 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 14:37:06 +08:00
2025-09-13 15:31:26 +08:00
2025-09-13 14:37:06 +08:00
2025-09-22 15:01:17 +08:00
2025-09-22 15:01:17 +08:00
2025-09-13 14:37:06 +08:00

介绍

golang 多微信号SDK,readygo子项目 API文档

感谢 https://gitee.com/xiaochengtech/wechat 提供的基础代码

go get gitee.com/chunanyong/gowe 
  • 支持境内普通商户和境内服务商(境外和银行服务商没有条件测试)
  • 全部参数和返回值均使用struct类型传递
  • 缓存前置,使用项目现有的缓存体系
  • 原生支持多微信号
  • 支持跳板请求微信API服务.例如内网服务器没有网络出口权限,可以使用Nginx跳板请求微信API服务
  • 原生支持集群部署

初始化

WxPayConfig初始化

type WxPayConfig struct {
    Id                   string
    AppId                string
    Secret               string
    MchID                string // 商户号
    MchAPIv3Key          string // 商户API v3密钥 (32字节)
    WechatPayCertificate string // 微信支付平台证书(示例,实际应从微信平台下载并定期更新)
    CertSerialNo         string // 商户证书序列号
    PrivateKey           string // 商户API私钥
    NotifyURL            string // 支付结果通知地址
}

var Wx = &WxPayConfig{
    Id:                   "xxx",
    AppId:                "xxx",               // 小程序/公众号AppID
    Secret:               "xxx", // 小程序/公众号密钥
    MchID:                "xxx",                       // 商户号
    MchAPIv3Key:          "xxx",  // 商户API v3密钥 (32字节)
    WechatPayCertificate: "xxx",//商户证书wechatpay_开头的
    CertSerialNo:         "xxx",// 商户API证书的序列号
    PrivateKey:           "xxx",// 商户API私钥
    NotifyURL:            "https://xxx/xxx/xxx",//回调地址
}

func (w WxPayConfig) GetId(ctx context.Context) string {
    return w.Id
}

func (w WxPayConfig) GetAppId(ctx context.Context) string {
    return w.AppId
}

func (w WxPayConfig) GetAccessToken(ctx context.Context) string {
    panic("implement me")
}

func (w WxPayConfig) GetSecret(ctx context.Context) string {
    return w.Secret
}

func (w WxPayConfig) GetCertificateFile(ctx context.Context) string {
    return "../cert/apiclient_cert.pem"
}

func (w WxPayConfig) GetSubAppId(ctx context.Context) string {
    panic("implement me")
}
func (w WxPayConfig) GetAPIKey(ctx context.Context) string {
    return w.MchAPIv3Key
}

func (w WxPayConfig) GetSignType(ctx context.Context) string {
    return "MD5"
}

func (w WxPayConfig) GetServiceType(ctx context.Context) int {
    return 1
}

func (w WxPayConfig) IsProd(ctx context.Context) bool {
    return true
}

func (w WxPayConfig) GetMchID(ctx context.Context) string {
    return w.MchID
}
func (w WxPayConfig) GetMchAPIv3Key(ctx context.Context) string {
    return w.MchAPIv3Key
}
func (w WxPayConfig) GetWechatPayCertificate(ctx context.Context) string {
    return w.WechatPayCertificate
}
func (w WxPayConfig) GetCertSerialNo(ctx context.Context) string {
    return w.CertSerialNo
}
func (w WxPayConfig) GetPrivateKey(ctx context.Context) string {
    return w.PrivateKey
}
func (w WxPayConfig) GetNotifyURL(ctx context.Context) string {
    return w.NotifyURL
}

使用

以下是通用的接口WxConfig 设置为全局变量,使用gowe.XXX调用

使用样例:


func TestGetAccessToken(t *testing.T)  {
	token, err := gowe.GetAccessToken(wx)
	if err != nil {
		t.Log("error:" ,err)
	}
	t.Log("token:",token)
}

微信支付v3

  • Native支付(扫码支付) WxPayTransactionsNative
  • 统一下单:WxPayTransactionsJsapi

微信支付v3回调

  • 验签:VerifyWechatSignature
  • 回调:WechatPayCallback

##基于hertz框架(示例)

//微信支付统一下单,返回一个prepay_id,参数解释请看方法注释
jsapi, err := gowe.WxPayTransactionsJsapi(ctx, Wx, OpenId, 1, "测试微信支付")
//扫码支付(Native方式),返回一个code_url,参数解释请看方法注释
native, err := gowe.WxPayTransactionsNative(ctx, Wx, ip, "0001", 1, "测试微信支付")
//回调
func HandleWechatPayCallback(ctx context.Context, c *app.RequestContext) {
	// 1. 验证签名
	fmt.Println("微信回调请求到达----------")

	// 从请求头获取签名相关字段
	timestamp := string(c.Request.Header.Peek("Wechatpay-Timestamp"))
	nonce := string(c.Request.Header.Peek("Wechatpay-Nonce"))
	signature := string(c.Request.Header.Peek("Wechatpay-Signature"))
	serial := string(c.Request.Header.Peek("Wechatpay-Serial"))

	if timestamp == "" || nonce == "" || signature == "" || serial == "" {
		fmt.Println("缺少签名头----------")
		c.JSON(400, map[string]string{"message": "缺少签名头"})
		return
	}

	body, err := c.Body()
	if err != nil {
		fmt.Println("读取请求体失败----------", err.Error())
		c.JSON(400, map[string]string{"message": "读取请求体失败"})
		return
	}
	// 通常不需要再手动调用 SetBody但如果你后续处理需要可以设置
	c.Request.SetBody(body)
	//验签
	err = gowe.VerifyWechatSignature(ctx, Wx, timestamp, nonce, signature, serial, body)
	if err != nil {
		fmt.Printf("签名验证失败: %v", err)
		c.JSON(400, map[string]string{"message": fmt.Sprintf("签名验证失败: %v", err)})
		return
	}

	//回调
	callback := gowe.WechatPayCallback(ctx, Wx, body)
	if callback.Code == 0 {
		fmt.Println("微信回调成功----------")
		// 7. 返回成功
		c.JSON(200, map[string]string{"message": "Success"})
	} else {
		fmt.Println("微信回调失败----------")
		// 7. 返回成功
		c.JSON(400, map[string]string{"message": "error"})
	}

}

微信支付v2

  • 提交付款码支付 WxPayMicropay
  • 查询订单:WxPayQueryOrder
  • 关闭订单:WxPayCloseOrder
  • 撤销订单:WxPayReverse
  • 申请退款:WxPayRefund
  • 查询退款:WxPayQueryRefund
  • 下载对账单:WxPayDownloadBill
  • 交易保障(JSAPI)WxPayReportJsApi
  • 交易保障(MICROPAY)WxPayReportMicropay

微信红包

  • 发送现金红包 WxPaySendRedPack
  • 发送裂变红包 WxPaySendGroupRedPack
  • 发送小程序红包 WxPaySendMiniProgramHB
  • 查询红包记录 WxPayGetHBInfo

企业付款

  • 企业付款到零钱 WxPayPromotionMktTransfers
  • 查询企业付款 WxPayQueryMktTransfer

微信支付回调

  • 退款回调:WxPayNotifyRefund

微信公众号

  • 获取基础支持的AccessTokenWxMpWebAuthAccessToken
  • 获取用户基本信息(UnionId机制)WxMpGetUserInfo
  • 获取H5支付签名WxPayH5Sign
  • 临时二维码:WxMpQrCreateTemporary
  • 永久二维码:WxMpQrCreatePermanent
  • 发送模板消息:WxMpTemplateMsgSend
  • 发送订阅消息: WxMpSubscribeMsgSend

微信小程序

  • 获取小程序支付签名:WxPayMaSign
  • 获取小程序码:WxMaCodeGetUnlimited
  • 发送订阅消息:WxMaSubscribeMessageSend

文档

Description
Go 多微信号 SDK
Readme Apache-2.0 288 KiB
Languages
Go 100%