首页 > 其他分享 >处理来自微信的文本消息

处理来自微信的文本消息

时间:2022-12-05 15:37:59浏览次数:63  
标签:string 来自 微信 resp reqBody ctx MsgType 文本

官方文档在这里

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

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

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

当普通微信用户向公众账号发消息时,微信服务器将向我们填写写的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: 恋水无意


标签:string,来自,微信,resp,reqBody,ctx,MsgType,文本
From: https://www.cnblogs.com/lianshuiwuyi/p/16952423.html

相关文章

  • 验证来自微信服务器的消息
    内容来自微信官方文档。接入微信公众平台开发,开发者需要按照如下步骤完成:填写服务器配置验证服务器地址的有效性依据接口文档实现业务逻辑微信官方的文档已经写得很......
  • 3.2.Linux-文本过滤与处理-colrm指令:删除文件中的指定列
    1.colrnmLinuxcolrm命令用于滤掉指定的行。colrm指令从标准输入设备读取数据,转而输出到标准输出设备。如果不加任何参数,则该指令不会过滤任何一行。2.语法colrm[......
  • Sunxi平台上通过DirectFB绘制文本遇到的一个问题
    关于如何在Tina平台上使用DirectFB,请参考失之东榆,收之桑榆,东方不亮西方亮,活人不能让尿憋死,VIPP虽然不给力,但我们还有VPU(VE),VE支持支持画框和贴水印的操作,画框VIPP已经干......
  • 收藏一个不错的微信调试工具
    微信调试,各种WebView样式调试、手机浏览器的页面真机调试。便捷的远程调试手机页面、抓包工具,支持:HTTP/HTTPS,无需USB连接设备。​​​https://github......
  • 皕杰报表之文本数据源
    皕杰报表可以使用excel表作为数据源么,当然可以了。文本数据库,指的是用文本文件编写的数据表如:类别ID类别名称1饮料2调味品3点心4日用品5谷类/麦片6肉类/家禽7特制品8海鲜一......
  • 微信小程序踩坑
     text标签嵌套后添加事件无效,如下onTap是不触发的,解决方法:将最外层text改成view<textbindtap="onTap"><text>这里是一段文字</text></text>在引入echarts图表的页面......
  • 微信小程序—标题栏
    <template><view:style="{paddingTop:statusBarHeight+'px',background:bg}"class="box"><view:style="{width:titleBarWidth+'px',height:titl......
  • HBuilderX 连接 微信开发者工具
    一、打开微信开发者工具第一次连接至微信开发者工具之前,需要先启动微信开发者工具,在工具栏,依次点击 设置->安全设置,在弹出的设置弹窗中,安全选项下,开启服务端口。如下图......
  • 微信小程序开发笔记[5]-蓝牙控制家居
    esp32[https://www.jianshu.com/p/758f5958bf74]蓝牙UUID生成[https://www.uuidgenerator.net/]打开网址就有一个随机的UUIDWhatisaversion4UUID?AVersion4......
  • 关于一些数学学习的建议(来自南二学长亲手打字)
    这个和算法竞赛有很相似的地方 光看懂是不行的 一定要多刷题,刷题的意义在于见到更多种的题型,遇到新题型的时候让自己抓到本质特征去解题,应对多种突发情况等等下面进入正......