微信公众号开发之接收普通消息

本文介绍如何通过PHP实现微信公众号的普通消息接收功能,包括文本、图片、语音等多种消息类型的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章要讲的是微信中的接收普通消息;

接收普通消息:顾名思义,它的作用就是接收普通用户发送的消息,并根据接收消息类型的不同,分为了六大接收接口;

1 文本消息
2 图片消息
3 语音消息
4 视频消息
5 小视频消息
6 地理位置消息
7 链接消息   
视频和小视频同属一类;

它们都是通过接收xml文档接收,根据分析xml文档后根据类型判断并回复相应消息;

一:文本消息;

文本消息是我们在开发中使用特别多的类型,用户发送的文字都可以归入此类;

下面的代码就是文本消息的基本语法;

 <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>
 </xml>

参数 	         描述
ToUserName 	开发者微信号
FromUserName 	发送方帐号(一个OpenID)
CreateTime 	消息创建时间 (整型)(时间戳)
MsgType 	text
Content 	文本消息内容
MsgId 	        消息id,64位整型 

如果用户发送过来的xml数据中,MsgType接点为text,就代表用户发送的就是文本消息;

在实际开发中我们该如何来识别用户发送的消息,并编写代码?;下面来打开我们之前讲过的开发工具;并打开demo接口文档

我们知道,其实这个接口文档中最重要的的就是自动回复功能

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin444");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	echo $echoStr;
            $this->responseMsg();
        	exit;
        }
    }

    public function responseMsg()
    {
		<span style="color:#FF0000;">//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();</span>//以上为接收用户的消息;可以看到,并没有接收用户消息类型,也就是MsgType;

①接收用户消息类型


$msgType=$postObj->MsgType;//注意大小写;


 $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";             
			<h4>②对相关数据进行判断,这里是MsgType</h4>	<pre name="code" class="html">if ($msgType=='text'){
                $contentStr = "您发送的是文本类型";
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType,$contentStr);
                echo $resultStr;
            }else if(!empty( $keyword ))
{ if($keyword=="img"){ $imgTpl ="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml>"; $msgType = "image"; $mediaId='qS7GKu_Mhkpt0y7-BEcTR_B2FrpuBZXFTZqCcszOOll9z8PWmBSaoYo7VpVBQlmc'; $resultStr = sprintf($imgTpl, $fromUsername, $toUsername, $time, $msgType, $mediaId); echo $resultStr; }else{ $msgType = "text"; $contentStr = "阁下何不乘风起,随风直上九万里"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } }else{ echo "Input something..."; } }else { echo ""; exit; } }private function checkSignature(){ // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN;$tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rulesort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );return true;if( $tmpStr == $signature ){return true;}else{return false;}}}?>




这样文本接口就算测试成功了;其他几个接口类型用法一样,在这里就不多做解释了.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值