当初看了好长时间,微信文档坑不少,然后忘记做笔记,只写了代码。现在写一遍,给以后做笔记。先写个开头。
微信的坑爹文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
简单的上手,没有注册公众号的话,先去开始开发->接口测试号申请,去申请一个测试号,扫个码即可。
进去之后,会有公众号信息给你,appID和appsecret,这些在验证的时候都要使用,相当与自己公众号的ID识别。
之后需要填写URL和Token。
URL:自己接入的服务器域名,例:www.wechat.com/wechat,这样就调用了这个路由的方法。
Token:相当于你在微信设置的一个密码,在验证的时候需要比较是否一样。
PS:实际上还有一个参数,EncodingAESKey。测试号是无法填写的,不过可以去接开始开发->接口在线调试中可以填写来测试。
这个参数是消息的加密密匙,微信加密共有3种模式,1.明文模式 2.兼容模式 3.安全模式
1.明文模式:无加密 2.兼容模式:加密和未加密一起发送 3.安全模式:只有加密
2和3都需要填写EncodingAESKey,加密后需要一些解密操作,现在先不管。
填写完URL和Token后,我们可以开始写程序。
首先,需要验证信息是否来自微信。我们看微信文档。
需要用到上述几个参数,按照上面的方法写,为了方便直接贴代码了。这里以TP5为例,可以根据自己的框架进行修改。
1.验证参数:
//获取参数
$token ='token';
$receive = $this->request;
$signature = $receive->get('signature');
$timestamp = $receive->get('timestamp');
$nonce = $receive->get('nonce');
//组合字符串
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpArr = sha1(implode($tmpArr));
//对比参数
return $tmpArr == $signature;
如果你用框架的话,可以用框架自己的接收方法,这边只是提供一个例子。
2.返回echostr
验证完后,需要我们原样返回echostr。
$receive = $this->request;
if (!empty($receive->get('echostr'))) {
$echostr = $receive->get('echostr');
return $echostr;
}
这样我们就能完成了验证是否是微信发来的信息了。
3.接收用户信息
微信文档写着,当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
查看下面的文档,给出了一大堆可以接收的信息。文本,图片,语音,视频等等。微信默认发送的是XML格式的数据,我们需要先接收这XML数据,之后对XML进行解析。解析完后,才能开始写对应的返回数据。先看下微信发送的信息,以文本信息为例。
可以看到这边有ToUserName接受者(我们的公众号),FromUserName发送者 (用户),CreateTime创建时间,MsgType信息类型Content文本内容 ,MsgId信息Id。其他的可以看微信文档,我就不写出来了。
这里直接放解析的代码:
//获取XML
$msg = file_get_contents("php://input");
if (empty($msg)) return '';
//解析XML
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA);
如果有兴趣的话可以去看下这几个方法是什么意思。其实自己写的话最好封装一个类,这样调用就行,像这样一大堆长的代码写着也不美观。
解析完代码后我们就获得了用户的发送过来的信息了。
4.处理用户信息
拿到用户的数据后,第一件事就是识别信息的类型,分辨出用户的信息后,我们才能采取对应的发放来返回信息。
例:
switch ($postObj->MsgType) {
case 'text':
return $this->handleText($postObj);
break;
default:
return '';
我们就对文本进行数据处理,其他都默认不处理。
现在先看文档
我们需要返回以上数据,然后返回微信发送过来的那种格式
注意,这里微信的坑就来了,这个返回格式,那些有空格的地方是不需要放空格的。
下面贴上代码:
if (!empty($postObj->Content)) {
$ToUserName = $postObj->FromUserName;
$FromUserName = $postObj->ToUserName;
$CreateTime = time();
$MsgType = 'text';
$Content = '欢迎回复';
$template = "<xml><ToUserName><![CDATA[%s]]></ToUserName>\n<FromUserName><![CDATA[%s]]></FromUserName>\n<CreateTime>%s</CreateTime>\n<MsgType><![CDATA[%s]]></MsgType>\n<Content><![CDATA[%s]]></Content>\n</xml>";
$info = sprintf($template, $ToUserName, $FromUserName, $CreateTime, $MsgType, $Content);
return $info;
}
return '';
上述代码应该容易理解,把相应的数据放进自己写的模板里去,和我上面说的一样,模板格式多余的空格不要。
最后,你只需要把上述代码结合一下就能完成初步的开发了,之后给自己的公众号发送下信息尝试下吧。