php微信公众号开发(1)

当初看了好长时间,微信文档坑不少,然后忘记做笔记,只写了代码。现在写一遍,给以后做笔记。先写个开头。

微信的坑爹文档: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 '';


上述代码应该容易理解,把相应的数据放进自己写的模板里去,和我上面说的一样,模板格式多余的空格不要。


最后,你只需要把上述代码结合一下就能完成初步的开发了,之后给自己的公众号发送下信息尝试下吧。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值