From e189b87e71320f80ad6ef7c1dc731027d27e8798 Mon Sep 17 00:00:00 2001 From: silenceper Date: Mon, 30 Aug 2021 11:14:25 +0800 Subject: [PATCH] merge branch release-2.0 to v2 (#450) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add/delete subscribe template (#449) * feat: 添加 SDKApiNotOpen 错误信息 (#448) * 添加微信客服SDK * polish:优化签名函数 * polish:优化注释内容 * polish:复用已有的Token以及CommonError,移除无用的输出 * polish:复用已有的消息加解密 * fix:修复错误信息被覆盖的问题 * polish:go fmt 文件 * polish:客服链接支持自定义参数并更新注释文档内容 * feat:支持微信客服回调请求的校验和消息的解析,复用原有的Signature和DecryptMsg方法 * feat:对外暴露SDKApiForbidden等错误 可以通过调用升级服务相关接口然后根据该错误判断微信客服配置来源 * feat:添加无效的open_kfid错误信息 * fix: 添加SDKApiNotOpen 错误信息 目前主要用于判断客户是否关闭了API授权,如果客户关闭了API功能导致服务异常,则可以引导用户执行相应的操作重新开启改功能 Co-authored-by: Afeyer Co-authored-by: ZmJ Co-authored-by: Afeyer <1500527791@qq.com> Co-authored-by: Afeyer --- miniprogram/subscribe/subscribe.go | 60 ++++++++++++++++++++++++++++ officialaccount/message/subscribe.go | 56 +++++++++++++++++++++++++- work/kf/error.go | 8 ++++ 3 files changed, 123 insertions(+), 1 deletion(-) diff --git a/miniprogram/subscribe/subscribe.go b/miniprogram/subscribe/subscribe.go index c260fca..dad44b8 100644 --- a/miniprogram/subscribe/subscribe.go +++ b/miniprogram/subscribe/subscribe.go @@ -16,6 +16,14 @@ const ( // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.getTemplateList.html getTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate" + // 添加订阅模板 + // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html + addTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate" + + // 删除私有模板 + // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.deleteTemplate.html + delTemplateURL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate" + // 统一服务消息 // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html uniformMessageSend = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send" @@ -133,3 +141,55 @@ func (s *Subscribe) UniformSend(msg *UniformMessage) (err error) { } return util.DecodeWithCommonError(response, "UniformSend") } + +type resSubscribeAdd struct { + util.CommonError + + TemplateID string `json:"priTmplId"` +} + +// Add 添加订阅消息模板 +func (s *Subscribe) Add(ShortID string, kidList []int, sceneDesc string) (templateID string, err error) { + var accessToken string + accessToken, err = s.GetAccessToken() + if err != nil { + return + } + var msg = struct { + TemplateIDShort string `json:"tid"` + SceneDesc string `json:"sceneDesc"` + KidList []int `json:"kidList"` + }{TemplateIDShort: ShortID, SceneDesc: sceneDesc, KidList: kidList} + uri := fmt.Sprintf("%s?access_token=%s", addTemplateURL, accessToken) + var response []byte + response, err = util.PostJSON(uri, msg) + if err != nil { + return + } + var result resSubscribeAdd + err = util.DecodeWithError(response, &result, "AddSubscribe") + if err != nil { + return + } + templateID = result.TemplateID + return +} + +// Delete 删除私有模板 +func (s *Subscribe) Delete(templateID string) (err error) { + var accessToken string + accessToken, err = s.GetAccessToken() + if err != nil { + return + } + var msg = struct { + TemplateID string `json:"priTmplId"` + }{TemplateID: templateID} + uri := fmt.Sprintf("%s?access_token=%s", delTemplateURL, accessToken) + var response []byte + response, err = util.PostJSON(uri, msg) + if err != nil { + return + } + return util.DecodeWithCommonError(response, "DeleteSubscribe") +} diff --git a/officialaccount/message/subscribe.go b/officialaccount/message/subscribe.go index 8598d21..3f9a42e 100644 --- a/officialaccount/message/subscribe.go +++ b/officialaccount/message/subscribe.go @@ -10,6 +10,8 @@ import ( const ( subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/bizsend" subscribeTemplateListURL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate" + subscribeTemplateAddURL = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate" + subscribeTemplateDelURL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate" ) //Subscribe 订阅消息 @@ -84,10 +86,62 @@ func (tpl *Subscribe) List() (templateList []*PrivateSubscribeItem, err error) { return } var res resPrivateSubscribeList - err = util.DecodeWithError(response, &res, "ListSubscription") + err = util.DecodeWithError(response, &res, "ListSubscribe") if err != nil { return } templateList = res.SubscriptionList return } + +type resSubscribeAdd struct { + util.CommonError + + TemplateID string `json:"priTmplId"` +} + +// Add 添加订阅消息模板 +func (tpl *Subscribe) Add(ShortID string, kidList []int, sceneDesc string) (templateID string, err error) { + var accessToken string + accessToken, err = tpl.GetAccessToken() + if err != nil { + return + } + var msg = struct { + TemplateIDShort string `json:"tid"` + SceneDesc string `json:"sceneDesc"` + KidList []int `json:"kidList"` + }{TemplateIDShort: ShortID, SceneDesc: sceneDesc, KidList: kidList} + uri := fmt.Sprintf("%s?access_token=%s", subscribeTemplateAddURL, accessToken) + var response []byte + response, err = util.PostJSON(uri, msg) + if err != nil { + return + } + var result resSubscribeAdd + err = util.DecodeWithError(response, &result, "AddSubscribe") + if err != nil { + return + } + templateID = result.TemplateID + return +} + +// Delete 删除私有模板 +func (tpl *Subscribe) Delete(templateID string) (err error) { + var accessToken string + accessToken, err = tpl.GetAccessToken() + if err != nil { + return + } + var msg = struct { + TemplateID string `json:"priTmplId"` + }{TemplateID: templateID} + uri := fmt.Sprintf("%s?access_token=%s", subscribeTemplateDelURL, accessToken) + var response []byte + response, err = util.PostJSON(uri, msg) + if err != nil { + return + } + return util.DecodeWithCommonError(response, "DeleteSubscribe") +} diff --git a/work/kf/error.go b/work/kf/error.go index 6281459..5c0c1c3 100644 --- a/work/kf/error.go +++ b/work/kf/error.go @@ -33,10 +33,14 @@ const ( SDKApiFreqOutOfLimit Error = "接口请求次数超频" // SDKApiForbidden 错误码:48002 SDKApiForbidden Error = "API 禁止调用" + // SDKInvalidOpenKFID 错误码:95000 + SDKInvalidOpenKFID Error = "无效的 open_kfid" // SDKOpenKFIDNotExist 错误码:95004 SDKOpenKFIDNotExist Error = "open_kfid 不存在" // SDKWeWorkAlready 错误码:95011 SDKWeWorkAlready Error = "已在企业微信使用微信客服" + // SDKApiNotOpen 错误码:95017 + SDKApiNotOpen Error = "API 功能没有被开启" ) //Error 输出错误信息 @@ -69,10 +73,14 @@ func NewSDKErr(code int64, msgList ...string) Error { return SDKApiFreqOutOfLimit case 48002: return SDKApiForbidden + case 95000: + return SDKInvalidOpenKFID case 95004: return SDKOpenKFIDNotExist case 95011: return SDKWeWorkAlready + case 95017: + return SDKApiNotOpen default: //返回未知的自定义错误 if len(msgList) > 0 {