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

  先说说前提吧!

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

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

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

<a href="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'],);
                   
                }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 = ;
        $this->access_token = "nRZvVpDU7LxcSi7GnG2LrUcmKbAECzRf0NyDBwKlng4nMPf88d34pkzdNcvhqm4clidLGAS18cN1RTSK60p49zIZY4aO13sF-eqsCs0xjlbad-lKVskk8T7gALQ5dIrgXbQQ_TAesSasjJ210vIqTQ";         if (time() > ($this->lasttime + )){
            $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, );
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, );
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
}
 

最新文章

  1. Could not load type &#39;System.Web.Mvc.ViewPage&lt;dynamic&gt;&#39; in asp.net mvc2 after publishing the website
  2. MFC线程内获取主窗口句柄
  3. java中常用的工具类(三)
  4. Asp.net点击按钮弹出文件夹选择框的实现(网页)
  5. 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)
  6. php中alert弹出时单双引号问题
  7. UVA11149 矩阵快速幂
  8. mybatis+spring+struts2框架整合
  9. Collections.synchronizedMap 详解
  10. JavaWeb 文件上传 commons_fileupload方式
  11. ThinkPHP中的volist标签中使用eq标签出错
  12. WebRTC VoiceEngine使用简单Demo
  13. 201521123114 《Java程序设计》第8周学习总结
  14. 看一眼就学会的 HTML 小游戏搭建!
  15. 使用 coverlet 查看.NET Core应用的测试覆盖率
  16. Java Web 清除缓存
  17. ExceptionLess使用
  18. 使用Ajax的Time实现倒计时功能
  19. 四、vue语法补充
  20. XML中二进制数据的处理方法

热门文章

  1. ios严格检验身份证号码有效性
  2. LUA的编译、环境等
  3. 找出现有Vector或ArrayList或数组中重复的元素&amp;给现有Vector或ArrayList或数组去重
  4. 新浪微博客户端(3)-封装UIBarButtonItem
  5. c#之Redis实践list,hashtable
  6. C++ 中map 中迭代器的简单使用:
  7. 如何调试R程序(转载)
  8. zstu.4191: 无向图找环(dfs树 + 邻接表)
  9. cocos基础教程(11)事件分发机制
  10. Android判断网络是否连接