美文网首页
微信获取token几个步骤一定不要错,否则坑的你不要不要的

微信获取token几个步骤一定不要错,否则坑的你不要不要的

作者: 浮雲往事 | 来源:发表于2018-06-22 10:47 被阅读0次

    一、验证服务器

    这里需要加入一下你的服务器ip地址

    文件valid.php   该文件存放位置要和上图URL对应

    include 'token.php';//包含一下第二点的token验证文件

    define("TOKEN", "weixin"); //对应上图的Token
    $wechatObj = new wechatCallbackapiTest();

    $wechatObj->valid();   //调用微信验证类方法,该类只需执行一次,目的其实就是”证明你就是你“,你操作的是你自己的服务器

    所以验证成功后,就可以注释掉这一行  
     //$wechatObj->valid(); 

    class wechatCallbackapiTest{
    public function valid()  {

          $echoStr = $_GET["echostr"];
         if($this->checkSignature()){
                ob_clean();
                echo $echoStr;
                exit;
           }
    }

    private function checkSignature(){
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
             $token = TOKEN;
             $tmpArr = array($token, $timestamp, $nonce);
             sort($tmpArr);
             $tmpStr = implode( $tmpArr );
             $tmpStr = sha1( $tmpStr );
             if( $tmpStr == $signature ){
                     return true;
             }else{
                    return false;
             }
    }

    //下面第三点的代码需要放到这里,

    }

    二、每次客户端和服务器端交互前都会要求验证access_token

    //token.php,------用来判断access_token是否有效并且保存access_token到本地文件中,避免反复失效

    ps:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

    if(exists_token()){

        if(expirse_token()){

            //token过期,重新获取token

            $token=get_token();

            unlink('token.txt');

            file_put_contents('token.txt',$token);

        }else{

            $token=file_get_contents('token.txt');

        }

    }else{

        $token=get_token();

        file_put_contents('token.txt',$token);

    }

    //判断文件是否存在

    function exists_token(){

        if(file_exists('token.txt')){

            return true;

        }else{

            return false;

        }

    }

    //或取token.txt的创建时间,并且与执行当前index.php的时间对比

    function expirse_token(){

        $ctime=filectime('token.txt');

    $time=time();

    $s=$time-$ctime;

    echo "现在时间:$time 创建时间:$ctime 计算结果:$s";

        if((time()-$ctime)>=7000){

            return true;

        }else{

            return false;

        }

    }

    function get_token(){

        $appid = 'wxdbf86fa6a4c38a41';

        $appsecret = '99d54a1936e35b88b40f5501cd5ca524';

        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL,$url);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);

        $data = curl_exec($ch);

        curl_close($ch);

        $obj=json_decode($data,true);

    //file_put_contents('access.txt',$data);

        return $obj['access_token'];

    }

    三、消息处理

    //接下来就是处理微信和客户端的交互了

     //启用微信服务器后,客户端所有的请求都会转向这里被执行(微信那边只是验证身份,和请求转发)

    public function responseMsg(){

    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

     if (!empty($postStr)){

     libxml_disable_entity_loader(true); //对信息模板进行错误处理

     $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素

     $event=$postObj->Event;//通过上步骤取到的对象获取相关事件属性、发送用户、接受用户、以及内容等信息

     $fromUsername = $postObj->FromUserName;//发送用户

     $toUsername = $postObj->ToUserName;//接收用户

     $keyword = trim($postObj->Content); //内容

     $time = time();//消息发送时间

    $textTpl="<xml>

    <ToUserName><![CDATA[%s]]</ToUserName>

    <FromUserName><![CAATA[%S]]></FromUserName>

    <CreateTime>%s</CreateTime>

    <MstType><![CDATA[%S]]></MsgType>

    <Content><![CDATA[%S]]></Content>

    </xml>

    "

    信息模板

     //详见https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

    //根据客户端发送过来的事件,做出不同的响应

    if($event=="subscribe")

    {

    //subscribe(订阅),以下是一段示例代码,用户关注公众号后返回给用户一段友好信息,
    $msgType = "text";

      $contentStr ="你好!感谢您关注";

      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);

    //上面$textTpl 是信息模板

      echo $resultStr;

    }else if($event=="unsubscribe"){  

    //unsubscribe(取消订阅) 

    }else if($event=="LOCATION"){

    //获取地理位置事件

    }

    }

    详情请查阅官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454

    相关文章

      网友评论

          本文标题:微信获取token几个步骤一定不要错,否则坑的你不要不要的

          本文链接:https://www.haomeiwen.com/subject/cxwhyftx.html