设为首页 收藏本站
查看: 1441|回复: 0

[经验分享] PHP开发微信公众号(一)二维码的获取

[复制链接]

尚未签到

发表于 2017-12-31 09:31:07 | 显示全部楼层 |阅读模式
  要开发微信公众号,首先进行需要注册一个,然后认证。这就不用多说了。
  当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
  申请成功后,你会得到一个appID 和 appsecret,这个就相当于你的开发者账号和密码。
  开发模式如下图:
DSC0000.png

  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模块开启且能正常使用:
  

private function _request($method='get',$url,$data=array(),$ssl=true){  

//curl完成,先开启curl模块  

//初始化一个curl资源  
         $curl = curl_init();
  

//设置curl选项  
         curl_setopt($curl,CURLOPT_URL,$url);//url
  
         //请求的代理信息
  
         $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';
  
         curl_setopt($curl,CURLOPT_USERAGENT,$user_agent);
  
         //referer头,请求来源
  
         curl_setopt($curl,CURLOPT_AUTOREFERER,true);
  
         curl_setopt($curl, CURLOPT_TIMEOUT, 30);//设置超时时间
  
         //SSL相关
  
         if($ssl){
  
             //禁用后,curl将终止从服务端进行验证;
  
             curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);
  
             //检查服务器SSL证书是否存在一个公用名
  
             curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
  
         }
  
         //判断请求方式post还是get
  
         if(($method)=='post') {
  
             /**************处理post相关选项******************/
  
             //是否为post请求 ,处理请求数据
  
             curl_setopt($curl,CURLOPT_POST,true);
  
             curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
  
         }
  
         //是否处理响应头
  
         curl_setopt($curl,CURLOPT_HEADER,false);
  
         //是否返回响应结果
  
         curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
  

  
         //发出请求
  
         $response = curl_exec($curl);
  
         if (false === $response) {
  
             echo '<br>', curl_error($curl), '<br>';
  
             return false;
  
         }
  
         //关闭curl
  
         curl_close($curl);
  
         return $response;
  
     }
  

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

//获取access_token,并保存到文件里  public function getAccessToken($token_file = './access_token'){
//考虑这个access_token是否过期  $life_time = 7200;
  //文件存在,并且左后修改时间与当前时间的差小于access_token的有效期,则有效
  if(($token_file) && ()-($token_file)<$life_time){
  //得到内容
  return ($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);
  //写入文件
  ($token_file, $result_obj->access_token);
  return $result_obj->access_token;
  }
  

  因为这是写在一个类里面的,appid和appsecret都已经初始化好,所以直接用了它的属性。
  2、获取到了access_token后,想要生成二维码,还需要获取ticket
  ticket又是撒?这就像你网上买票,网站发给你的一个取票码,然后你拿这个取票码再去取票。同理,我们这里要获取也要先得到ticket,然后再去获取二维码图片。
DSC0001.png

  

        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,$result);
  }else{
  ('Content-Type:image/jpeg');
  echo $result;
  }
  }
  

  最后我们只需要实例化定义的类,传入appid和appsecret,然后调用getQRCode就可以获取到二维码了。
  源码下载:https://github.com/Ivanlovening/wechat

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-430207-1-1.html 上篇帖子: PHP的数据库连接mysqli遍历示例 下篇帖子: PHP curl传输json数据及接收
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表