Переглянути джерело

merge branch release-2.0 to v2 (#450)

* 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 <afeyer@h5base.cn>

Co-authored-by: ZmJ <wzmmmmj@gmail.com>
Co-authored-by: Afeyer <1500527791@qq.com>
Co-authored-by: Afeyer <afeyer@h5base.cn>
silenceper 4 роки тому
батько
коміт
e189b87e71

+ 60 - 0
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
 	// 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"
 	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
 	// 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"
 	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")
 	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")
+}

+ 55 - 1
officialaccount/message/subscribe.go

@@ -10,6 +10,8 @@ import (
 const (
 const (
 	subscribeSendURL         = "https://api.weixin.qq.com/cgi-bin/message/subscribe/bizsend"
 	subscribeSendURL         = "https://api.weixin.qq.com/cgi-bin/message/subscribe/bizsend"
 	subscribeTemplateListURL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate"
 	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 订阅消息
 //Subscribe 订阅消息
@@ -84,10 +86,62 @@ func (tpl *Subscribe) List() (templateList []*PrivateSubscribeItem, err error) {
 		return
 		return
 	}
 	}
 	var res resPrivateSubscribeList
 	var res resPrivateSubscribeList
-	err = util.DecodeWithError(response, &res, "ListSubscription")
+	err = util.DecodeWithError(response, &res, "ListSubscribe")
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
 	templateList = res.SubscriptionList
 	templateList = res.SubscriptionList
 	return
 	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")
+}

+ 8 - 0
work/kf/error.go

@@ -33,10 +33,14 @@ const (
 	SDKApiFreqOutOfLimit Error = "接口请求次数超频"
 	SDKApiFreqOutOfLimit Error = "接口请求次数超频"
 	// SDKApiForbidden 错误码:48002
 	// SDKApiForbidden 错误码:48002
 	SDKApiForbidden Error = "API 禁止调用"
 	SDKApiForbidden Error = "API 禁止调用"
+	// SDKInvalidOpenKFID 错误码:95000
+	SDKInvalidOpenKFID Error = "无效的 open_kfid"
 	// SDKOpenKFIDNotExist 错误码:95004
 	// SDKOpenKFIDNotExist 错误码:95004
 	SDKOpenKFIDNotExist Error = "open_kfid 不存在"
 	SDKOpenKFIDNotExist Error = "open_kfid 不存在"
 	// SDKWeWorkAlready 错误码:95011
 	// SDKWeWorkAlready 错误码:95011
 	SDKWeWorkAlready Error = "已在企业微信使用微信客服"
 	SDKWeWorkAlready Error = "已在企业微信使用微信客服"
+	// SDKApiNotOpen 错误码:95017
+	SDKApiNotOpen Error = "API 功能没有被开启"
 )
 )
 
 
 //Error 输出错误信息
 //Error 输出错误信息
@@ -69,10 +73,14 @@ func NewSDKErr(code int64, msgList ...string) Error {
 		return SDKApiFreqOutOfLimit
 		return SDKApiFreqOutOfLimit
 	case 48002:
 	case 48002:
 		return SDKApiForbidden
 		return SDKApiForbidden
+	case 95000:
+		return SDKInvalidOpenKFID
 	case 95004:
 	case 95004:
 		return SDKOpenKFIDNotExist
 		return SDKOpenKFIDNotExist
 	case 95011:
 	case 95011:
 		return SDKWeWorkAlready
 		return SDKWeWorkAlready
+	case 95017:
+		return SDKApiNotOpen
 	default:
 	default:
 		//返回未知的自定义错误
 		//返回未知的自定义错误
 		if len(msgList) > 0 {
 		if len(msgList) > 0 {