Просмотр исходного кода

序列化 xml 时添加 cdata 标签

silenceper 6 лет назад
Родитель
Сommit
d7f371cb65
3 измененных файлов с 22 добавлено и 11 удалено
  1. 5 5
      message/customer_message.go
  2. 15 4
      message/message.go
  3. 2 2
      message/text.go

+ 5 - 5
message/customer_message.go

@@ -3,8 +3,8 @@ package message
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
-	"github.com/silenceper/wechat/util"
 	"github.com/silenceper/wechat/context"
 	"github.com/silenceper/wechat/context"
+	"github.com/silenceper/wechat/util"
 )
 )
 
 
 const (
 const (
@@ -139,14 +139,14 @@ type MediaMiniprogrampage struct {
 }
 }
 
 
 //Send 发送客服消息
 //Send 发送客服消息
-func (manager *Manager) Send(msg  *CustomerMessage) error {
-	accessToken,err:=manager.Context.GetAccessToken()
-	if err!=nil {
+func (manager *Manager) Send(msg *CustomerMessage) error {
+	accessToken, err := manager.Context.GetAccessToken()
+	if err != nil {
 		return err
 		return err
 	}
 	}
 	uri := fmt.Sprintf("%s?access_token=%s", customerSendMessage, accessToken)
 	uri := fmt.Sprintf("%s?access_token=%s", customerSendMessage, accessToken)
 	response, err := util.PostJSON(uri, msg)
 	response, err := util.PostJSON(uri, msg)
- 	var result util.CommonError
+	var result util.CommonError
 	err = json.Unmarshal(response, &result)
 	err = json.Unmarshal(response, &result)
 	if err != nil {
 	if err != nil {
 		return err
 		return err

+ 15 - 4
message/message.go

@@ -2,6 +2,7 @@ package message
 
 
 import (
 import (
 	"encoding/xml"
 	"encoding/xml"
+
 	"github.com/silenceper/wechat/device"
 	"github.com/silenceper/wechat/device"
 )
 )
 
 
@@ -181,22 +182,32 @@ type ResponseEncryptedXMLMsg struct {
 	Nonce        string   `xml:"Nonce"        json:"Nonce"`
 	Nonce        string   `xml:"Nonce"        json:"Nonce"`
 }
 }
 
 
+// CDATA  使用该类型,在序列化为 xml 文本时文本会被解析器忽略
+type CDATA string
+
+// MarshalXML 实现自己的序列化方法
+func (c CDATA) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+	return e.EncodeElement(struct {
+		string `xml:",cdata"`
+	}{string(c)}, start)
+}
+
 // CommonToken 消息中通用的结构
 // CommonToken 消息中通用的结构
 type CommonToken struct {
 type CommonToken struct {
 	XMLName      xml.Name `xml:"xml"`
 	XMLName      xml.Name `xml:"xml"`
-	ToUserName   string   `xml:"ToUserName"`
-	FromUserName string   `xml:"FromUserName"`
+	ToUserName   CDATA    `xml:"ToUserName"`
+	FromUserName CDATA    `xml:"FromUserName"`
 	CreateTime   int64    `xml:"CreateTime"`
 	CreateTime   int64    `xml:"CreateTime"`
 	MsgType      MsgType  `xml:"MsgType"`
 	MsgType      MsgType  `xml:"MsgType"`
 }
 }
 
 
 //SetToUserName set ToUserName
 //SetToUserName set ToUserName
-func (msg *CommonToken) SetToUserName(toUserName string) {
+func (msg *CommonToken) SetToUserName(toUserName CDATA) {
 	msg.ToUserName = toUserName
 	msg.ToUserName = toUserName
 }
 }
 
 
 //SetFromUserName set FromUserName
 //SetFromUserName set FromUserName
-func (msg *CommonToken) SetFromUserName(fromUserName string) {
+func (msg *CommonToken) SetFromUserName(fromUserName CDATA) {
 	msg.FromUserName = fromUserName
 	msg.FromUserName = fromUserName
 }
 }
 
 

+ 2 - 2
message/text.go

@@ -3,12 +3,12 @@ package message
 //Text 文本消息
 //Text 文本消息
 type Text struct {
 type Text struct {
 	CommonToken
 	CommonToken
-	Content string `xml:"Content"`
+	Content CDATA `xml:"Content"`
 }
 }
 
 
 //NewText 初始化文本消息
 //NewText 初始化文本消息
 func NewText(content string) *Text {
 func NewText(content string) *Text {
 	text := new(Text)
 	text := new(Text)
-	text.Content = content
+	text.Content = CDATA(content)
 	return text
 	return text
 }
 }