“视频号小店”在2024年9月25日正式更名为“微信小店”,API调用不受影响。
Go语言实现微信视频号sdk(自建应用维度),集成了视频号小店和视频号橱窗的功能,使用简单,扩展灵活
- 支持一键生成sdk代码,包括api和回调事件
- 用缓存方案实现分布式 access_token,保证在多个服务中只有一个服务能成功调用API请求 access_token,减少API调用次数和服务重启需要重新获取的情况
- 缓存方案支持自定义存储,默认内存存储
- 支持自定义日志存储,提供Logger interface:用于自行实现日志记录器,便于收集日志
- 默认 log.Printf 输出
go get github.com/zsmhub/wx-channels-sdk
-
生成视频号回调事件代码
make callback doc=文档链接 # example make callback doc=https://developers.weixin.qq.com/doc/channels/API/product/callback/ProductSpuListing.html
-
生成视频号api代码
make api doc=文档链接 [prefix=生成文件名前缀] # example make api doc=https://developers.weixin.qq.com/doc/channels/API/product/get.html prefix=商品
tip:
- Get 方式的接口量少没做兼容,请求参数需手动整理到 Req 结构体,Post 则不用
- 部分接口文档的请求/响应 json 示例,如果缺少部分字段,需手动补上
- 部分复杂的页面需要手动整理下sdk
强烈建议去 ./demo 文件夹查看完整示例!
// 回调事件初始化
func (callbackRepo) InitCallbackHandler() error {
// 视频号小店回调事件解析
if err := channels.Sdk.NewShopCallbackHandler(ShopCallbackToken, ShopCallbackEncodingAESKey); err != nil {
return err
}
// 视频号橱窗回调事件解析
if err := channels.Sdk.NewWindowCallbackHandler(WindowCallbackToken, WindowCallbackEncodingAESKey); err != nil {
return err
}
return nil
}
// 视频号小店-解析并获取回调信息
msg, err := channels.Sdk.ShopCallback.GetCallbackMsg(c.Request())
// 视频号橱窗-解析并获取回调信息
msg, err := channels.Sdk.WindowCallback.GetCallbackMsg(c.Request())
// 视频号小店-处理回调事件完整示例
func (callbackRepo) HandleShopPostReqShouest(c echo.Context) error {
msg, err := channels.Sdk.ShopCallback.GetCallbackMsg(c.Request())
if err != nil {
return err
}
go func() {
defer func() {
_ = recover()
}()
switch msg.MsgType {
case callbacks.MessageTypeEvent:
switch msg.EventType {
case callbacks.EventTypeProductSpuAudit:
extras, ok := msg.Extras.(callbacks.EventProductSpuAudit)
if !ok {
fmt.Println("获取商品审核回调参数失败")
return
}
fmt.Printf("接收到商品审核事件的原始内容:%s\n", msg.OriginalMessage)
fmt.Printf("解析商品审核事件的结构体:%+v\n", extras)
}
}
}()
return nil
}
// API客户端初始化
func initApiHandler() error {
// 初始化sdk参数
channels.Sdk.InitOptions(apis.Options{
DcsToken: DcsTokenByRedis{},
Logger: Logger{},
})
// 视频号小店API客户端初始化
channels.Sdk.NewShopApiClient(ShopAppId, ShopAppSecret)
// 视频号橱窗API客户端初始化
channels.Sdk.NewWindowApiClient(WindowAppId, WindowAppSecret)
return nil
}
// 获取 access_token
resp, err := channels.Sdk.ShopClient.GetToken()
// 获取店铺信息
resp, err := channels.Sdk.ShopClient.ExecEcBasicsInfoGet(apis.ReqEcBasicsInfoGet{})
// error code 类型强制转换
if err != nil {
if apiError, ok := err.(*apis.ClientError); ok {
if apiError.Code == apis.ErrCode40013 {
return errors.New("不合法的 AppID")
}
}
return nil, err
}
.
├── apis 视频号API
│ └── api.error.go 全局错误码
├── callbacks 视频号回调事件
│ └── callback_constant.go 回调事件常量定义
├── demo sdk调用示例
├── generate 一键生成脚本
│ ├── api.go 一键生成视频号API脚本
│ └── callback.go 一键生成企微回调事件脚本
├── internal 消息加解密库
├── constant.go 全局枚举值定义
└── sdk.go 入口文件
- 如果你发现了sdk中,没有某个回调事件或某个api,可以使用一键生成sdk代码命令生成,然后提交下pr
- 注意视频号access_token不支持互刷,获取了新的access_token,旧的access_token就会很快失效