处理来自微信的文本消息

处理,来自,文本,消息 · 浏览次数 : 58

小编点评

**微信服务器转发给我们的用户消息处理步骤:** 1. 微信服务器将接收来自公众号服务器的普通消息。 2. 微信服务器将将消息内容以 XML 格式发送给我们。 3. 我们的服务器接收并解析 XML 消息。 4. 服务器根据消息类型处理消息内容。 **接收微信服务器转发消息的代码示例:** ```go type WeChatVerify struct { Signature string `json:"signature"` Timestamp string `json:"timestamp"` Nonce string `json:"nonce"` Echostr string `json:"echostr"` } type WeChatMsg struct { XMLName xml.Name `xml:"xml"` ToUserName string FromUserName string CreateTime int64 MsgType string Content string } func wxPost(ctx *gin.Context) { // Verify WeChatVerify struct verify := &WeChatVerify{ Signature: ctx.Query("signature"), Timestamp: ctx.Query("timestamp"), Nonce: ctx.Query("nonce"), Echostr: ctx.Query("echostr"), } // Verify WeChatVerify struct if !verify.Verify() { log.Error("WeChat Verify failed") ctx.JSON(http.StatusBadRequest, gin.H{"error": "WeChat Verify failed"}) return } // Parse XML message reqBody, err := io.ReadAll(ctx.Request.Body) if err != nil { log.Errorf("read request body error: %s", err.Error()) ctx.JSON(http.StatusBadRequest, gin.H{"error": "read request body error"}) return } // Unmarshal XML message xml.Unmarshal(reqBody, &WeChatMsg{}) // Return the XML response log.Infof("return msg to wechat: %s", string(xml.Marshal(WeChatMsg{}))) ctx.Writer.Header().Set("Content-Type", "text/xml") ctx.Writer.WriteString(string(xml.Marshal(WeChatMsg{}))) } ```

正文

官方文档在这里

我们的公众号服务器可以接收来自微信服务器的普通消息,包括:

  • 文本消息
  • 图片消息
  • 语音消息
  • 小视频消息
  • 地理位置消息
  • 链接消息

这里以文本消息为例,介绍如何处理微信服务器转发给我们的用户消息。

当普通微信用户向公众账号发消息时,微信服务器将向我们填写写的URL上发送一条包含XML数据包的POST请求,其格式如下:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
  <MsgDataId>xxxx</MsgDataId>
  <Idx>xxxx</Idx>
</xml>

以下代码只是一个简单的示例,只是将微信服务器转发给我们的消息回发的用户:

type WeChatVerify struct {
	Signature string `json:"signature" form:"signature"`
	Timestamp string `json:"timestamp" form:"timestamp"`
	Nonce     string `json:"nonce" form:"nonce"`
	Echostr   string `json:"echostr" form:"echostr"`
}

type WeChatMsg struct {
	XMLName      xml.Name `xml:"xml"`
	ToUserName   string
	FromUserName string
	CreateTime   int64
	MsgType      string
	Content      string
}

func wxPost(ctx *gin.Context) {
	log.Info("Get Msg from wechat")
	verify := &WeChatVerify{
		Signature: ctx.Query("signature"),
		Timestamp: ctx.Query("timestamp"),
		Nonce:     ctx.Query("nonce"),
		Echostr:   ctx.Query("echostr"),
	}
	if !verify.Verify() {
		log.Error("WeChat Verify failed")
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "WeChat Verify failed"})
		return
	}
	log.Info("verify pass")

	reqBody := &WeChatMsg{}
	body, err := io.ReadAll(ctx.Request.Body)
	if err != nil {
		log.Errorf("read request body error: %s", err.Error())
		ctx.JSON(http.StatusBadRequest, gin.H{"error": "read request body error"})
		return
	}
	xml.Unmarshal(body, reqBody)
	reqBytes, _ := sonic.Marshal(reqBody)
	log.Infof("Get requset from wechat: %s", string(reqBytes))

	switch reqBody.MsgType {
	case "text":
		resp := &WeChatMsg{}
		resp.FromUserName = reqBody.ToUserName
		resp.ToUserName = reqBody.FromUserName
		resp.CreateTime = time.Now().Unix()
		resp.MsgType = "text"
		resp.Content = reqBody.Content
		respBytes, _ := xml.Marshal(resp)
		log.Infof("return msg to wechat: %s", string(respBytes))
		ctx.Writer.Header().Set("Content-Type", "text/xml")
		ctx.Writer.WriteString(string(respBytes))
	default:
		log.Errorf("unknow MsgType: %s", reqBody.MsgType)
		ctx.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("unknow MsgType: %s", reqBody.MsgType)})
		return
	}
}

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意


