Procházet zdrojové kódy

feat:微信客服支持向客户发送欢迎语 (#478)

* feat:微信客服支持向客户发送欢迎语

* chore: go fmt file

* feat:移除空白文件
Afeyer před 4 roky
rodič
revize
d776f5c400

+ 45 - 0
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
+}

+ 55 - 0
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"`
+}

+ 1 - 0
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"` // 事件消息
 }