mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-07 22:22:28 +08:00
添加微信客服SDK (#436)
* 添加微信客服SDK * polish:优化签名函数 * polish:优化注释内容 * polish:复用已有的Token以及CommonError,移除无用的输出 * polish:复用已有的消息加解密 * fix:修复错误信息被覆盖的问题 * polish:go fmt 文件
This commit is contained in:
10
work/kf/syncmsg/callback.go
Normal file
10
work/kf/syncmsg/callback.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package syncmsg
|
||||
|
||||
// Event 微信客服回调事件
|
||||
type Event struct {
|
||||
ToUserName string `json:"to_user_name"` // 微信客服组件ID
|
||||
CreateTime int `json:"create_time"` // 消息创建时间,unix时间戳
|
||||
MsgType string `json:"msgtype"` // 消息的类型,此时固定为 event
|
||||
Event string `json:"event"` // 事件的类型,此时固定为 kf_msg_or_event
|
||||
Token string `json:"token"` // 调用拉取消息接口时,需要传此token,用于校验请求的合法性
|
||||
}
|
||||
161
work/kf/syncmsg/message.go
Normal file
161
work/kf/syncmsg/message.go
Normal file
@@ -0,0 +1,161 @@
|
||||
package syncmsg
|
||||
|
||||
// BaseMessage 接收消息
|
||||
type BaseMessage struct {
|
||||
MsgID string `json:"msgid"` // 消息ID
|
||||
OpenKFID string `json:"open_kfid"` // 客服帐号ID
|
||||
ExternalUserID string `json:"external_userid"` // 客户UserID
|
||||
ReceptionistUserID string `json:"servicer_userid"` // 接待客服userID
|
||||
SendTime uint64 `json:"send_time"` // 消息发送时间
|
||||
Origin uint32 `json:"origin"` // 消息来源。3-客户回复的消息 4-系统推送的消息 5-客服回复消息
|
||||
}
|
||||
|
||||
// Text 文本消息
|
||||
type Text struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:text
|
||||
Text struct {
|
||||
Content string `json:"content"` // 文本内容
|
||||
MenuID string `json:"menu_id"` // 客户点击菜单消息,触发的回复消息中附带的菜单ID
|
||||
} `json:"text"` // 文本消息
|
||||
}
|
||||
|
||||
// Image 图片消息
|
||||
type Image struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:image
|
||||
Image struct {
|
||||
MediaID string `json:"media_id"` // 图片文件ID
|
||||
} `json:"image"` // 图片消息
|
||||
}
|
||||
|
||||
// Voice 语音消息
|
||||
type Voice struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:voice
|
||||
Voice struct {
|
||||
MediaID string `json:"media_id"` // 语音文件ID
|
||||
} `json:"voice"` // 语音消息
|
||||
}
|
||||
|
||||
// Video 视频消息
|
||||
type Video struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:video
|
||||
Video struct {
|
||||
MediaID string `json:"media_id"` // 文件ID
|
||||
} `json:"video"` // 视频消息
|
||||
}
|
||||
|
||||
// File 文件消息
|
||||
type File struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:file
|
||||
File struct {
|
||||
MediaID string `json:"media_id"` // 文件ID
|
||||
} `json:"file"` // 文件消息
|
||||
}
|
||||
|
||||
// Location 地理位置消息
|
||||
type Location struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:location
|
||||
Location struct {
|
||||
Latitude float32 `json:"latitude"` // 纬度
|
||||
Longitude float32 `json:"longitude"` // 经度
|
||||
Name string `json:"name"` // 位置名
|
||||
Address string `json:"address"` // 地址详情说明
|
||||
} `json:"location"` // 地理位置消息
|
||||
}
|
||||
|
||||
// Link 链接消息
|
||||
type Link struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:link
|
||||
Link struct {
|
||||
Title string `json:"title"` // 标题
|
||||
Desc string `json:"desc"` // 描述
|
||||
URL string `json:"url"` // 点击后跳转的链接
|
||||
PicURL string `json:"pic_url"` // 缩略图链接
|
||||
} `json:"link"` // 链接消息
|
||||
}
|
||||
|
||||
// BusinessCard 名片消息
|
||||
type BusinessCard struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:business_card
|
||||
BusinessCard struct {
|
||||
UserID string `json:"userid"` // 名片 userid
|
||||
} `json:"business_card"` // 名片消息
|
||||
}
|
||||
|
||||
// MiniProgram 小程序消息
|
||||
type MiniProgram struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:miniprogram
|
||||
MiniProgram struct {
|
||||
AppID string `json:"appid"` // 小程序appid,必须是关联到企业的小程序应用
|
||||
Title string `json:"title"` // 小程序消息标题,最多64个字节,超过会自动截断
|
||||
ThumbMediaID string `json:"thumb_media_id"` // 小程序消息封面的mediaid,封面图建议尺寸为520*416
|
||||
PagePath string `json:"pagepath"` // 点击消息卡片后进入的小程序页面路径
|
||||
} `json:"miniprogram"` // 小程序消息
|
||||
}
|
||||
|
||||
// EventMessage 事件消息
|
||||
type EventMessage struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:event
|
||||
Event struct {
|
||||
EventType string `json:"event_type"` // 事件类型
|
||||
} `json:"event"` // 事件消息
|
||||
}
|
||||
|
||||
// EnterSessionEvent 用户进入会话事件
|
||||
type EnterSessionEvent struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:event
|
||||
Event struct {
|
||||
EventType string `json:"event_type"` // 事件类型。此处固定为:enter_session
|
||||
OpenKFID string `json:"open_kfid"` // 客服账号ID
|
||||
ExternalUserID string `json:"external_userid"` // 客户UserID
|
||||
Scene string `json:"scene"` // 进入会话的场景值,获取客服帐号链接开发者自定义的场景值
|
||||
} `json:"event"` // 事件消息
|
||||
}
|
||||
|
||||
// MsgSendFailEvent 消息发送失败事件
|
||||
type MsgSendFailEvent struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:event
|
||||
Event struct {
|
||||
EventType string `json:"event_type"` // 事件类型。此处固定为:msg_send_fail
|
||||
OpenKFID string `json:"open_kfid"` // 客服账号ID
|
||||
ExternalUserID string `json:"external_userid"` // 客户UserID
|
||||
FailMsgID string `json:"fail_msgid"` // 发送失败的消息msgid
|
||||
FailType uint32 `json:"fail_type"` // 失败类型。0-未知原因 1-客服账号已删除 2-应用已关闭 4-会话已过期,超过48小时 5-会话已关闭 6-超过5条限制 7-未绑定视频号 8-主体未验证 9-未绑定视频号且主体未验证 10-用户拒收
|
||||
} `json:"event"` // 事件消息
|
||||
}
|
||||
|
||||
// ReceptionistStatusChangeEvent 客服人员接待状态变更事件
|
||||
type ReceptionistStatusChangeEvent struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:event
|
||||
Event struct {
|
||||
EventType string `json:"event_type"` // 事件类型。此处固定为:servicer_status_change
|
||||
ReceptionistUserID string `json:"servicer_userid"` // 客服人员userid
|
||||
Status uint32 `json:"status"` // 状态类型。1-接待中 2-停止接待
|
||||
} `json:"event"`
|
||||
}
|
||||
|
||||
// SessionStatusChangeEvent 会话状态变更事件
|
||||
type SessionStatusChangeEvent struct {
|
||||
BaseMessage
|
||||
MsgType string `json:"msgtype"` // 消息类型,此时固定为:event
|
||||
Event struct {
|
||||
EventType string `json:"event_type"` // 事件类型。此处固定为:session_status_change
|
||||
OpenKFID string `json:"open_kfid"` // 客服账号ID
|
||||
ExternalUserID string `json:"external_userid"` // 客户UserID
|
||||
ChangeType uint32 `json:"change_type"` // 变更类型。1-从接待池接入会话 2-转接会话 3-结束会话
|
||||
OldReceptionistUserID string `json:"old_servicer_userid"` // 老的客服人员userid。仅change_type为2和3有值
|
||||
NewReceptionistUserID string `json:"new_servicer_userid"` // 新的客服人员userid。仅change_type为1和2有值
|
||||
} `json:"event"` // 事件消息
|
||||
}
|
||||
102
work/kf/syncmsg/syncmsg.go
Normal file
102
work/kf/syncmsg/syncmsg.go
Normal file
@@ -0,0 +1,102 @@
|
||||
package syncmsg
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
// Message 同步的消息内容
|
||||
type Message struct {
|
||||
MsgID string `json:"msgid"` // 消息ID
|
||||
OpenKFID string `json:"open_kfid"` // 客服帐号ID
|
||||
ExternalUserID string `json:"external_userid"` // 客户UserID
|
||||
SendTime uint64 `json:"send_time"` // 消息发送时间
|
||||
Origin uint32 `json:"origin"` // 消息来源。3-客户回复的消息 4-系统推送的消 息
|
||||
MsgType string `json:"msgtype"` // 消息类型
|
||||
EventType string `json:"event_type"` // 事件类型
|
||||
OriginData []byte `json:"origin_data"` // 原始数据内容
|
||||
}
|
||||
|
||||
// GetOriginMessage 获取原始消息
|
||||
func (r Message) GetOriginMessage() (info []byte) {
|
||||
return r.OriginData
|
||||
}
|
||||
|
||||
// GetTextMessage 获取文本消息
|
||||
func (r Message) GetTextMessage() (info Text, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetImageMessage 获取图片消息
|
||||
func (r Message) GetImageMessage() (info Image, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetVoiceMessage 获取语音消息
|
||||
func (r Message) GetVoiceMessage() (info Voice, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetVideoMessage 获取视频消息
|
||||
func (r Message) GetVideoMessage() (info Video, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetFileMessage 获取文件消息
|
||||
func (r Message) GetFileMessage() (info File, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetLocationMessage 获取文件消息
|
||||
func (r Message) GetLocationMessage() (info Location, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetLinkMessage 获取链接消息
|
||||
func (r Message) GetLinkMessage() (info Link, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetBusinessCardMessage 获取名片消息
|
||||
func (r Message) GetBusinessCardMessage() (info BusinessCard, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetMiniProgramMessage 获取小程序消息
|
||||
func (r Message) GetMiniProgramMessage() (info MiniProgram, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetEnterSessionEvent 用户进入会话事件
|
||||
func (r Message) GetEnterSessionEvent() (info EnterSessionEvent, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
info.OpenKFID = info.Event.OpenKFID
|
||||
info.ExternalUserID = info.Event.ExternalUserID
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetMsgSendFailEvent 消息发送失败事件
|
||||
func (r Message) GetMsgSendFailEvent() (info MsgSendFailEvent, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetReceptionistStatusChangeEvent 客服人员接待状态变更事件
|
||||
func (r Message) GetReceptionistStatusChangeEvent() (info ReceptionistStatusChangeEvent, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
return info, err
|
||||
}
|
||||
|
||||
// GetSessionStatusChangeEvent 会话状态变更事件
|
||||
func (r Message) GetSessionStatusChangeEvent() (info SessionStatusChangeEvent, err error) {
|
||||
err = json.Unmarshal(r.OriginData, &info)
|
||||
info.OpenKFID = info.Event.OpenKFID
|
||||
info.ExternalUserID = info.Event.ExternalUserID
|
||||
return info, err
|
||||
}
|
||||
Reference in New Issue
Block a user