配置好上一篇的服务器之后,用户发送消息,就会自动post提交到我们配置的地址,我们可以通过file_get_contents(“php://input”)获取微信提交过来的数据,使用simplexml_load_string()把xml数据转成SimpleXMLElement 对象,代码如下
$postStr = file_get_contents("php://input");
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
测试的时候发现微信会回调两次,解出来的数据是这样的
SimpleXMLElement::__set_state(array(
'ToUserName' => 'fsfsdfsdfsd',
'FromUserName' => 'dfwfsfsdfsdfsd',
'CreateTime' => '1590742768',
'MsgType' => 'event',
'Event' => 'location_select',
'EventKey' => 'rselfmenu_2_0',
'SendLocationInfo' =>
SimpleXMLElement::__set_state(array(
'Location_X' => 'xxxx',
'Location_Y' => 'xxxx',
'Scale' => '15',
'Label' => 'xxxxx',
'Poiname' => 'xxxxxx',
)),
SimpleXMLElement::__set_state(array(
'ToUserName' => 'fsfsdfsdfsd',
'FromUserName' => 'dfwfsfsdfsdfsd',
'CreateTime' => '1590742768',
'MsgType' => 'location',
'Location_X' => 'xxxx',
'Location_Y' => 'xxxx',
'Scale' => '15',
'Label' => 'xxxx',
'MsgId' => 'xxxx',
))
第二次的是我们需要的,我这个是给公众号发送的定位,MsgType类型是location,除了这种还有text,image,voice等等
然后就是根据传过来的数据处理逻辑,把想要返回给用户的数据备好
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($textTpl, $fromUserName, $toUserName, time(), $content);
ToUserName是要发送的用户的openid,fromUserName是微信号,直接把微信提交过来的数据拿来用就可以了,不过记得要把两者的位置调换一下,因为微信接收信息的时候是作为接收者,用户作为发送者,回复用户的时候微信是作为发送者,用户是作为接收者。
sprintf会把数据转成xml数据,然后直接echo用户就可以收到了