与处理来自微信的文本消息相似的内容:

处理来自微信的文本消息

官方文档在这里。 我们的公众号服务器可以接收来自微信服务器的普通消息,包括: 文本消息 图片消息 语音消息 小视频消息 地理位置消息 链接消息 这里以文本消息为例,介绍如何处理微信服务器转发给我们的用户消息。 当普通微信用户向公众账号发消息时,微信服务器将向我们填写写的URL上发送一条包含XML数据

学node 之前你要知道这些

初识nodejs 19年年底一个偶然的机会接到年会任务,有微信扫码登录、投票、弹幕等功能,于是决定用node 来写几个服务,结果也比较顺利。 当时用看了下koa2的官方文档,知道怎么连接数据库、怎么映射表实体,怎么处理http,怎么处理异常等,就可以直接写起来了。从应用层面上来说 nodejs 入门

一进群就水群?试试这个水群拦截工具

大家好,我是小彭。 周末了,可以休息了,来自习室休息吧。 最近交流群人数越来越多,群里的小伙伴还个个都是人才,说话又好听,每天打开微信看都是满屏的 999+条新消息~ 到后来有些长得帅的直接把我们的群备注为 小彭的吹水群,给我气的。 水群是一门技术活,水得恰到好处可以让群处于一个十分活跃的状态。但是

Nginx拆分配置文件的办法

Nginx拆分配置文件的办法 摘要 最近公司使用Nginx进行微服务的路由处理 但是发现随着业务发展, 配置文件越来越复杂. 修改起来也很容易出现错误. 基于此. 想通过拆分配置文件的方式来提高修改效率和准确性. 其实方法非常简单, 记录一下知识备忘. 拆分的方法 其实不需要必须使用 conf.d的

TiKV 源码分析之 PointGet

作者:来自 vivo 互联网存储研发团队-Guo Xiang 本文介绍了TiDB中最基本的PointGet算子在存储层TiKV中的执行流程。 一、背景介绍 TiDB是一款具有HTAP能力(同时支持在线事务处理与在线分析处理 )的融合型分布式数据库产品,具备水平扩容或者缩容等重要特性。TiDB 采用多

每日一库:使用Viper处理Go应用程序的配置

在开发Go应用程序时,处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库,可以帮助我们处理这些配置。 什么是Viper? Viper是一个应用程序配置解决方案,用于Go应用程序。它支持JSON、TOML、YAML、HCL、envfile和Java p

[转帖]扩展Linux网络栈

https://www.cnblogs.com/charlieroro/p/14047183.html 感觉自己见识短浅了.. 来自Linux内核文档。之前看过这篇文章,一直好奇,问什么一条网络流会固定在一个CPU上进行处理,本文档可以解决这个疑问。为了更好地理解本文章中的功能,将这篇文章穿插入内。

[转帖]linux tcp 半连接队列和全连接队列

TCP建立连接的“三次握手”过程 上图就是tcp建联的三次握手过程。 Server端需要先调用bind()方法,绑定ip和端口号,再调用listen()方法,然后就可以等待来自Client连接了Client 调用connect()后,就会发送SYN包到Server,此时Client端处理SYN_SE

浅谈深度学习中的概率

摘要:本次就和大家聊一聊深度学习中的概率。 本文分享自华为云社区《【MindSpore易点通】深度学习中的概率》,作者: chengxiaoli。 为什么会用到概率呢?因为在深度学习中经常会需要处理随机的数据,或者包含随机性的任务,随机性也来自非常多的方面,所以在存在不确定性的情况下,都需要用到概率

IceRPC之深入理解调度管道->快乐的RPC

作者引言 很高兴啊,我们来到了IceRPC之深入理解调度管道->快乐的RPC,为上篇的续篇,深入理解常见的调度类型, 基础引导,有点小压力,打好基础,才能让自已不在迷茫,快乐的畅游世界。 传入请求 了解如何处理传入的请求 接收传入的请求 调度器的调度方法接受传入的请求。该传入请求是由连接,在收到来自