欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php微信开发 大神看看有没有语法错误,能不能自动获取到最新access_token

程序员文章站 2022-05-24 12:48:00
...
class Wechat_base_api{
        
        private $appid='wx5d4b7d2e8bfd5793';
        private $appsecret='4379ef7213c36eae5dc2ab91f9f6aced';
        //构造函数
        public function __construct($appid,$appsecret)
        {
            $this->appid = $appid;
            $this->appsecret = $appsecret;
        }
        
    //获取access_token(支持自动更新凭证)
        public function get_access_token()
        {
            $this->last_time = 1408851194;
            $access_token = "jIGpovtFGZDXCB_K2vqDPTA05zP7VWZaKIHXC_qZDqEiSGONWfCzQ45fI9aksl2L188yhtPpNB61iOBS4TTtgw";

            if(time() > ($this->last_time + 7200))
            {
                //GET请求的地址
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}";
                 $access_token_Arr =  $this->https_request($url);
                 $this->last_time = time();
                 return $access_token_Arr['access_token'];            
            }

            return $access_token;
        }
//https请求(支持GET和POST)
        protected function https_request($url,$data = null)
        {
            $ch = curl_init();
            curl_setopt($ch,CURLOPT_URL,$url);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
            if(!empty($data))
            {
                curl_setopt($ch,CURLOPT_POST,1);//模拟POST
                curl_setopt($ch,CURLOPT_POSTFIELDS,$data);//POST内容
            }
            $outopt = curl_exec($ch);
            curl_close($ch);
            $outopt = json_decode($outopt,true);
            return $outopt;
        }
}

回复内容:

class Wechat_base_api{
        
        private $appid='wx5d4b7d2e8bfd5793';
        private $appsecret='4379ef7213c36eae5dc2ab91f9f6aced';
        //构造函数
        public function __construct($appid,$appsecret)
        {
            $this->appid = $appid;
            $this->appsecret = $appsecret;
        }
        
    //获取access_token(支持自动更新凭证)
        public function get_access_token()
        {
            $this->last_time = 1408851194;
            $access_token = "jIGpovtFGZDXCB_K2vqDPTA05zP7VWZaKIHXC_qZDqEiSGONWfCzQ45fI9aksl2L188yhtPpNB61iOBS4TTtgw";

            if(time() > ($this->last_time + 7200))
            {
                //GET请求的地址
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}";
                 $access_token_Arr =  $this->https_request($url);
                 $this->last_time = time();
                 return $access_token_Arr['access_token'];            
            }

            return $access_token;
        }
//https请求(支持GET和POST)
        protected function https_request($url,$data = null)
        {
            $ch = curl_init();
            curl_setopt($ch,CURLOPT_URL,$url);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
            if(!empty($data))
            {
                curl_setopt($ch,CURLOPT_POST,1);//模拟POST
                curl_setopt($ch,CURLOPT_POSTFIELDS,$data);//POST内容
            }
            $outopt = curl_exec($ch);
            curl_close($ch);
            $outopt = json_decode($outopt,true);
            return $outopt;
        }
}

1.没有语法错误
2.这是谁家的id和secret...

问题大的很

  • 过期时间写死,会导致不停请求微信接口,可能会达到接口请求上限

  • access_token也是写死,当达到接口请求上限后,返回都是过期错误的access_token

  • 说到底,access_token没有缓存起来。

下面这个是根据微信提供的示例代码更改改过的:

appId = $appId ? $appId : $this->appId;
        $this->appSecret = $appSecret ? $appSecret : $this->appSecret;
        $this->file_path = $file_path ? $file_path : $this->file_path;
    }

    /**
     * 获取微信AccessToken
     * @return mixed
     */
    private function getAccessToken() {

        $data = json_decode(file_get_contents($this->file_path));

        if ($data->expire_time appId&corpsecret=$this->appSecret";

            // 其它类型公众号使用这个URL获取access_token
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";

            //访问微信接口,拉取access_token等信息
            $res = json_decode($this->httpGet($url));

            //提取出access_token
            $access_token = $res->access_token;

            //判断access_token是否存在,存在保存到本地文件中
            if ($access_token) {

                $data->expire_time = time() + 7190;
                $data->access_token = $access_token;

                $fp = fopen($this->file_path, "w");
                fwrite($fp, json_encode($data));
                fclose($fp);
            }
        } else { //本地存储的access_token没有过期
            $access_token = $data->access_token;
        }

        //返回
        return $access_token;
    }

    /**
     * 拉取数据
     * @param $url
     * @return mixed|string
     */
    private function httpGet($url) {

        //本地请求,则跳过请求
        if('127.0.0.1' == $_SERVER['SERVER_ADDR']){
            return '';
        }

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }
}

微信官方文档中的 PHP 代码,感觉坑比较多,自己一个个接口试过去太耗时了(别问我是怎么知道的…)。

因为我们项目中用的是 CI 框架,在 GitHub 中这个项目:https://github.com/dodgepudding/wechat-php-sdk 的基础上稍加改动,就完成了微信的集成。

看这份代码比看官方文档要快,我是这么觉得的…

哥们 你们家的appid 跟appsecret 暴露了!!!
另外 access_token 是有次数限制的
记得缓存下来,不然请求次数过多,会出错的

相关标签: php