V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
IIInsomnia
V2EX  ›  Go 编程语言

推荐个微信 Go SDK

  •  
  •   IIInsomnia ·
    shenghui0779 · 2022-02-25 23:31:53 +08:00 · 2513 次点击
    这是一个创建于 1030 天前的主题,其中的信息可能已经有所发展或是发生改变。

    gochat

    golang GitHub release pkg.go.dev Apache 2.0 license

    📦 微信 Go SDK

    模块 功能
    支付 下单、支付、退款、查询、委托代扣、红包、企业付款、账单、评价数据、验签、解密
    公众号 授权、用户、消息、素材、菜单、发布能力、草稿箱、客服、二维码、OCR 、回复、事件处理 等
    小程序 授权、解密、二维码、消息、客服、素材、插件、URL Scheme 、URL Link 、OCR 、事件处理 等
    企业微信 支持几乎所有服务端 API

    获取

    go get -u github.com/shenghui0779/gochat
    

    使用须知

    • 微信 API 被封装成 Action 接口(授权 和 AccessToken 等部分 API 除外)
    • 每个 API 对应一个 Action,统一由 Do 方法执行
    • 除支付( mch )外,返回结果均以 Result 为前缀的结构体指针接收
    • 对于微信支付的回调通知处理,提供了两个方法:
      • 验签 - VerifyWXMLResult
      • 解密 - DecryptWithAES256ECB (退款)
    • 对于微信推送的事件消息处理,提供了三个方法:
      • 验签 - VerifyEventSign
      • 解密 - DecryptEventMessage
      • 回复 - Reply
    • 企业微信按照不同功能模块划分了相应的目录,根据 URL 可以找到对应的目录和文件
    • 所有 API 均采用 Mock 单元测试( Mock 数据来源于官方文档,如遇问题,欢迎提Issue

    支付

    • 版本:V2
    • 模式:普通商户直连模式
    import (
        "github.com/shenghui0779/gochat"
        "github.com/shenghui0779/gochat/wx"
        "github.com/shenghui0779/gochat/mch"
    )
    
    // 创建实例
    pay := gochat.NewMch("mchid", "apikey", tls.Certificate...)
    
    // 设置 debug 模式(支持自定义日志)
    pay.SetClient(wx.WithDedug(), wx.WithLogger(wx.Logger))
    
    // --------- 统一下单 -------------------------------
    action := mch.UnifyOrder("appid", &mch.ParamsUnifyOrder{...})
    result, err := pay.Do(ctx, action)
    
    if err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 拉起支付 -------------------------------
    
    // APP 支付
    pay.APPAPI("appid", "prepayID")
    
    // JSAPI/小程序支付
    pay.JSAPI("appid", "prepayID")
    
    // 小程序红包
    pay.MinipRedpackJSAPI("appid", "package")
    

    公众号

    import (
        "github.com/shenghui0779/gochat"
        "github.com/shenghui0779/gochat/wx"
        "github.com/shenghui0779/gochat/offia"
    )
    
    // 创建实例
    oa := gochat.NewOffia("appid", "appsecret")
    
    // 设置服务器配置
    oa.SetServerConfig("token", "encodingAESKey")
    
    // 设置 debug 模式(支持自定义日志)
    oa.SetClient(wx.WithDedug(), wx.WithLogger(wx.Logger))
    
    // --------- 生成网页授权 URL -------------------------------
    
    url := oa.OAuth2URL(offia.ScopeSnsapiBase, "redirectURL", "state")
    
    fmt.Println(url)
    
    // --------- 获取网页授权 Token -------------------------------
    
    result, err := oa.Code2OAuthToken(ctx, "code")
    
    if err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 获取 AccessToken -------------------------------
    
    result, err := oa.AccessToken(ctx)
    
    if err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 获取关注的用户列表 -------------------------------
    
    result := new(offia.ResultUserList)
    action := offia.GetUserList("nextOpenID", result)
    
    if err := oa.Do(ctx, action); err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    

    小程序

    import (
        "github.com/shenghui0779/gochat"
        "github.com/shenghui0779/gochat/wx"
        "github.com/shenghui0779/gochat/minip"
    )
    
    // 创建实例
    oa := gochat.NewMinip("appid", "appsecret")
    
    // 设置服务器配置
    oa.SetServerConfig("token", "encodingAESKey")
    
    // 设置 debug 模式(支持自定义日志)
    oa.SetClient(wx.WithDedug(), wx.WithLogger(wx.Logger))
    
    // --------- 获取授权 SessionKey -------------------------------
    
    result, err := oa.Code2Session(ctx, "code")
    
    if err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 获取 AccessToken -------------------------------
    
    result, err := oa.AccessToken(ctx)
    
    if err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 解密授权的用户信息 -------------------------------
    
    result := new(minip.UserInfo)
    
    if err := DecryptAuthInfo("sessionKey", "iv", "encryptedData", result); err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 创建小程序二维码 -------------------------------
    
    qrcode := new(minip.QRCode)
    action := minip.CreateQRCode("pagepath", 120, qrcode)
    
    if err := minip.Do(ctx, action); err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(base64.StdEncoding.EncodeToString(qrcode.Buffer))
    

    企业微信

    import (
        "github.com/shenghui0779/gochat"
        "github.com/shenghui0779/gochat/wx"
        "github.com/shenghui0779/gochat/corp"
        "github.com/shenghui0779/gochat/corp/addrbook"
    )
    
    // 创建实例
    cp := gochat.NewCorp("corpid")
    
    // 设置服务器配置
    cp.SetServerConfig("token", "encodingAESKey")
    
    // 设置 debug 模式(支持自定义日志)
    cp.SetClient(wx.WithDedug(), wx.WithLogger(wx.Logger))
    
    // --------- 生成网页授权 URL -------------------------------
    
    url := cp.OAuth2URL(corp.ScopeSnsapiBase, "redirectURL", "state")
    
    fmt.Println(url)
    
    // --------- 生成扫码授权 URL -------------------------------
    
    url := cp.QRCodeAuthURL("agentID", "redirectURL", "state")
    
    fmt.Println(url)
    
    // --------- 获取 AccessToken -------------------------------
    
    result, err := cp.AccessToken(ctx, "secret")
    
    if err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    
    // --------- 获取部门列表 -------------------------------
    
    result := new(addrbook.ResultDepartmentList)
    action := addrbook.ListDepartment(0, result)
    
    if err := cp.Do(ctx, action); err != nil {
        log.Println(err)
    
        return
    }
    
    fmt.Println(result)
    

    说明

    • API Reference
    • 注意:因 access_token 每日获取次数有限且含有效期,故服务端应妥善保存 access_token 并定时刷新
    • 配合 yiigo 使用,可以更方便的操作 MySQLMongoDBRedis

    Enjoy 😊

    4 条回复    2022-02-28 17:32:07 +08:00
    wzw
        1
    wzw  
       2022-02-26 08:03:58 +08:00 via iPhone
    IIInsomnia
        2
    IIInsomnia  
    OP
       2022-02-26 10:41:26 +08:00
    @wzw 风格不同
    scyuns
        3
    scyuns  
       2022-02-26 13:12:48 +08:00
    收藏了 谢谢 op 的分享
    dany813
        4
    dany813  
       2022-02-28 17:32:07 +08:00
    看着不错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2652 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:21 · PVG 23:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.