微信公众号测试的那些坑(关注事件/验证token)

楼主是根据慕课网视频学习由于框架及PHP版本不一样造成的问题~!

1. $GLOBALS['HTTP_RAW_POST_DATA’] 

    如果你的PHP版本是7及以上获取xml数据包;则使用file_get_contens("php://input");

2. 如果使用Tp5及以上版本的框架

    验证token的时候;$echostr如果不存在会自动报错,不往后继续执行代码;

    解决: $echostr = isset($_GET['echostr']) ? $_GET['echostr'] : '';

    如果存在使用,否则给个空的字符串保证后续代码继续执行;

下面是我的代码,使用TP5,PHP版本7.1,如果需要赋值代码请注意以下几点:

    1. 第二行namespace的路径; 2. class类名需注意是否一样; 3. appid和密码需更改为你自己的;

<?php
namespace app\wechat\controller;
use think\Controller;
use Util\data\Sysdb;

class Index extends Controller
{
    // 验证token
    public function index(){
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $echostr   = isset($_GET['echostr']) ? $_GET['echostr'] : '';
        $nonce     = $_GET["nonce"];
        $token     = "xiaocong";
        // 形成数组按字典排序
        // $array = array();
        $array = array($nonce, $timestamp, $token);
        sort($array);
        // 拼接字符串,进行sha1加密
        $str = sha1(implode($array));
        
        if($str == $signature && $echostr){
            echo $echostr;
            exit;
        }else{
            $this->reponseMsg();
        }
    }

    // 接收事件推送并回复
    public function reponseMsg(){
        // 获取到微信推送过来post数据(xml格式)
        $postArr = file_get_contents("php://input");
        // 处理消息类型,并设置回复类型和内容
        $postObj = simplexml_load_string($postArr);
        //判断该数据包是否是订阅的事件推送
        if(strtolower($postObj->MsgType) == 'event'){
            //如果是关注 subscribe 事件
            if(strtolower($postObj->Event == 'subscribe')){
                //回复用户消息(纯文本格式) 
                $toUser   = $postObj->FromUserName;
                $fromUser = $postObj->ToUserName;
                $time     = time();
                $msgType  = 'text';
                $content  = '欢迎关注小葱的微信公众账号';
                $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            </xml>";
                $info     = sprintf($template, $toUser, $fromUser, $time, $msgType, $content);
                echo $info;
            }
        }

        // 接收文本消息
        if(strtolower($postObj->MsgType) == 'text' && trim($postObj->Content) == 'tuwen'){
            $arr = array(
                array(
                    'title' => '小猫咪',
                    'description' => "挺可爱的嘛!",
                    'PicUrl' => "http://mmbiz.qpic.cn/mmbiz_jpg/YRib4YUtr7kCc25NewwsdlP5nibbmLVicNfdzwrJ6d3T1j8CThykDPE6rvkgO3mWp9DHbZicP4mvQiaeDrq74WG6yRw/0",
                    'url' => "www.baidu.com"
                )
            );
            $toUser   = $postObj->FromUserName;
            $fromUser = $postObj->ToUserName;
            $time     = time();
            $template = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[news]]></MsgType>
                        <ArticleCount>" . count($arr) . "</ArticleCount>
                        <Articles>";
            foreach($arr as $key => $value){
                $template .= "<item>
                                <Title><![CDATA[".$value['title']."]]></Title>
                                <Description><![CDATA[".$value['description']."]]></Description>
                                <PicUrl><![CDATA[".$value['PicUrl']."]]></PicUrl>
                                <Url><![CDATA[".$value['url']."]]></Url>
                            </item>";
            }
            $template .= "</Articles>
                        </xml>";
            $info = sprintf($template, $toUser, $fromUser, $time);
            echo $info;
        }
    }

    // 获取access_token
    public function getwxaccess_token(){
        $appid  = "xxxxxxxxxxx";
        $secret = "xxxxxxxxxxxx";
        $url    = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$secret;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($ch);
        curl_close($ch);
        echo $res;
    }
}


猜你喜欢

转载自blog.csdn.net/weixin_42358094/article/details/89531447