zoukankan      html  css  js  c++  java
  • 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.

    微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法.

    今天讲讲利用微信oauth2实现第三方登陆的实现方法.

    先说说前提吧!

    首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了!

    一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名

    前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以看到.

    <ahref="https://open.weixin.qq.com/connect/oauth2/authorize?appid=appid&redirect_uri=http://www.xxxxxx.com/action/function/oauth2&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">授权</a>

    再说后台逻辑,首先调用微信接口的SDK.(后面会有)

    include('./Card/Common/class_weixin_adv.php');

    之后填入微信官方给的的appid与secret

    $weixin=new class_weixin_adv("appid", "secret");

    初始化SDK的类,取到code,利用获取到的code在获取出openid 看下面代码注释!

    $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=secret&code=".$_GET['code']."&grant_type=authorization_code";
    $res = $weixin->https_request($url);//调用SDK方法获取到res 从中可以得到openid
    $res=(json_decode($res, true));//转换成array 方便调用openid

    继续调用SDK方法,获取到用户信息.此时$row已经获得用户信息了 可以var_dump下看看键值方便存入数据库

    $row=$weixin->get_user_info($res['openid']);

    获取用户信息就大功告成了,但这还不够.我们需要的是无需注册!所以需要利用openid,openid属于唯一凭证,每个用户对不同的公众号都有不同的openid.可以理解成用户账号的感觉.我这里用的是把openid存入cookie的解决方案,类似用户登陆的感觉,一些关键数据验证只需要与数据库中的openid进行对比.其他的一些利用方法可以发挥大家的想象!可以跟我留言交流!

    关于之前的a链接的授权,大家也可以判断cookie是否存在openid,从而让未授权用户直接跳转到该地址,省却了用户的一步操作.

    下面是完整逻辑代码,大家可以参考下!

         public function oauth2(){
           include('./Card/Common/class_weixin_adv.php');
          $weixin=new class_weixin_adv("appid", "secret");
          if (isset($_GET['code'])){
            $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=appid&secret=secret&code=".$_GET['code']."&grant_type=authorization_code";
            $res = $weixin->https_request($url);
            $res=(json_decode($res, true));
            $row=$weixin->get_user_info($res['openid']);
            
            if ($row['openid']) {
               //这里写上逻辑,存入cookie,数据库等操作
              cookie('weixin',$row['openid'],25920000);
               
            }else{
              $this->error('授权出错,请重新授权!');
            }
          }else{
            echo "NO CODE";
          }
          $this->display();
        }
    

    SDK代码:微信官方有手册,我就不多讲了,自己研究,很简单的!.

    <?php
    /**
     * 微信SDK 
     * pan041ymail@gmail.com
     */
    class class_weixin_adv
    {
      var $appid = "";
      var $appsecret = "";
      //构造函数,获取Access Token
      public function __construct($appid = NULL, $appsecret = NULL)
      {
        if($appid){
          $this->appid = $appid;
        }
        if($appsecret){
          $this->appsecret = $appsecret;
        }
        $this->lasttime = 1395049256;
        $this->access_token = "nRZvVpDU7LxcSi7GnG2LrUcmKbAECzRf0NyDBwKlng4nMPf88d34pkzdNcvhqm4clidLGAS18cN1RTSK60p49zIZY4aO13sF-eqsCs0xjlbad-lKVskk8T7gALQ5dIrgXbQQ_TAesSasjJ210vIqTQ";
        if (time() > ($this->lasttime + 7200)){
          $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->appsecret;
          $res = $this->https_request($url);
          $result = json_decode($res, true);
          
          $this->access_token = $result["access_token"];
          $this->lasttime = time();
        }
      }
    //获取用户基本信息
      public function get_user_info($openid)
      {
        $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$this->access_token."&openid=".$openid."&lang=zh_CN";
        $res = $this->https_request($url);
        return json_decode($res, true);
      }
    
    //https请求
      public function https_request($url, $data = null)
      {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
          curl_setopt($curl, CURLOPT_POST, 1);
          curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
      }
    }
    

    转载请注明出处:http://home.cnblogs.com/u/p-0day/

  • 相关阅读:
    【题解】 bzoj2748 [HAOI2012]音量调节 (动态规划)
    【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)
    【题解】 bzoj1864: [Zjoi2006]三色二叉树 (动态规划)
    【题解】 [ZJOI2006]书架 (Splay)
    【题解】 [HNOI2004]宠物收养场(Splay)
    【题解】 [HNOI2002]营业额统计 (Splay)
    【题解】 [ZJOI2008] 泡泡堂(贪心/二分图/动态规划)
    【题解】 [SDOI2009] Elaxia的路线(最短路+拓扑排序)
    Aptana Studio 3 如何汉化,实现简体中文版
    js中获得当前时间是年份和月份
  • 原文地址:https://www.cnblogs.com/archoncap/p/5130646.html
Copyright © 2011-2022 走看看