From d776f5c40007afb8a5d3118b4787e3575625c12c Mon Sep 17 00:00:00 2001 From: Afeyer <1500527791@qq.com> Date: Mon, 13 Sep 2021 10:07:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=BE=AE=E4=BF=A1=E5=AE=A2=E6=9C=8D?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=90=91=E5=AE=A2=E6=88=B7=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=AC=A2=E8=BF=8E=E8=AF=AD=20(#478)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat:微信客服支持向客户发送欢迎语 * chore: go fmt file * feat:移除空白文件 --- work/kf/sendmsgonevent.go | 45 +++++++++++++++++++++++++ work/kf/sendmsgonevent/message.go | 55 +++++++++++++++++++++++++++++++ work/kf/syncmsg/message.go | 1 + 3 files changed, 101 insertions(+) create mode 100644 work/kf/sendmsgonevent.go create mode 100644 work/kf/sendmsgonevent/message.go diff --git a/work/kf/sendmsgonevent.go b/work/kf/sendmsgonevent.go new file mode 100644 index 0000000..8060d3a --- /dev/null +++ b/work/kf/sendmsgonevent.go @@ -0,0 +1,45 @@ +package kf + +import ( + "encoding/json" + "fmt" + + "github.com/silenceper/wechat/v2/util" +) + +const ( + // 发送事件响应消息 + sendMsgOnEventAddr = "https://qyapi.weixin.qq.com/cgi-bin/kf/send_msg_on_event?access_token=%s" +) + +// SendMsgOnEventSchema 发送事件响应消息 +type SendMsgOnEventSchema struct { + util.CommonError + MsgID string `json:"msgid"` // 消息ID。如果请求参数指定了msgid,则原样返回,否则系统自动生成并返回。不多于32字节, 字符串取值范围(正则表达式):[0-9a-zA-Z_-]* +} + +// SendMsgOnEvent 发送事件响应消息 +//「进入会话事件」响应消息: +// 如果满足通过API下发欢迎语条件(条件为:1. 企业没有在管理端配置了原生欢迎语;2. 用户在过去48小时里未收过欢迎语,且未向该用户发过消息),则用户进入会话事件会额外返回一个welcome_code,开发者以此为凭据调用接口(填到该接口code参数),即可向客户发送客服欢迎语。 +// 为了保证用户体验以及避免滥用,开发者仅可在收到相关事件后20秒内调用,且只可调用一次。 +func (r *Client) SendMsgOnEvent(options interface{}) (info SendMsgOnEventSchema, err error) { + var ( + accessToken string + data []byte + ) + accessToken, err = r.ctx.GetAccessToken() + if err != nil { + return + } + data, err = util.PostJSON(fmt.Sprintf(sendMsgOnEventAddr, accessToken), options) + if err != nil { + return + } + if err = json.Unmarshal(data, &info); err != nil { + return + } + if info.ErrCode != 0 { + return info, NewSDKErr(info.ErrCode, info.ErrMsg) + } + return info, nil +} diff --git a/work/kf/sendmsgonevent/message.go b/work/kf/sendmsgonevent/message.go new file mode 100644 index 0000000..16aabfa --- /dev/null +++ b/work/kf/sendmsgonevent/message.go @@ -0,0 +1,55 @@ +package sendmsgonevent + +// Message 发送事件响应消息 +type Message struct { + Code string `json:"code"` // 事件响应消息对应的code。通过事件回调下发,仅可使用一次。 + MsgID string `json:"msgid"` // 消息ID。如果请求参数指定了msgid,则原样返回,否则系统自动生成并返回。不多于32字节,不多于32字节 +} + +// Text 文本消息 +type Text struct { + Message + MsgType string `json:"msgtype"` // 消息类型,此时固定为:text + Text struct { + Content string `json:"content"` // 消息内容,最长不超过2048个字节 + } `json:"text"` // 文本消息 +} + +// Menu 发送菜单消息 +type Menu struct { + Message + MsgType string `json:"msgtype"` // 消息类型,此时固定为:msgmenu + MsgMenu struct { + HeadContent string `json:"head_content"` // 消息内容,不多于1024字节 + List []interface{} `json:"list"` // 菜单项配置 + TailContent string `json:"tail_content"` // 结束文本, 不多于1024字 + } `json:"msgmenu"` +} + +// MenuClick 回复菜单 +type MenuClick struct { + Type string `json:"type"` // 菜单类型: click 回复菜单 + Click struct { + ID string `json:"id"` // 菜单ID, 不少于1字节, 不多于64字节 + Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于128字节 + } `json:"click"` +} + +// MenuView 超链接菜单 +type MenuView struct { + Type string `json:"type"` // 菜单类型: view 超链接菜单 + View struct { + URL string `json:"url"` // 点击后跳转的链接, 不少于1字节, 不多于2048字节 + Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于1024字节 + } `json:"view"` +} + +// MenuMiniProgram 小程序菜单 +type MenuMiniProgram struct { + Type string `json:"type"` // 菜单类型: miniprogram 小程序菜单 + MiniProgram struct { + AppID string `json:"appid"` // 小程序appid, 不少于1字节, 不多于32字节 + PagePath string `json:"pagepath"` // 点击后进入的小程序页面, 不少于1字节, 不多于1024字节 + Content string `json:"content"` // 菜单显示内容, 不少于1字节, 不多于1024字节 + } `json:"miniprogram"` +} diff --git a/work/kf/syncmsg/message.go b/work/kf/syncmsg/message.go index 7e2d638..d889903 100644 --- a/work/kf/syncmsg/message.go +++ b/work/kf/syncmsg/message.go @@ -120,6 +120,7 @@ type EnterSessionEvent struct { ExternalUserID string `json:"external_userid"` // 客户UserID Scene string `json:"scene"` // 进入会话的场景值,获取客服帐号链接开发者自定义的场景值 SceneParam string `json:"scene_param"` // 进入会话的自定义参数,获取客服帐号链接返回的url,开发者按规范拼接的scene_param参数 + WelcomeCode string `json:"welcome_code"` // 如果满足发送欢迎语条件(条件为:1. 企业没有在管理端配置了原生欢迎语;2. 用户在过去48小时里未收过欢迎语,且未向该用户发过消息),会返回该字段。可用该welcome_code调用发送事件响应消息接口给客户发送欢迎语。 } `json:"event"` // 事件消息 }