Przeglądaj źródła

Merge pull request #1 from silenceper/master

同步原仓库
cielu 6 lat temu
rodzic
commit
00ca733814

+ 12 - 0
.github/FUNDING.yml

@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: https://silenceper.com/img/wechat-pay.jpeg

+ 2 - 0
.github/ISSUE_TEMPLATE.md

@@ -0,0 +1,2 @@
+## 问题及现象
+<!-- 描述你的问题现象,报错**贴截图**粘贴或者贴具体信息,提供**必要的代码段**

+ 2 - 2
README.md

@@ -283,8 +283,8 @@ type Reply struct {
 ####  回复图片消息
 ```go
 //mediaID 可通过素材管理-上上传多媒体文件获得
-image :=message.NewVideo("mediaID")
-return &message.Reply{message.MsgTypeVideo, image}
+image :=message.NewImage("mediaID")
+return &message.Reply{message.MsgTypeImage, image}
 ```
 ####  回复视频消息
 ```go

+ 2 - 2
material/material.go

@@ -138,11 +138,11 @@ func (material *Material) AddVideo(filename, title, introduction string) (mediaI
 	fields := []util.MultipartFormField{
 		{
 			IsFile:    true,
-			Fieldname: "video",
+			Fieldname: "media",
 			Filename:  filename,
 		},
 		{
-			IsFile:    true,
+			IsFile:    false,
 			Fieldname: "description",
 			Value:     fieldValue,
 		},

+ 160 - 0
message/customer_message.go

@@ -0,0 +1,160 @@
+package message
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/silenceper/wechat/util"
+	"github.com/silenceper/wechat/context"
+)
+
+const (
+	customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
+)
+
+//Manager 消息管理者,可以发送消息
+type Manager struct {
+	*context.Context
+}
+
+//NewMessageManager 实例化消息管理者
+func NewMessageManager(context *context.Context) *Manager {
+	return &Manager{
+		context,
+	}
+}
+
+//CustomerMessage  客服消息
+type CustomerMessage struct {
+	ToUser          string                `json:"touser"`                    //接受者OpenID
+	Msgtype         MsgType               `json:"msgtype"`                   //客服消息类型
+	Text            *MediaText            `json:"text,omitempty"`            //可选
+	Image           *MediaResource        `json:"image,omitempty"`           //可选
+	Voice           *MediaResource        `json:"voice,omitempty"`           //可选
+	Video           *MediaVideo           `json:"video,omitempty"`           //可选
+	Music           *MediaMusic           `json:"music,omitempty"`           //可选
+	News            *MediaNews            `json:"news,omitempty"`            //可选
+	Mpnews          *MediaResource        `json:"mpnews,omitempty"`          //可选
+	Wxcard          *MediaWxcard          `json:"wxcard,omitempty"`          //可选
+	Msgmenu         *MediaMsgmenu         `json:"msgmenu,omitempty"`         //可选
+	Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` //可选
+}
+
+//NewCustomerTextMessage 文本消息结构体构造方法
+func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
+	return &CustomerMessage{
+		ToUser:  toUser,
+		Msgtype: MsgTypeText,
+		Text: &MediaText{
+			text,
+		},
+	}
+}
+
+//NewCustomerImgMessage 图片消息的构造方法
+func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
+	return &CustomerMessage{
+		ToUser:  toUser,
+		Msgtype: MsgTypeImage,
+		Image: &MediaResource{
+			mediaID,
+		},
+	}
+}
+
+//NewCustomerVoiceMessage 语音消息的构造方法
+func NewCustomerVoiceMessage(toUser, mediaID string) *CustomerMessage {
+	return &CustomerMessage{
+		ToUser:  toUser,
+		Msgtype: MsgTypeVoice,
+		Voice: &MediaResource{
+			mediaID,
+		},
+	}
+}
+
+//MediaText 文本消息的文字
+type MediaText struct {
+	Content string `json:"content"`
+}
+
+//MediaResource  消息使用的永久素材id
+type MediaResource struct {
+	MediaID string `json:"media_id"`
+}
+
+//MediaVideo 视频消息包含的内容
+type MediaVideo struct {
+	MediaID      string `json:"media_id"`
+	ThumbMediaID string `json:"thumb_media_id"`
+	Title        string `json:"title"`
+	Description  string `json:"description"`
+}
+
+//MediaMusic 音乐消息包括的内容
+type MediaMusic struct {
+	Title        string `json:"title"`
+	Description  string `json:"description"`
+	Musicurl     string `json:"musicurl"`
+	Hqmusicurl   string `json:"hqmusicurl"`
+	ThumbMediaID string `json:"thumb_media_id"`
+}
+
+//MediaNews 图文消息的内容
+type MediaNews struct {
+	Articles []MediaArticles `json:"articles"`
+}
+
+//MediaArticles 图文消息的内容的文章列表中的单独一条
+type MediaArticles struct {
+	Title       string `json:"title"`
+	Description string `json:"description"`
+	URL         string `json:"url"`
+	Picurl      string `json:"picurl"`
+}
+
+//MediaMsgmenu 菜单消息的内容
+type MediaMsgmenu struct {
+	HeadContent string        `json:"head_content"`
+	List        []MsgmenuItem `json:"list"`
+	TailContent string        `json:"tail_content"`
+}
+
+//MsgmenuItem 菜单消息的菜单按钮
+type MsgmenuItem struct {
+	ID      string `json:"id"`
+	Content string `json:"content"`
+}
+
+//MediaWxcard 卡券的id
+type MediaWxcard struct {
+	CardID string `json:"card_id"`
+}
+
+//MediaMiniprogrampage 小程序消息
+type MediaMiniprogrampage struct {
+	Title        string `json:"title"`
+	Appid        string `json:"appid"`
+	Pagepath     string `json:"pagepath"`
+	ThumbMediaID string `json:"thumb_media_id"`
+}
+
+//Send 发送客服消息
+func (manager *Manager) Send(msg  *CustomerMessage) error {
+	accessToken,err:=manager.Context.GetAccessToken()
+	if err!=nil {
+		return err
+	}
+	uri := fmt.Sprintf("%s?access_token=%s", customerSendMessage, accessToken)
+	response, err := util.PostJSON(uri, msg)
+ 	var result util.CommonError
+	err = json.Unmarshal(response, &result)
+	if err != nil {
+		return err
+	}
+	if result.ErrCode != 0 {
+		err = fmt.Errorf("customer msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
+		return err
+	}
+
+	return nil
+}

+ 8 - 0
message/message.go

@@ -63,6 +63,8 @@ const (
 	EventLocationSelect = "location_select"
 	//EventTemplateSendJobFinish 发送模板消息推送通知
 	EventTemplateSendJobFinish = "TEMPLATESENDJOBFINISH"
+	//EventWxaMediaCheck 异步校验图片/音频是否含有违法违规内容推送事件
+	EventWxaMediaCheck = "wxa_media_check"
 )
 
 const (
@@ -144,6 +146,12 @@ type MixMessage struct {
 	OuterStr            string `xml:"OuterStr"`
 	IsRestoreMemberCard int32  `xml:"IsRestoreMemberCard"`
 	UnionID             string `xml:"UnionId"`
+
+	// 内容审核相关
+	IsRisky 		    bool `xml:"isrisky"`
+	ExtraInfoJSON 		string `xml:"extra_info_json"`
+	TraceID 			string `xml:"trace_id"`
+	StatusCode          int `xml:"status_code"`
 }
 
 //EventPic 发图事件推送

+ 3 - 1
server/server.go

@@ -65,7 +65,9 @@ func (srv *Server) Serve() error {
 	}
 
 	//debug
-	//fmt.Println("request msg = ", string(srv.requestRawXMLMsg))
+	if srv.debug {
+		fmt.Println("request msg = ", string(srv.requestRawXMLMsg))
+	}
 
 	return srv.buildResponse(response)
 }