zoukankan      html  css  js  c++  java
  • 微信开发之微信网页授权 完整示例

    所有微信开发的相关内容,都需要参考官方文档。

    [微信公众平台|开发文档] http://mp.weixin.qq.com/wiki/home/

    一、通过网页授权,可以获取用户微信的基本信息。

    二、总共有5个步骤:

    :用户同意授权,获取code

    :通过code换取网页授权access_token

    :刷新access_token(如果需要)

    :拉取用户信息(需scope为 snsapi_userinfo)

    附:检验授权凭证(access_token)是否有效

    三、每一个步骤的实现。

    1 :用户同意授权,获取code

    1. /** 
    2.      * @explain 
    3.      * 获取code,用于获取openid和access_token 
    4.      * @remark 
    5.      * code只能使用一次,当获取到之后code失效,再次获取需要重新进入 
    6.      * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid 
    7.      **/  
    8.     public function getCode()  
    9.     {  
    10.         if (isset($_GET["code"])) {  
    11.             return $_GET["code"];  
    12.         } else {  
    13.             $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";  
    14.             header($str);  
    15.             exit;  
    16.         }  
    17.     }  


    2 :通过code换取网页授权access_token

    1. /** 
    2.      * @explain 
    3.      * 用于获取access_token,返回的<span style="font-family: Arial, Helvetica, sans-serif;">$access_token_array中也包含有用户的openid信息。</span> 
    4.  
    5.      **/  
    6.     public function getOpenId()  
    7.     {  
    8.         $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";  
    9.         $access_token_json = $this->https_request($access_token_url);  
    10.         $access_token_array = json_decode($access_token_json, TRUE);  
    11.         return $access_token_array;  
    12.     }  


    3 :刷新access_token(如果需要)

    这一步直接略过。

    4 :拉取用户信息(需scope为 snsapi_userinfo)

    1. /** 
    2.      * @explain 
    3.      * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token 
    4.      **/  
    5.     public function getUserInfo()  
    6.     {  
    7.           
    8.         $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";  
    9.         $userinfo_json = $this->https_request($userinfo_url);  
    10.         $userinfo_array = json_decode($userinfo_json, TRUE);  
    11.         return $userinfo_array;  
    12.     }  

    至此四个步骤全部完成。

    四、完整代码。实际项目使用TP3.2.3。

    1. <?php  
    2.   
    3. namespace WechatController;  
    4.   
    5. use ThinkController;  
    6.   
    7. //微信接口基础类,其他微信类都继承这个基础类。可以自动判断用户状态,获取用户信息。  
    8. class WxbaseController extends Controller  
    9. {  
    10.   
    11.     public $appid = 'wxba09d9f0fed4b84b';                   //微信APPID,公众平台获取  
    12.     public $appsecret = '332c2b1fc1eb282c0136b73723db4237'; //微信APPSECREC,公众平台获取  
    13.     public $index_url = "http://www.你的域名.cn/项目目录/index.php?m=分组&c=控制器&a=方法";  //微信回调地址,要跟公众平台的配置域名相同  
    14.     public $code;  
    15.     public $openid;  
    16.   
    17.     /**  
    18.      *检测有无$_SESSION。<span style="font-family: Arial, Helvetica, sans-serif;">如果有,直接忽略。</span>  
    19.      *如果没有$<span style="font-family:Arial, Helvetica, sans-serif;">_SESSION</span>,就依次执行getCode、getOpenId、getUserInfo来获取用户信息。目的是解决CODE只能获取一次,刷新页面openid会丢失的问题。  
    20.      *再判断是否在数据库中,没有则写入数据库。最后将open_id写入session。  
      1. <span style="white-space:pre">    </span>*/  
      2.     public function _initialize()  
      3.     {  
      4.             if (!$_SESSION['openid']) {                             //如果$_SESSION中没有openid,说明用户刚刚登陆,就执行getCode、getOpenId、getUserInfo获取他的信息  
      5.                 $this->code = $this->getCode();  
      6.                 $this->access_token = $this->getOpenId();  
      7.                 $userInfo = $this->getUserInfo();  
      8.                 if ($userInfo) {  
      9.                     $ins = M('Wechat_user_info');<span style="white-space:pre">       </span>    //其他框架请自行调整方法。  
      10.                     $map['openid'] = $userInfo['openid'];  
      11.                     $result = $ins->where($map)->find();            //根据OPENID查找数据库中是否有这个用户,如果没有就写数据库。继承该类的其他类,用户都写入了数据库中。  
      12.                     if (!$result) {  
      13.                         $ins->add($userInfo);  
      14.                     }  
      15.                     session('openid', $userInfo['openid']);         //写到$_SESSION中。微信缓存很坑爹,调试时请及时清除缓存再试。  
      16.                 }  
      17.             }  
      18.   
      19.     }  
      20.   
      21.     /** 
      22.      * @explain 
      23.      * 获取code,用于获取openid和access_token 
      24.      * @remark 
      25.      * code只能使用一次,当获取到之后code失效,再次获取需要重新进入 
      26.      * 不会弹出授权页面,适用于关注公众号后自定义菜单跳转等,如果不关注,那么只能获取openid 
      27.      **/  
      28.     public function getCode()  
      29.     {  
      30.         if (isset($_GET["code"])) {  
      31.             return $_GET["code"];  
      32.         } else {  
      33.             $str = "location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=" . $this->appid . "&redirect_uri=" . $this->index_url . "&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";  
      34.             header($str);  
      35.             exit;  
      36.         }  
      37.     }  
      38.   
      39.     /** 
      40.      * @explain 
      41.      * 用于获取用户openid 
      42.      **/  
      43.     public function getOpenId()  
      44.     {  
      45.         $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . $this->appid . "&secret=" . $this->appsecret . "&code=" . $this->code . "&grant_type=authorization_code";  
      46.         $access_token_json = $this->https_request($access_token_url);  
      47.         $access_token_array = json_decode($access_token_json, TRUE);  
      48.         return $access_token_array;  
      49.     }  
      50.   
      51.     /** 
      52.      * @explain 
      53.      * 通过code获取用户openid以及用户的微信号信息 
      54.      * @return 
      55.      * @remark 
      56.      * 获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token 
      57.      * access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s. 7200s后access_token失效 
      58.      **/  
      59.     public function getUserInfo()  
      60.     {  
      61.   
      62.         $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".$this->access_token['access_token'] ."&openid=" . $this->access_token['openid']."&lang=zh_CN";  
      63.         $userinfo_json = $this->https_request($userinfo_url);  
      64.         $userinfo_array = json_decode($userinfo_json, TRUE);  
      65.         return $userinfo_array;  
      66.     }  
      67.   
      68.   
      69.     /** 
      70.      * @explain 
      71.      * 发送http请求,并返回数据 
      72.      **/  
      73.     public function https_request($url, $data = null)  
      74.     {  
      75.         $curl = curl_init();  
      76.         curl_setopt($curl, CURLOPT_URL, $url);  
      77.         curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);  
      78.         curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);  
      79.         if (!empty($data)) {  
      80.             curl_setopt($curl, CURLOPT_POST, 1);  
      81.             curl_setopt($curl, CURLOPT_POSTFIELDS, $data);  
      82.         }  
      83.         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
      84.         $output = curl_exec($curl);  
      85.         curl_close($curl);  
      86.         return $output;  
      87.     }  
  • 相关阅读:
    css 颜色
    目标
    css单位
    自我介绍
    Grid Layout
    position
    【转】android源码分析之windowmanager (android悬浮窗口的实现)
    java线程池原理
    STM32 中断中调用freeRTOS API 需要注意的地方
    今天开通博客园啦~~~~
  • 原文地址:https://www.cnblogs.com/jett010/p/8778584.html
Copyright © 2011-2022 走看看