• PHP开发微信公众号(一)二维码的获取


    要开发微信公众号,首先进行需要注册一个,然后认证。这就不用多说了。

    当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    申请成功后,你会得到一个appID 和 appsecret,这个就相当于你的开发者账号和密码。

    开发模式如下图:

    1、Access_Token的获取

    对于这个access_token就是一个访问标识,其实不用想得太高深,它就好比是你进图书馆需要的图书卡;

    如何获得它?依赖于appid和appsecret,这就像你办图书卡,需要身份证号或者学号,还需要输入密码。

    api接口如下:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appID&secret=appsecret

    这个是以get方式请求,会返回一个json数据,包括access_token和expires_in(有效期,一般为7200);

    php如何发送get请求,这里就需要封装一个函数了,使用curl,请先确保自己php的curl模块开启且能正常使用:

     1 private function _request($method='get',$url,$data=array(),$ssl=true){
     2         //curl完成,先开启curl模块
     3         //初始化一个curl资源
     4         $curl = curl_init();
     5         //设置curl选项
     6         curl_setopt($curl,CURLOPT_URL,$url);//url
     7         //请求的代理信息
     8         $user_agent = isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']: 
                          'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0 FirePHP/0.7.4'; 9 curl_setopt($curl,CURLOPT_USERAGENT,$user_agent); 10 //referer头,请求来源 11 curl_setopt($curl,CURLOPT_AUTOREFERER,true); 12 curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间 13 //SSL相关 14 if($ssl){ 15 //禁用后,curl将终止从服务端进行验证; 16 curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); 17 //检查服务器SSL证书是否存在一个公用名 18 curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2); 19 } 20 //判断请求方式post还是get 21 if(strtolower($method)=='post') { 22 /**************处理post相关选项******************/ 23 //是否为post请求 ,处理请求数据 24 curl_setopt($curl,CURLOPT_POST,true); 25 curl_setopt($curl,CURLOPT_POSTFIELDS,$data); 26 } 27 //是否处理响应头 28 curl_setopt($curl,CURLOPT_HEADER,false); 29 //是否返回响应结果 30 curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); 31 32 //发出请求 33 $response = curl_exec($curl); 34 if (false === $response) { 35 echo '<br>', curl_error($curl), '<br>'; 36 return false; 37 } 38 //关闭curl 39 curl_close($curl); 40 return $response; 41 }

    因为后面还会用到post请求,所有这里就需要一个参数判断是否何种请求。通过这个函数,我们就可以或得到微信公众号返回的json数据

    //获取access_token,并保存到文件里
        public function getAccessToken($token_file = './access_token'){
            //考虑这个access_token是否过期
            $life_time = 7200;
            //文件存在,并且左后修改时间与当前时间的差小于access_token的有效期,则有效
            if(file_exists($token_file) && time()-filemtime($token_file)<$life_time){
                //得到内容
                return file_get_contents($token_file);
            }
    
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appid}&secret={$this->_appsecret}";
            //向该地址发送get请求
            $result = $this->_request('get',$url);
            //处理响应结果
            if(!$result){
                return false;
            }
            //存在返回响应结果,返回对象
            $result_obj = json_decode($result);        
            //写入文件
            file_put_contents($token_file, $result_obj->access_token);
            return $result_obj->access_token;
        }

    因为这是写在一个类里面的,appid和appsecret都已经初始化好,所以直接用了它的属性。

    2、获取到了access_token后,想要生成二维码,还需要获取ticket

    ticket又是撒?这就像你网上买票,网站发给你的一个取票码,然后你拿这个取票码再去取票。同理,我们这里要获取也要先得到ticket,然后再去获取二维码图片。

            protected $_appid;
        protected $_appsecret;
        protected $_token;//公众平台请求开发者时需要标记
        protected $_appkey;//图灵机器人appkey
        //标识qrcodeticket的类型,是永久还是临时
        const QRCODE_TYPE_TEMP = 1;
        const QRCODE_TYPE_LIMIT = 2;
        const QRCODE_TYPE_LIMIT_STR = 3;
    //根据access_token获取ticket
        //@param $content 内容
        //@param $type qr码类型
        //@param $expire 有效期,如果是临时类型需指定
        //@return string ticket 
        public function getQRCodeTicket($content,$type=2,$expire=604800){
            $access_token = $this->getAccessToken();
            $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token;
            $type_list = array(
                    self::QRCODE_TYPE_TEMP => 'QR_SCENE',
                    self::QRCODE_TYPE_LIMIT=>'QR_LIMIT_SCENE',
                    self::QRCODE_TYPE_LIMIT_STR=>'QR_LIMIT_STR_SCENE'
                );
            $action_name = $type_list[$type];
            //post发送的数据
            switch ($type){
                case self::QRCODE_TYPE_TEMP:
                    $data_arr['expire_seconds']=$expire;
                    $data_arr['action_name'] = $action_name;
                    $data_arr['action_info']['scene']['scene_id']=$content;
                    break;
                case self::QRCODE_TYPE_LIMIT:
                    $data_arr['action_name'] = $action_name;
                    $data_arr['action_info']['scene']['scene_id'] = $content;
                    break;
                case self::QRCODE_TYPE_LIMIT_STR:
                    $data_arr['action_name'] = $action_name;
                    $data_arr['action_info']['scene']['scene_str'] = $content;
                    break;
            }
            $data = json_encode($data_arr);
            $result = $this->_request('post',$url,$data);
            if(!$result){
                return false;
            }
            $result_obj = json_decode($result);
            return $result_obj->ticket;
        }    

    ticket又分为临时、永久、永久字符串三种,其中临时又需要传递有效期。永久和永久字符串区别只在于$content传递的是带引号还是不带引号。

    这里通过post提交数据后,就可以获得ticket。

    3、获得二维码qrcode

    接下来就可以获取二维码了

    //根据ticket获取二维码
        /**
          * @param int|string $content qrcode内容标识
          * @param [type] $file 存储为文件的地址,如果null直接输出
          * @param integer $type 类型
          * @param integer $expire 如果是临时,标识有效期
          * @return  [type]     
         */
        
        public function getQRCode($content,$file=NULL,$type=2,$expire=604800){
            //获取ticket
            $ticket = $this->getQRCodeTicket($content,$type=2,$expire=604800);
            $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=$ticket";
            //发送,取得图片数据
            $result = $this->_request('get',$url);
            if($file){
                file_put_contents($file,$result);
            }else{
                header('Content-Type:image/jpeg');
                echo $result;
            }        
        }

    最后我们只需要实例化定义的类,传入appid和appsecret,然后调用getQRCode就可以获取到二维码了。

     源码下载:https://github.com/Ivanlovening/wechat

  • 相关阅读:
    LeetCode449. 序列化和反序列化二叉搜索树
    LeetCode448. 找到所有数组中消失的数字
    一行代码如何隐藏 Linux 进程?
    C语言这么厉害,它自身又是用什么语言写的?
    了解C语言,是否代表了解C ++的一半?
    C语言小白那些不知道的事儿
    6 条 Git 实用技巧
    干货来袭,收藏方便找到该网站
    零基础小白如何入门Shell,快来看看(收藏)这篇大总结!!
    Java用于嵌入式系统的优点和局限
  • 原文地址:https://www.cnblogs.com/myIvan/p/myIvan.html
Copyright © 2020-2023  润新知