mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-08 22:52:27 +08:00
improve comment ,参考:https://github.com/huacnlee/autocorrect
This commit is contained in:
@@ -8,7 +8,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
// 获取微信服务器IP地址
|
||||
// 获取微信服务器 IP 地址
|
||||
// 文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html
|
||||
getCallbackIPURL = "https://api.weixin.qq.com/cgi-bin/getcallbackip"
|
||||
getAPIDomainIPURL = "https://api.weixin.qq.com/cgi-bin/get_api_domain_ip"
|
||||
@@ -29,13 +29,13 @@ func NewBasic(context *context.Context) *Basic {
|
||||
return basic
|
||||
}
|
||||
|
||||
// IPListRes 获取微信服务器IP地址 返回结果
|
||||
// IPListRes 获取微信服务器 IP 地址 返回结果
|
||||
type IPListRes struct {
|
||||
util.CommonError
|
||||
IPList []string `json:"ip_list"`
|
||||
}
|
||||
|
||||
// GetCallbackIP 获取微信callback IP地址
|
||||
// GetCallbackIP 获取微信 callback IP 地址
|
||||
func (basic *Basic) GetCallbackIP() ([]string, error) {
|
||||
ak, err := basic.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -51,7 +51,7 @@ func (basic *Basic) GetCallbackIP() ([]string, error) {
|
||||
return ipListRes.IPList, err
|
||||
}
|
||||
|
||||
// GetAPIDomainIP 获取微信API接口 IP地址
|
||||
// GetAPIDomainIP 获取微信 API 接口 IP 地址
|
||||
func (basic *Basic) GetAPIDomainIP() ([]string, error) {
|
||||
ak, err := basic.GetAccessToken()
|
||||
if err != nil {
|
||||
|
||||
@@ -34,7 +34,7 @@ type Request struct {
|
||||
} `json:"action_info"`
|
||||
}
|
||||
|
||||
// Ticket 二维码ticket
|
||||
// Ticket 二维码 ticket
|
||||
type Ticket struct {
|
||||
util.CommonError `json:",inline"`
|
||||
Ticket string `json:"ticket"`
|
||||
@@ -70,26 +70,34 @@ func (basic *Basic) GetQRTicket(tq *Request) (t *Ticket, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// ShowQRCode 通过ticket换取二维码
|
||||
// ShowQRCode 通过 ticket 换取二维码
|
||||
func ShowQRCode(tk *Ticket) string {
|
||||
return fmt.Sprintf(getQRImgURL, tk.Ticket)
|
||||
}
|
||||
|
||||
// NewTmpQrRequest 新建临时二维码请求实例
|
||||
func NewTmpQrRequest(exp time.Duration, scene interface{}) *Request {
|
||||
tq := &Request{
|
||||
ExpireSeconds: int64(exp.Seconds()),
|
||||
}
|
||||
var (
|
||||
tq = &Request{
|
||||
ExpireSeconds: int64(exp.Seconds()),
|
||||
}
|
||||
ok bool
|
||||
)
|
||||
switch reflect.ValueOf(scene).Kind() {
|
||||
case reflect.String:
|
||||
tq.ActionName = actionStr
|
||||
tq.ActionInfo.Scene.SceneStr = scene.(string)
|
||||
if tq.ActionInfo.Scene.SceneStr, ok = scene.(string); !ok {
|
||||
panic("scene must be string")
|
||||
}
|
||||
case reflect.Int, reflect.Int8, reflect.Int16,
|
||||
reflect.Int32, reflect.Int64,
|
||||
reflect.Uint, reflect.Uint8, reflect.Uint16,
|
||||
reflect.Uint32, reflect.Uint64:
|
||||
tq.ActionName = actionID
|
||||
tq.ActionInfo.Scene.SceneID = scene.(int)
|
||||
if tq.ActionInfo.Scene.SceneID, ok = scene.(int); !ok {
|
||||
panic("scene must be int")
|
||||
}
|
||||
default:
|
||||
}
|
||||
|
||||
return tq
|
||||
@@ -97,17 +105,25 @@ func NewTmpQrRequest(exp time.Duration, scene interface{}) *Request {
|
||||
|
||||
// NewLimitQrRequest 新建永久二维码请求实例
|
||||
func NewLimitQrRequest(scene interface{}) *Request {
|
||||
tq := &Request{}
|
||||
var (
|
||||
tq = &Request{}
|
||||
ok bool
|
||||
)
|
||||
switch reflect.ValueOf(scene).Kind() {
|
||||
case reflect.String:
|
||||
tq.ActionName = actionLimitStr
|
||||
tq.ActionInfo.Scene.SceneStr = scene.(string)
|
||||
if tq.ActionInfo.Scene.SceneStr, ok = scene.(string); !ok {
|
||||
panic("scene must be string")
|
||||
}
|
||||
case reflect.Int, reflect.Int8, reflect.Int16,
|
||||
reflect.Int32, reflect.Int64,
|
||||
reflect.Uint, reflect.Uint8, reflect.Uint16,
|
||||
reflect.Uint32, reflect.Uint64:
|
||||
tq.ActionName = actionLimitID
|
||||
tq.ActionInfo.Scene.SceneID = scene.(int)
|
||||
if tq.ActionInfo.Scene.SceneID, ok = scene.(int); !ok {
|
||||
panic("scene must be int")
|
||||
}
|
||||
default:
|
||||
}
|
||||
|
||||
return tq
|
||||
|
||||
@@ -69,9 +69,9 @@ type SpeedResult struct {
|
||||
|
||||
// sendRequest 发送请求的数据
|
||||
type sendRequest struct {
|
||||
// 根据tag获全部发送
|
||||
// 根据 tag 获全部发送
|
||||
Filter map[string]interface{} `json:"filter,omitempty"`
|
||||
// 根据OpenID发送
|
||||
// 根据 OpenID 发送
|
||||
ToUser interface{} `json:"touser,omitempty"`
|
||||
// 发送文本
|
||||
Text map[string]interface{} `json:"text,omitempty"`
|
||||
@@ -81,7 +81,7 @@ type sendRequest struct {
|
||||
Voice map[string]interface{} `json:"voice,omitempty"`
|
||||
// 发送视频
|
||||
Mpvideo map[string]interface{} `json:"mpvideo,omitempty"`
|
||||
// 发送图片-预览使用
|
||||
// 发送图片 - 预览使用
|
||||
Image map[string]interface{} `json:"image,omitempty"`
|
||||
// 发送图片
|
||||
Images *Image `json:"images,omitempty"`
|
||||
@@ -100,9 +100,9 @@ type Image struct {
|
||||
}
|
||||
|
||||
// SendText 群发文本
|
||||
// user 为nil,表示全员发送
|
||||
// &User{TagID:2} 根据tag发送
|
||||
// &User{OpenID:[]string("xxx","xxx")} 根据openid发送
|
||||
// user 为 nil,表示全员发送
|
||||
// &User{TagID:2} 根据 tag 发送
|
||||
// &User{OpenID:[]string("xxx","xxx")} 根据 openid 发送
|
||||
func (broadcast *Broadcast) SendText(user *User, content string) (*Result, error) {
|
||||
ak, err := broadcast.GetAccessToken()
|
||||
if err != nil {
|
||||
|
||||
@@ -46,10 +46,10 @@ type KeFuInfo struct {
|
||||
KfNick string `json:"kf_nick"` // 客服昵称
|
||||
KfID int `json:"kf_id"` // 客服编号
|
||||
KfHeadImgURL string `json:"kf_headimgurl"` // 客服头像
|
||||
KfWX string `json:"kf_wx"` // 如果客服帐号已绑定了客服人员微信号, 则此处显示微信号
|
||||
InviteWX string `json:"invite_wx"` // 如果客服帐号尚未绑定微信号,但是已经发起了一个绑定邀请, 则此处显示绑定邀请的微信号
|
||||
InviteExpTime int `json:"invite_expire_time"` // 如果客服帐号尚未绑定微信号,但是已经发起过一个绑定邀请, 邀请的过期时间,为unix 时间戳
|
||||
InviteStatus string `json:"invite_status"` // 邀请的状态,有等待确认“waiting”,被拒绝“rejected”, 过期“expired”
|
||||
KfWX string `json:"kf_wx"` // 如果客服帐号已绑定了客服人员微信号,则此处显示微信号
|
||||
InviteWX string `json:"invite_wx"` // 如果客服帐号尚未绑定微信号,但是已经发起了一个绑定邀请,则此处显示绑定邀请的微信号
|
||||
InviteExpTime int `json:"invite_expire_time"` // 如果客服帐号尚未绑定微信号,但是已经发起过一个绑定邀请,邀请的过期时间,为 unix 时间戳
|
||||
InviteStatus string `json:"invite_status"` // 邀请的状态,有等待确认“waiting”,被拒绝“rejected”,过期“expired”
|
||||
}
|
||||
|
||||
type resKeFuList struct {
|
||||
@@ -108,8 +108,8 @@ func (csm *Manager) OnlineList() (customerServiceOnlineList []*KeFuOnlineInfo, e
|
||||
|
||||
// Add 添加客服账号
|
||||
func (csm *Manager) Add(kfAccount, nickName string) (err error) {
|
||||
// kfAccount:完整客服帐号,格式为:帐号前缀@公众号微信号,帐号前缀最多10个字符,必须是英文、数字字符或者下划线,后缀为公众号微信号,长度不超过30个字符
|
||||
// nickName:客服昵称,最长16个字
|
||||
// kfAccount:完整客服帐号,格式为:帐号前缀@公众号微信号,帐号前缀最多 10 个字符,必须是英文、数字字符或者下划线,后缀为公众号微信号,长度不超过 30 个字符
|
||||
// nickName:客服昵称,最长 16 个字
|
||||
// 参数此处均不做校验
|
||||
var accessToken string
|
||||
accessToken, err = csm.GetAccessToken()
|
||||
|
||||
@@ -22,7 +22,7 @@ const (
|
||||
SlotIDBizSponsor AdSlot = "SLOT_ID_BIZ_SPONSOR"
|
||||
// SlotIDBizCps 公众号返佣商品
|
||||
SlotIDBizCps AdSlot = "SLOT_ID_BIZ_CPS"
|
||||
// SlotIDWeappBanner 小程序banner
|
||||
// SlotIDWeappBanner 小程序 banner
|
||||
SlotIDWeappBanner AdSlot = "SLOT_ID_WEAPP_BANNER"
|
||||
// SlotIDWeappRewardVideo 小程序激励视频
|
||||
SlotIDWeappRewardVideo AdSlot = "SLOT_ID_WEAPP_REWARD_VIDEO"
|
||||
|
||||
@@ -16,11 +16,11 @@ const (
|
||||
)
|
||||
|
||||
type reqDeviceAuthorize struct {
|
||||
// 设备id的个数
|
||||
// 设备 id 的个数
|
||||
DeviceNum string `json:"device_num"`
|
||||
// 设备id的列表,json的array格式,其size必须等于device_num
|
||||
// 设备 id 的列表,json 的 array 格式,其 size 必须等于 device_num
|
||||
DeviceList []ReqDevice `json:"device_list"`
|
||||
// 请求操作的类型,限定取值为:0:设备授权(缺省值为0) 1:设备更新(更新已授权设备的各属性值)
|
||||
// 请求操作的类型,限定取值为:0:设备授权(缺省值为 0)1:设备更新(更新已授权设备的各属性值)
|
||||
OpType string `json:"op_type,omitempty"`
|
||||
// 设备的产品编号(由微信硬件平台分配)。可在公众号设备功能管理页面查询。
|
||||
// 当 op_type 为‘0’,product_id 为‘1’时,不要填写 product_id 字段(会引起不必要错误);
|
||||
@@ -33,39 +33,39 @@ type reqDeviceAuthorize struct {
|
||||
type ReqDevice struct {
|
||||
// 设备的 device id
|
||||
ID string `json:"id"`
|
||||
// 设备的mac地址 格式采用16进制串的方式(长度为12字节),
|
||||
// 不需要0X前缀,如: 1234567890AB
|
||||
// 设备的 mac 地址 格式采用 16 进制串的方式(长度为 12 字节),
|
||||
// 不需要 0X 前缀,如:1234567890AB
|
||||
Mac string `json:"mac"`
|
||||
// 支持以下四种连接协议:
|
||||
// android classic bluetooth – 1
|
||||
// ios classic bluetooth – 2
|
||||
// ble – 3
|
||||
// wifi -- 4
|
||||
// 一个设备可以支持多种连接类型,用符号"|"做分割,客户端优先选择靠前的连接方式(优先级按|关系的排序依次降低),举例:
|
||||
// 1:表示设备仅支持andiod classic bluetooth 1|2:表示设备支持android 和ios 两种classic bluetooth,但是客户端优先选择android classic bluetooth 协议,如果android classic bluetooth协议连接失败,再选择ios classic bluetooth协议进行连接
|
||||
// (注:安卓平台不同时支持BLE和classic类型)
|
||||
// 一个设备可以支持多种连接类型,用符号"|"做分割,客户端优先选择靠前的连接方式(优先级按 | 关系的排序依次降低),举例:
|
||||
// 1:表示设备仅支持 andiod classic bluetooth 1|2:表示设备支持 android 和 ios 两种 classic bluetooth,但是客户端优先选择 android classic bluetooth 协议,如果 android classic bluetooth 协议连接失败,再选择 ios classic bluetooth 协议进行连接
|
||||
// (注:安卓平台不同时支持 BLE 和 classic 类型)
|
||||
ConnectProtocol string `json:"connect_protocol"`
|
||||
// auth及通信的加密key,第三方需要将key烧制在设备上(128bit),格式采用16进制串的方式(长度为32字节),不需要0X前缀,如: 1234567890ABCDEF1234567890ABCDEF
|
||||
// auth 及通信的加密 key,第三方需要将 key 烧制在设备上(128bit),格式采用 16 进制串的方式(长度为 32 字节),不需要 0X 前缀,如:1234567890ABCDEF1234567890ABCDEF
|
||||
AuthKey string `json:"auth_key"`
|
||||
// 断开策略,目前支持: 1:退出公众号页面时即断开连接 2:退出公众号之后保持连接不断开
|
||||
// 断开策略,目前支持:1:退出公众号页面时即断开连接 2:退出公众号之后保持连接不断开
|
||||
CloseStrategy string `json:"close_strategy"`
|
||||
// 连接策略,32位整型,按bit位置位,目前仅第1bit和第3bit位有效(bit置0为无效,1为有效;第2bit已被废弃),且bit位可以按或置位(如1|4=5),各bit置位含义说明如下:
|
||||
// 1:(第1bit置位)在公众号对话页面,不停的尝试连接设备
|
||||
// 4:(第3bit置位)处于非公众号页面(如主界面等),微信自动连接。当用户切换微信到前台时,可能尝试去连接设备,连上后一定时间会断开
|
||||
// 连接策略,32 位整型,按 bit 位置位,目前仅第 1bit 和第 3bit 位有效(bit 置 0 为无效,1 为有效;第 2bit 已被废弃),且 bit 位可以按或置位(如 1|4=5),各 bit 置位含义说明如下:
|
||||
// 1:(第 1bit 置位)在公众号对话页面,不停的尝试连接设备
|
||||
// 4:(第 3bit 置位)处于非公众号页面(如主界面等),微信自动连接。当用户切换微信到前台时,可能尝试去连接设备,连上后一定时间会断开
|
||||
ConnStrategy string `json:"conn_strategy"`
|
||||
// auth version,设备和微信进行auth时,会根据该版本号来确认auth buf和auth key的格式(各version对应的auth buf及key的具体格式可以参看“客户端蓝牙外设协议”),该字段目前支持取值:
|
||||
// 0:不加密的version
|
||||
// auth version,设备和微信进行 auth 时,会根据该版本号来确认 auth buf 和 auth key 的格式(各 version 对应的 auth buf 及 key 的具体格式可以参看“客户端蓝牙外设协议”),该字段目前支持取值:
|
||||
// 0:不加密的 version
|
||||
// 1:version 1
|
||||
AuthVer string `json:"auth_ver"`
|
||||
// 表示mac地址在厂商广播manufacture data里含有mac地址的偏移,取值如下:
|
||||
// 表示 mac 地址在厂商广播 manufacture data 里含有 mac 地址的偏移,取值如下:
|
||||
// -1:在尾部、
|
||||
// -2:表示不包含mac地址 其他:非法偏移
|
||||
// -2:表示不包含 mac 地址 其他:非法偏移
|
||||
ManuMacPos string `json:"manu_mac_pos"`
|
||||
// 表示mac地址在厂商serial number里含有mac地址的偏移,取值如下:
|
||||
// 表示 mac 地址在厂商 serial number 里含有 mac 地址的偏移,取值如下:
|
||||
// -1:表示在尾部
|
||||
// -2:表示不包含mac地址 其他:非法偏移
|
||||
// -2:表示不包含 mac 地址 其他:非法偏移
|
||||
SerMacPost string `json:"ser_mac_post"`
|
||||
// 精简协议类型,取值如下:计步设备精简协议:1 (若该字段填1,connect_protocol 必须包括3。非精简协议设备切勿填写该字段)
|
||||
// 精简协议类型,取值如下:计步设备精简协议:1(若该字段填 1,connect_protocol 必须包括 3。非精简协议设备切勿填写该字段)
|
||||
BleSimpleProtocol string `json:"ble_simple_protocol,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
@@ -33,12 +33,12 @@ type Article struct {
|
||||
Title string `json:"title"` // 标题
|
||||
Author string `json:"author"` // 作者
|
||||
Digest string `json:"digest"` // 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。
|
||||
Content string `json:"content"` // 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且去除JS
|
||||
ContentSourceURL string `json:"content_source_url"` // 图文消息的原文地址,即点击“阅读原文”后的URL
|
||||
ThumbMediaID string `json:"thumb_media_id"` // 图文消息的封面图片素材id(必须是永久MediaID)
|
||||
ShowCoverPic uint `json:"show_cover_pic"` // 是否显示封面,0为false,即不显示,1为true,即显示(默认)
|
||||
NeedOpenComment uint `json:"need_open_comment"` // 是否打开评论,0不打开(默认),1打开
|
||||
OnlyFansCanComment uint `json:"only_fans_can_comment"` // 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
|
||||
Content string `json:"content"` // 图文消息的具体内容,支持 HTML 标签,必须少于 2 万字符,小于 1M,且去除 JS
|
||||
ContentSourceURL string `json:"content_source_url"` // 图文消息的原文地址,即点击“阅读原文”后的 URL
|
||||
ThumbMediaID string `json:"thumb_media_id"` // 图文消息的封面图片素材 id(必须是永久 MediaID)
|
||||
ShowCoverPic uint `json:"show_cover_pic"` // 是否显示封面,0 为 false,即不显示,1 为 true,即显示 (默认)
|
||||
NeedOpenComment uint `json:"need_open_comment"` // 是否打开评论,0 不打开 (默认),1 打开
|
||||
OnlyFansCanComment uint `json:"only_fans_can_comment"` // 是否粉丝才可评论,0 所有人可评论 (默认),1 粉丝才可评论
|
||||
}
|
||||
|
||||
// AddDraft 新建草稿
|
||||
@@ -117,7 +117,7 @@ func (draft *Draft) DeleteDraft(mediaID string) (err error) {
|
||||
}
|
||||
|
||||
// UpdateDraft 修改草稿
|
||||
// index 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
|
||||
// index 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为 0
|
||||
func (draft *Draft) UpdateDraft(article *Article, mediaID string, index uint) (err error) {
|
||||
accessToken, err := draft.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -176,7 +176,7 @@ type ArticleList struct {
|
||||
|
||||
// ArticleListItem 用于 ArticleList 的 item 节点
|
||||
type ArticleListItem struct {
|
||||
MediaID string `json:"media_id"` // 图文消息的id
|
||||
MediaID string `json:"media_id"` // 图文消息的 id
|
||||
Content ArticleListContent `json:"content"` // 内容
|
||||
UpdateTime int64 `json:"update_time"` // 这篇图文消息素材的最后更新时间
|
||||
}
|
||||
|
||||
@@ -79,23 +79,23 @@ func (freePublish *FreePublish) Publish(mediaID string) (publishID int64, err er
|
||||
// PublishStatusList 发布任务状态列表
|
||||
type PublishStatusList struct {
|
||||
util.CommonError
|
||||
PublishID int64 `json:"publish_id"` // 发布任务id
|
||||
PublishID int64 `json:"publish_id"` // 发布任务 id
|
||||
PublishStatus PublishStatus `json:"publish_status"` // 发布状态
|
||||
ArticleID string `json:"article_id"` // 当发布状态为0时(即成功)时,返回图文的 article_id,可用于“客服消息”场景
|
||||
ArticleID string `json:"article_id"` // 当发布状态为 0 时(即成功)时,返回图文的 article_id,可用于“客服消息”场景
|
||||
ArticleDetail PublishArticleDetail `json:"article_detail"` // 发布任务文章成功状态详情
|
||||
FailIndex []uint `json:"fail_idx"` // 当发布状态为2或4时,返回不通过的文章编号,第一篇为 1;其他发布状态则为空
|
||||
FailIndex []uint `json:"fail_idx"` // 当发布状态为 2 或 4 时,返回不通过的文章编号,第一篇为 1;其他发布状态则为空
|
||||
}
|
||||
|
||||
// PublishArticleDetail 发布任务成功详情
|
||||
type PublishArticleDetail struct {
|
||||
Count uint `json:"count"` // 当发布状态为0时(即成功)时,返回文章数量
|
||||
Count uint `json:"count"` // 当发布状态为 0 时(即成功)时,返回文章数量
|
||||
Items []PublishArticleItem `json:"item"`
|
||||
}
|
||||
|
||||
// PublishArticleItem 发布任务成功的文章内容
|
||||
type PublishArticleItem struct {
|
||||
Index uint `json:"idx"` // 当发布状态为0时(即成功)时,返回文章对应的编号
|
||||
ArticleURL string `json:"article_url"` // 当发布状态为0时(即成功)时,返回图文的永久链接
|
||||
Index uint `json:"idx"` // 当发布状态为 0 时(即成功)时,返回文章对应的编号
|
||||
ArticleURL string `json:"article_url"` // 当发布状态为 0 时(即成功)时,返回图文的永久链接
|
||||
}
|
||||
|
||||
// SelectStatus 发布状态轮询接口
|
||||
@@ -122,8 +122,8 @@ func (freePublish *FreePublish) SelectStatus(publishID int64) (list PublishStatu
|
||||
}
|
||||
|
||||
// Delete 删除发布。
|
||||
// index 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章
|
||||
// !!!此操作不可逆,请谨慎操作!!!删除后微信公众号后台仍然会有记录!!!
|
||||
// index 要删除的文章在图文消息中的位置,第一篇编号为 1,该字段不填或填 0 会删除全部文章
|
||||
// !!! 此操作不可逆,请谨慎操作!!! 删除后微信公众号后台仍然会有记录!!!
|
||||
func (freePublish *FreePublish) Delete(articleID string, index uint) (err error) {
|
||||
accessToken, err := freePublish.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -152,13 +152,13 @@ type Article struct {
|
||||
Title string `json:"title"` // 标题
|
||||
Author string `json:"author"` // 作者
|
||||
Digest string `json:"digest"` // 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
|
||||
Content string `json:"content"` // 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
|
||||
ContentSourceURL string `json:"content_source_url"` // 图文消息的原文地址,即点击“阅读原文”后的URL
|
||||
ThumbMediaID string `json:"thumb_media_id"` // 图文消息的封面图片素材id(一定是永久MediaID)
|
||||
ShowCoverPic uint `json:"show_cover_pic"` // 是否显示封面,0为false,即不显示,1为true,即显示(默认)
|
||||
NeedOpenComment uint `json:"need_open_comment"` // 是否打开评论,0不打开(默认),1打开
|
||||
OnlyFansCanComment uint `json:"only_fans_can_comment"` // 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
|
||||
URL string `json:"url"` // 图文消息的URL
|
||||
Content string `json:"content"` // 图文消息的具体内容,支持 HTML 标签,必须少于 2 万字符,小于 1M,且此处会去除 JS
|
||||
ContentSourceURL string `json:"content_source_url"` // 图文消息的原文地址,即点击“阅读原文”后的 URL
|
||||
ThumbMediaID string `json:"thumb_media_id"` // 图文消息的封面图片素材 id(一定是永久 MediaID)
|
||||
ShowCoverPic uint `json:"show_cover_pic"` // 是否显示封面,0 为 false,即不显示,1 为 true,即显示 (默认)
|
||||
NeedOpenComment uint `json:"need_open_comment"` // 是否打开评论,0 不打开 (默认),1 打开
|
||||
OnlyFansCanComment uint `json:"only_fans_can_comment"` // 是否粉丝才可评论,0 所有人可评论 (默认),1 粉丝才可评论
|
||||
URL string `json:"url"` // 图文消息的 URL
|
||||
IsDeleted bool `json:"is_deleted"` // 该图文是否被删除
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ type ArticleList struct {
|
||||
|
||||
// ArticleListItem 用于 ArticleList 的 item 节点
|
||||
type ArticleListItem struct {
|
||||
ArticleID string `json:"article_id"` // 成功发布的图文消息id
|
||||
ArticleID string `json:"article_id"` // 成功发布的图文消息 id
|
||||
Content ArticleListContent `json:"content"` // 内容
|
||||
UpdateTime int64 `json:"update_time"` // 这篇图文消息素材的最后更新时间
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ type Js struct {
|
||||
credential.JsTicketHandle
|
||||
}
|
||||
|
||||
// Config 返回给用户jssdk配置信息
|
||||
// Config 返回给用户 jssdk 配置信息
|
||||
type Config struct {
|
||||
AppID string `json:"app_id"`
|
||||
Timestamp int64 `json:"timestamp"`
|
||||
@@ -31,12 +31,12 @@ func NewJs(context *context.Context) *Js {
|
||||
return js
|
||||
}
|
||||
|
||||
// SetJsTicketHandle 自定义js ticket取值方式
|
||||
// SetJsTicketHandle 自定义 js ticket 取值方式
|
||||
func (js *Js) SetJsTicketHandle(ticketHandle credential.JsTicketHandle) {
|
||||
js.JsTicketHandle = ticketHandle
|
||||
}
|
||||
|
||||
// GetConfig 获取jssdk需要的配置参数
|
||||
// GetConfig 获取 jssdk 需要的配置参数
|
||||
// uri 为当前网页地址
|
||||
func (js *Js) GetConfig(uri string) (config *Config, err error) {
|
||||
config = new(Config)
|
||||
|
||||
@@ -11,13 +11,13 @@ import (
|
||||
type MediaType string
|
||||
|
||||
const (
|
||||
// MediaTypeImage 媒体文件:图片
|
||||
// MediaTypeImage 媒体文件:图片
|
||||
MediaTypeImage MediaType = "image"
|
||||
// MediaTypeVoice 媒体文件:声音
|
||||
// MediaTypeVoice 媒体文件:声音
|
||||
MediaTypeVoice MediaType = "voice"
|
||||
// MediaTypeVideo 媒体文件:视频
|
||||
// MediaTypeVideo 媒体文件:视频
|
||||
MediaTypeVideo MediaType = "video"
|
||||
// MediaTypeThumb 媒体文件:缩略图
|
||||
// MediaTypeThumb 媒体文件:缩略图
|
||||
MediaTypeThumb MediaType = "thumb"
|
||||
)
|
||||
|
||||
@@ -63,7 +63,7 @@ func (material *Material) MediaUpload(mediaType MediaType, filename string) (med
|
||||
}
|
||||
|
||||
// GetMediaURL 返回临时素材的下载地址供用户自己处理
|
||||
// NOTICE: URL 不可公开,因为含access_token 需要立即另存文件
|
||||
// NOTICE: URL 不可公开,因为含 access_token 需要立即另存文件
|
||||
func (material *Material) GetMediaURL(mediaID string) (mediaURL string, err error) {
|
||||
var accessToken string
|
||||
accessToken, err = material.GetAccessToken()
|
||||
|
||||
@@ -23,7 +23,7 @@ func (btn *Button) SetSubButton(name string, subButtons []*Button) *Button {
|
||||
return btn
|
||||
}
|
||||
|
||||
// SetClickButton btn 为click类型
|
||||
// SetClickButton btn 为 click 类型
|
||||
func (btn *Button) SetClickButton(name, key string) *Button {
|
||||
btn.Type = "click"
|
||||
btn.Name = name
|
||||
@@ -34,7 +34,7 @@ func (btn *Button) SetClickButton(name, key string) *Button {
|
||||
return btn
|
||||
}
|
||||
|
||||
// SetViewButton view类型
|
||||
// SetViewButton view 类型
|
||||
func (btn *Button) SetViewButton(name, url string) *Button {
|
||||
btn.Type = "view"
|
||||
btn.Name = name
|
||||
@@ -116,7 +116,7 @@ func (btn *Button) SetLocationSelectButton(name, key string) *Button {
|
||||
return btn
|
||||
}
|
||||
|
||||
// SetMediaIDButton 设置 下发消息(除文本消息) 类型按钮
|
||||
// SetMediaIDButton 设置 下发消息 (除文本消息) 类型按钮
|
||||
func (btn *Button) SetMediaIDButton(name, mediaID string) *Button {
|
||||
btn.Type = "media_id"
|
||||
btn.Name = name
|
||||
@@ -128,7 +128,7 @@ func (btn *Button) SetMediaIDButton(name, mediaID string) *Button {
|
||||
return btn
|
||||
}
|
||||
|
||||
// SetViewLimitedButton 设置 跳转图文消息URL 类型按钮
|
||||
// SetViewLimitedButton 设置 跳转图文消息 URL 类型按钮
|
||||
func (btn *Button) SetViewLimitedButton(name, mediaID string) *Button {
|
||||
btn.Type = "view_limited"
|
||||
btn.Name = name
|
||||
@@ -159,12 +159,12 @@ func NewSubButton(name string, subButtons []*Button) *Button {
|
||||
return (&Button{}).SetSubButton(name, subButtons)
|
||||
}
|
||||
|
||||
// NewClickButton btn 为click类型
|
||||
// NewClickButton btn 为 click 类型
|
||||
func NewClickButton(name, key string) *Button {
|
||||
return (&Button{}).SetClickButton(name, key)
|
||||
}
|
||||
|
||||
// NewViewButton view类型
|
||||
// NewViewButton view 类型
|
||||
func NewViewButton(name, url string) *Button {
|
||||
return (&Button{}).SetViewButton(name, url)
|
||||
}
|
||||
@@ -199,12 +199,12 @@ func NewLocationSelectButton(name, key string) *Button {
|
||||
return (&Button{}).SetLocationSelectButton(name, key)
|
||||
}
|
||||
|
||||
// NewMediaIDButton 下发消息(除文本消息) 类型按钮
|
||||
// NewMediaIDButton 下发消息 (除文本消息) 类型按钮
|
||||
func NewMediaIDButton(name, mediaID string) *Button {
|
||||
return (&Button{}).SetMediaIDButton(name, mediaID)
|
||||
}
|
||||
|
||||
// NewViewLimitedButton 跳转图文消息URL 类型按钮
|
||||
// NewViewLimitedButton 跳转图文消息 URL 类型按钮
|
||||
func NewViewLimitedButton(name, mediaID string) *Button {
|
||||
return (&Button{}).SetViewLimitedButton(name, mediaID)
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ func NewMessageManager(context *context.Context) *Manager {
|
||||
|
||||
// CustomerMessage 客服消息
|
||||
type CustomerMessage struct {
|
||||
ToUser string `json:"touser"` // 接受者OpenID
|
||||
ToUser string `json:"touser"` // 接受者 OpenID
|
||||
Msgtype MsgType `json:"msgtype"` // 客服消息类型
|
||||
Text *MediaText `json:"text,omitempty"` // 可选
|
||||
Image *MediaResource `json:"image,omitempty"` // 可选
|
||||
@@ -93,12 +93,12 @@ type MediaText struct {
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
// MediaResource 消息使用的永久素材id
|
||||
// MediaResource 消息使用的永久素材 id
|
||||
type MediaResource struct {
|
||||
MediaID string `json:"media_id"`
|
||||
}
|
||||
|
||||
// MediaArticle 消息使用的已发布文章id
|
||||
// MediaArticle 消息使用的已发布文章 id
|
||||
type MediaArticle struct {
|
||||
ArticleID string `json:"article_id"`
|
||||
}
|
||||
@@ -146,7 +146,7 @@ type MsgmenuItem struct {
|
||||
Content string `json:"content"`
|
||||
}
|
||||
|
||||
// MediaWxcard 卡券的id
|
||||
// MediaWxcard 卡券的 id
|
||||
type MediaWxcard struct {
|
||||
CardID string `json:"card_id"`
|
||||
}
|
||||
|
||||
@@ -31,14 +31,14 @@ func NewSubscribe(context *context.Context) *Subscribe {
|
||||
|
||||
// SubscribeMessage 发送的订阅消息内容
|
||||
type SubscribeMessage struct {
|
||||
ToUser string `json:"touser"` // 必须, 接受者OpenID
|
||||
TemplateID string `json:"template_id"` // 必须, 模版ID
|
||||
Page string `json:"page,omitempty"` // 可选, 跳转网页时填写
|
||||
Data map[string]*SubscribeDataItem `json:"data"` // 必须, 模板数据
|
||||
ToUser string `json:"touser"` // 必须,接受者 OpenID
|
||||
TemplateID string `json:"template_id"` // 必须,模版 ID
|
||||
Page string `json:"page,omitempty"` // 可选,跳转网页时填写
|
||||
Data map[string]*SubscribeDataItem `json:"data"` // 必须,模板数据
|
||||
MiniProgram struct {
|
||||
AppID string `json:"appid"` // 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系)
|
||||
PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
|
||||
} `json:"miniprogram"` // 可选,跳转至小程序地址
|
||||
AppID string `json:"appid"` // 所需跳转到的小程序 appid(该小程序 appid 必须与发模板消息的公众号是绑定关联关系)
|
||||
PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,(示例 index?foo=bar)
|
||||
} `json:"miniprogram"` // 可选,跳转至小程序地址
|
||||
}
|
||||
|
||||
// SubscribeDataItem 模版内某个 .DATA 的值
|
||||
@@ -143,7 +143,7 @@ func (tpl *Subscribe) Delete(templateID string) (err error) {
|
||||
|
||||
// PublicTemplateCategory 公众号类目
|
||||
type PublicTemplateCategory struct {
|
||||
ID int `json:"id"` // 类目ID
|
||||
ID int `json:"id"` // 类目 ID
|
||||
Name string `json:"name"` // 类目的中文名
|
||||
}
|
||||
|
||||
|
||||
@@ -29,17 +29,17 @@ func NewTemplate(context *context.Context) *Template {
|
||||
|
||||
// TemplateMessage 发送的模板消息内容
|
||||
type TemplateMessage struct {
|
||||
ToUser string `json:"touser"` // 必须, 接受者OpenID
|
||||
TemplateID string `json:"template_id"` // 必须, 模版ID
|
||||
URL string `json:"url,omitempty"` // 可选, 用户点击后跳转的URL, 该URL必须处于开发者在公众平台网站中设置的域中
|
||||
Color string `json:"color,omitempty"` // 可选, 整个消息的颜色, 可以不设置
|
||||
Data map[string]*TemplateDataItem `json:"data"` // 必须, 模板数据
|
||||
ClientMsgID string `json:"client_msg_id,omitempty"` // 可选, 防重入ID
|
||||
ToUser string `json:"touser"` // 必须,接受者 OpenID
|
||||
TemplateID string `json:"template_id"` // 必须,模版 ID
|
||||
URL string `json:"url,omitempty"` // 可选,用户点击后跳转的 URL, 该 URL 必须处于开发者在公众平台网站中设置的域中
|
||||
Color string `json:"color,omitempty"` // 可选,整个消息的颜色,可以不设置
|
||||
Data map[string]*TemplateDataItem `json:"data"` // 必须,模板数据
|
||||
ClientMsgID string `json:"client_msg_id,omitempty"` // 可选,防重入 ID
|
||||
|
||||
MiniProgram struct {
|
||||
AppID string `json:"appid"` // 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系)
|
||||
PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
|
||||
} `json:"miniprogram"` // 可选,跳转至小程序地址
|
||||
AppID string `json:"appid"` // 所需跳转到的小程序 appid(该小程序 appid 必须与发模板消息的公众号是绑定关联关系)
|
||||
PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,(示例 index?foo=bar)
|
||||
} `json:"miniprogram"` // 可选,跳转至小程序地址
|
||||
}
|
||||
|
||||
// TemplateDataItem 模版内某个 .DATA 的值
|
||||
@@ -80,7 +80,7 @@ func (tpl *Template) Send(msg *TemplateMessage) (msgID int64, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// TemplateItem 模板消息.
|
||||
// TemplateItem 模板消息。
|
||||
type TemplateItem struct {
|
||||
TemplateID string `json:"template_id"`
|
||||
Title string `json:"title"`
|
||||
@@ -121,7 +121,7 @@ type resTemplateAdd struct {
|
||||
TemplateID string `json:"template_id"`
|
||||
}
|
||||
|
||||
// Add 添加模板.
|
||||
// Add 添加模板。
|
||||
func (tpl *Template) Add(shortID string, keyNameList []string) (templateID string, err error) {
|
||||
var accessToken string
|
||||
accessToken, err = tpl.GetAccessToken()
|
||||
@@ -144,7 +144,7 @@ func (tpl *Template) Add(shortID string, keyNameList []string) (templateID strin
|
||||
return result.TemplateID, err
|
||||
}
|
||||
|
||||
// Delete 删除私有模板.
|
||||
// Delete 删除私有模板。
|
||||
func (tpl *Template) Delete(templateID string) (err error) {
|
||||
var accessToken string
|
||||
accessToken, err = tpl.GetAccessToken()
|
||||
|
||||
@@ -32,14 +32,14 @@ func NewOauth(context *context.Context) *Oauth {
|
||||
return auth
|
||||
}
|
||||
|
||||
// GetRedirectURL 获取跳转的url地址
|
||||
// GetRedirectURL 获取跳转的 url 地址
|
||||
func (oauth *Oauth) GetRedirectURL(redirectURI, scope, state string) (string, error) {
|
||||
// url encode
|
||||
urlStr := url.QueryEscape(redirectURI)
|
||||
return fmt.Sprintf(redirectOauthURL, oauth.AppID, urlStr, scope, state), nil
|
||||
}
|
||||
|
||||
// GetWebAppRedirectURL 获取网页应用跳转的url地址
|
||||
// GetWebAppRedirectURL 获取网页应用跳转的 url 地址
|
||||
func (oauth *Oauth) GetWebAppRedirectURL(redirectURI, scope, state string) (string, error) {
|
||||
urlStr := url.QueryEscape(redirectURI)
|
||||
return fmt.Sprintf(webAppRedirectOauthURL, oauth.AppID, urlStr, scope, state), nil
|
||||
@@ -55,7 +55,7 @@ func (oauth *Oauth) Redirect(writer http.ResponseWriter, req *http.Request, redi
|
||||
return nil
|
||||
}
|
||||
|
||||
// ResAccessToken 获取用户授权access_token的返回结果
|
||||
// ResAccessToken 获取用户授权 access_token 的返回结果
|
||||
type ResAccessToken struct {
|
||||
util.CommonError
|
||||
|
||||
@@ -65,7 +65,7 @@ type ResAccessToken struct {
|
||||
OpenID string `json:"openid"`
|
||||
Scope string `json:"scope"`
|
||||
|
||||
// IsSnapShotUser 是否为快照页模式虚拟账号,只有当用户是快照页模式虚拟账号时返回,值为1
|
||||
// IsSnapShotUser 是否为快照页模式虚拟账号,只有当用户是快照页模式虚拟账号时返回,值为 1
|
||||
// 公众号文档 https://developers.weixin.qq.com/community/minihome/doc/000c2c34068880629ced91a2f56001
|
||||
IsSnapShotUser int `json:"is_snapshotuser"`
|
||||
|
||||
@@ -74,7 +74,7 @@ type ResAccessToken struct {
|
||||
UnionID string `json:"unionid"`
|
||||
}
|
||||
|
||||
// GetUserInfoByCodeContext 通过网页授权的code 换取用户的信息
|
||||
// GetUserInfoByCodeContext 通过网页授权的 code 换取用户的信息
|
||||
func (oauth *Oauth) GetUserInfoByCodeContext(ctx ctx2.Context, code string) (result UserInfo, err error) {
|
||||
var (
|
||||
token ResAccessToken
|
||||
@@ -86,12 +86,12 @@ func (oauth *Oauth) GetUserInfoByCodeContext(ctx ctx2.Context, code string) (res
|
||||
return oauth.GetUserInfoContext(ctx, token.AccessToken, token.OpenID, "")
|
||||
}
|
||||
|
||||
// GetUserAccessToken 通过网页授权的code 换取access_token(区别于context中的access_token)
|
||||
// GetUserAccessToken 通过网页授权的 code 换取 access_token(区别于 context 中的 access_token)
|
||||
func (oauth *Oauth) GetUserAccessToken(code string) (result ResAccessToken, err error) {
|
||||
return oauth.GetUserAccessTokenContext(ctx2.Background(), code)
|
||||
}
|
||||
|
||||
// GetUserAccessTokenContext 通过网页授权的code 换取access_token(区别于context中的access_token) with context
|
||||
// GetUserAccessTokenContext 通过网页授权的 code 换取 access_token(区别于 context 中的 access_token) with context
|
||||
func (oauth *Oauth) GetUserAccessTokenContext(ctx ctx2.Context, code string) (result ResAccessToken, err error) {
|
||||
urlStr := fmt.Sprintf(accessTokenURL, oauth.AppID, oauth.AppSecret, code)
|
||||
var response []byte
|
||||
@@ -110,12 +110,12 @@ func (oauth *Oauth) GetUserAccessTokenContext(ctx ctx2.Context, code string) (re
|
||||
return
|
||||
}
|
||||
|
||||
// RefreshAccessToken 刷新access_token
|
||||
// RefreshAccessToken 刷新 access_token
|
||||
func (oauth *Oauth) RefreshAccessToken(refreshToken string) (result ResAccessToken, err error) {
|
||||
return oauth.RefreshAccessTokenContext(ctx2.Background(), refreshToken)
|
||||
}
|
||||
|
||||
// RefreshAccessTokenContext 刷新access_token with context
|
||||
// RefreshAccessTokenContext 刷新 access_token with context
|
||||
func (oauth *Oauth) RefreshAccessTokenContext(ctx ctx2.Context, refreshToken string) (result ResAccessToken, err error) {
|
||||
urlStr := fmt.Sprintf(refreshAccessTokenURL, oauth.AppID, refreshToken)
|
||||
var response []byte
|
||||
@@ -134,12 +134,12 @@ func (oauth *Oauth) RefreshAccessTokenContext(ctx ctx2.Context, refreshToken str
|
||||
return
|
||||
}
|
||||
|
||||
// CheckAccessToken 检验access_token是否有效
|
||||
// CheckAccessToken 检验 access_token 是否有效
|
||||
func (oauth *Oauth) CheckAccessToken(accessToken, openID string) (b bool, err error) {
|
||||
return oauth.CheckAccessTokenContext(ctx2.Background(), accessToken, openID)
|
||||
}
|
||||
|
||||
// CheckAccessTokenContext 检验access_token是否有效 with context
|
||||
// CheckAccessTokenContext 检验 access_token 是否有效 with context
|
||||
func (oauth *Oauth) CheckAccessTokenContext(ctx ctx2.Context, accessToken, openID string) (b bool, err error) {
|
||||
urlStr := fmt.Sprintf(checkAccessTokenURL, accessToken, openID)
|
||||
var response []byte
|
||||
@@ -175,12 +175,12 @@ type UserInfo struct {
|
||||
Unionid string `json:"unionid"`
|
||||
}
|
||||
|
||||
// GetUserInfo 如果scope为 snsapi_userinfo 则可以通过此方法获取到用户基本信息
|
||||
// GetUserInfo 如果 scope 为 snsapi_userinfo 则可以通过此方法获取到用户基本信息
|
||||
func (oauth *Oauth) GetUserInfo(accessToken, openID, lang string) (result UserInfo, err error) {
|
||||
return oauth.GetUserInfoContext(ctx2.Background(), accessToken, openID, lang)
|
||||
}
|
||||
|
||||
// GetUserInfoContext 如果scope为 snsapi_userinfo 则可以通过此方法获取到用户基本信息 with context
|
||||
// GetUserInfoContext 如果 scope 为 snsapi_userinfo 则可以通过此方法获取到用户基本信息 with context
|
||||
func (oauth *Oauth) GetUserInfoContext(ctx ctx2.Context, accessToken, openID, lang string) (result UserInfo, err error) {
|
||||
if lang == "" {
|
||||
lang = "zh_CN"
|
||||
|
||||
@@ -153,7 +153,7 @@ func NewOCR(c *context.Context) *OCR {
|
||||
return ocr
|
||||
}
|
||||
|
||||
// IDCard 身份证OCR识别接口
|
||||
// IDCard 身份证 OCR 识别接口
|
||||
func (ocr *OCR) IDCard(path string) (resIDCard ResIDCard, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -170,7 +170,7 @@ func (ocr *OCR) IDCard(path string) (resIDCard ResIDCard, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// BankCard 银行卡OCR识别接口
|
||||
// BankCard 银行卡 OCR 识别接口
|
||||
func (ocr *OCR) BankCard(path string) (resBankCard ResBankCard, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -187,7 +187,7 @@ func (ocr *OCR) BankCard(path string) (resBankCard ResBankCard, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// Driving 行驶证OCR识别接口
|
||||
// Driving 行驶证 OCR 识别接口
|
||||
func (ocr *OCR) Driving(path string) (resDriving ResDriving, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -204,7 +204,7 @@ func (ocr *OCR) Driving(path string) (resDriving ResDriving, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// DrivingLicense 驾驶证OCR识别接口
|
||||
// DrivingLicense 驾驶证 OCR 识别接口
|
||||
func (ocr *OCR) DrivingLicense(path string) (resDrivingLicense ResDrivingLicense, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -221,7 +221,7 @@ func (ocr *OCR) DrivingLicense(path string) (resDrivingLicense ResDrivingLicense
|
||||
return
|
||||
}
|
||||
|
||||
// BizLicense 营业执照OCR识别接口
|
||||
// BizLicense 营业执照 OCR 识别接口
|
||||
func (ocr *OCR) BizLicense(path string) (resBizLicense ResBizLicense, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -238,7 +238,7 @@ func (ocr *OCR) BizLicense(path string) (resBizLicense ResBizLicense, err error)
|
||||
return
|
||||
}
|
||||
|
||||
// Common 通用印刷体OCR识别接口
|
||||
// Common 通用印刷体 OCR 识别接口
|
||||
func (ocr *OCR) Common(path string) (resCommon ResCommon, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
@@ -255,7 +255,7 @@ func (ocr *OCR) Common(path string) (resCommon ResCommon, err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// PlateNumber 车牌OCR识别接口
|
||||
// PlateNumber 车牌 OCR 识别接口
|
||||
func (ocr *OCR) PlateNumber(path string) (resPlateNumber ResPlateNumber, err error) {
|
||||
accessToken, err := ocr.GetAccessToken()
|
||||
if err != nil {
|
||||
|
||||
@@ -19,11 +19,11 @@ const (
|
||||
)
|
||||
|
||||
// GetBlackList 获取公众号的黑名单列表
|
||||
// 该接口每次调用最多可拉取 1000 个OpenID,当列表数较多时,可以通过多次拉取的方式来满足需求。
|
||||
// 该接口每次调用最多可拉取 1000 个 OpenID,当列表数较多时,可以通过多次拉取的方式来满足需求。
|
||||
// 参数 beginOpenid:当 begin_openid 为空时,默认从开头拉取。
|
||||
func (user *User) GetBlackList(beginOpenid ...string) (userlist *OpenidList, err error) {
|
||||
if len(beginOpenid) > 1 {
|
||||
return nil, errors.New("参数 beginOpenid 错误:请传递 1 个openID,若需要从头开始拉取列表请留空。")
|
||||
return nil, errors.New("参数 beginOpenid 错误:请传递 1 个 openID,若需要从头开始拉取列表请留空。")
|
||||
}
|
||||
// 获取 AccessToken
|
||||
var accessToken string
|
||||
@@ -62,13 +62,13 @@ func (user *User) GetAllBlackList() (openIDList []string, err error) {
|
||||
)
|
||||
|
||||
for {
|
||||
// 获取列表(每次1k条)
|
||||
// 获取列表(每次 1k 条)
|
||||
if userlist, err = user.GetBlackList(beginOpenid); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
openIDList = append(openIDList, userlist.Data.OpenIDs...) // 存储本次获得的OpenIDs
|
||||
openIDList = append(openIDList, userlist.Data.OpenIDs...) // 存储本次获得的 OpenIDs
|
||||
count += userlist.Count // 记录获得的总数量
|
||||
beginOpenid = userlist.NextOpenID // 记录下次循环的起始openID
|
||||
beginOpenid = userlist.NextOpenID // 记录下次循环的起始 openID
|
||||
if count >= userlist.Total {
|
||||
break // 获得的数量=total,结束循环
|
||||
}
|
||||
@@ -78,13 +78,13 @@ func (user *User) GetAllBlackList() (openIDList []string, err error) {
|
||||
}
|
||||
|
||||
// BatchBlackList 拉黑用户
|
||||
// 参数 openidList:需要拉入黑名单的用户的openid,每次拉黑最多允许20个
|
||||
// 参数 openidList:需要拉入黑名单的用户的 openid,每次拉黑最多允许 20 个
|
||||
func (user *User) BatchBlackList(openidList ...string) (err error) {
|
||||
return user.batch(batchblacklistURL, "BatchBlackList", openidList...)
|
||||
}
|
||||
|
||||
// BatchUnBlackList 取消拉黑用户
|
||||
// 参数 openidList:需要取消拉入黑名单的用户的openid,每次拉黑最多允许20个
|
||||
// 参数 openidList:需要取消拉入黑名单的用户的 openid,每次拉黑最多允许 20 个
|
||||
func (user *User) BatchUnBlackList(openidList ...string) (err error) {
|
||||
return user.batch(batchunblacklistURL, "BatchUnBlackList", openidList...)
|
||||
}
|
||||
@@ -93,7 +93,7 @@ func (user *User) BatchUnBlackList(openidList ...string) (err error) {
|
||||
func (user *User) batch(url, apiName string, openidList ...string) (err error) {
|
||||
// 检查参数
|
||||
if len(openidList) == 0 || len(openidList) > 20 {
|
||||
return errors.New("参数 openidList 错误:每次操作黑名单用户数量为1-20个。")
|
||||
return errors.New("参数 openidList 错误:每次操作黑名单用户数量为 1-20 个。")
|
||||
}
|
||||
|
||||
// 获取 AccessToken
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Package user migrate 用于微信公众号账号迁移,获取openID变化
|
||||
// Package user migrate 用于微信公众号账号迁移,获取 openID 变化
|
||||
// 参考文档:https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html
|
||||
package user
|
||||
|
||||
@@ -13,23 +13,23 @@ const (
|
||||
changeOpenIDURL = "https://api.weixin.qq.com/cgi-bin/changeopenid"
|
||||
)
|
||||
|
||||
// ChangeOpenIDResult OpenID迁移变化
|
||||
// ChangeOpenIDResult OpenID 迁移变化
|
||||
type ChangeOpenIDResult struct {
|
||||
OriOpenID string `json:"ori_openid"`
|
||||
NewOpenID string `json:"new_openid"`
|
||||
ErrMsg string `json:"err_msg,omitempty"`
|
||||
}
|
||||
|
||||
// ChangeOpenIDResultList OpenID迁移变化列表
|
||||
// ChangeOpenIDResultList OpenID 迁移变化列表
|
||||
type ChangeOpenIDResultList struct {
|
||||
util.CommonError
|
||||
List []ChangeOpenIDResult `json:"result_list"`
|
||||
}
|
||||
|
||||
// ListChangeOpenIDs 返回指定OpenID变化列表
|
||||
// fromAppID 为老账号AppID
|
||||
// openIDs 为老账号的openID,openIDs限100个以内
|
||||
// AccessToken 为新账号的AccessToken
|
||||
// ListChangeOpenIDs 返回指定 OpenID 变化列表
|
||||
// fromAppID 为老账号 AppID
|
||||
// openIDs 为老账号的 openID,openIDs 限 100 个以内
|
||||
// AccessToken 为新账号的 AccessToken
|
||||
func (user *User) ListChangeOpenIDs(fromAppID string, openIDs ...string) (list *ChangeOpenIDResultList, err error) {
|
||||
list = &ChangeOpenIDResultList{}
|
||||
// list.List = make([]ChangeOpenIDResult, 0)
|
||||
@@ -65,10 +65,10 @@ func (user *User) ListChangeOpenIDs(fromAppID string, openIDs ...string) (list *
|
||||
return
|
||||
}
|
||||
|
||||
// ListAllChangeOpenIDs 返回所有用户OpenID列表
|
||||
// fromAppID 为老账号AppID
|
||||
// openIDs 为老账号的openID
|
||||
// AccessToken 为新账号的AccessToken
|
||||
// ListAllChangeOpenIDs 返回所有用户 OpenID 列表
|
||||
// fromAppID 为老账号 AppID
|
||||
// openIDs 为老账号的 openID
|
||||
// AccessToken 为新账号的 AccessToken
|
||||
func (user *User) ListAllChangeOpenIDs(fromAppID string, openIDs ...string) (list []ChangeOpenIDResult, err error) {
|
||||
list = make([]ChangeOpenIDResult, 0)
|
||||
chunks := util.SliceChunk(openIDs, 100)
|
||||
|
||||
@@ -102,7 +102,7 @@ type BatchGetUserInfoParams struct {
|
||||
// BatchGetUserListItem 需要获取基本信息的用户
|
||||
type BatchGetUserListItem struct {
|
||||
OpenID string `json:"openid"` // 用户的标识,对当前公众号唯一
|
||||
Lang string `json:"lang"` // 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN
|
||||
Lang string `json:"lang"` // 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为 zh-CN
|
||||
}
|
||||
|
||||
// InfoList 用户基本信息列表
|
||||
@@ -161,7 +161,10 @@ func (user *User) ListUserOpenIDs(nextOpenid ...string) (*OpenidList, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
uri, _ := url.Parse(userListURL)
|
||||
uri, err := url.Parse(userListURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
q := uri.Query()
|
||||
q.Set("access_token", accessToken)
|
||||
if len(nextOpenid) > 0 && nextOpenid[0] != "" {
|
||||
@@ -184,7 +187,7 @@ func (user *User) ListUserOpenIDs(nextOpenid ...string) (*OpenidList, error) {
|
||||
return &userlist, nil
|
||||
}
|
||||
|
||||
// ListAllUserOpenIDs 返回所有用户OpenID列表
|
||||
// ListAllUserOpenIDs 返回所有用户 OpenID 列表
|
||||
func (user *User) ListAllUserOpenIDs() ([]string, error) {
|
||||
nextOpenid := ""
|
||||
openids := make([]string, 0)
|
||||
|
||||
Reference in New Issue
Block a user