PHP版微信第三方实现一键登录及获取用户信息的方法


Posted in PHP onOctober 14, 2016

本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法。分享给大家供大家参考,具体如下:

注意,要使用微信在第三方网页登录是需要“服务号”才可以哦,所以必须到官方申请。

一开始你需要进入微信公众平台开启开发模式,并且填写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'],25920);
    }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;
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
关于PHP中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
强烈推荐:php.ini中文版(2)
Oct 09 PHP
for循环连续求和、九九乘法表代码
Feb 20 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
解析zend studio中直接导入svn中的项目的方法步骤
Jun 21 PHP
解析PHP中intval()等int转换时的意外异常情况
Jun 21 PHP
php ios推送(代码)
Jul 01 PHP
学习php分页代码实例
Oct 24 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
php微信公众账号开发之前五个坑(一)
Sep 18 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
php版银联支付接口开发简明教程
Oct 14 #PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 #PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 #PHP
thinkphp分页实现效果
Oct 13 #PHP
php实现图片以base64显示的方法
Oct 13 #PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 #PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
Oct 13 #PHP
You might like
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
js运动应用实例解析
2015/12/28 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
pyramid配置session的方法教程
2013/11/27 Python
Python是编译运行的验证方法
2015/01/30 Python
Python3实现从文件中读取指定行的方法
2015/05/22 Python
python使用电子邮件模块smtplib的方法
2016/08/28 Python
Python实现读取json文件到excel表
2017/11/18 Python
python线程中同步锁详解
2018/04/27 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
python读取和保存图片5种方法对比
2018/09/12 Python
django-filter和普通查询的例子
2019/08/12 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
Python sql注入 过滤字符串的非法字符实例
2020/04/03 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
python开发入门——列表生成式
2020/09/03 Python
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
STP的判定过程
2012/10/01 面试题
竞选副班长演讲稿
2014/04/24 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
525心理健康活动总结
2015/05/08 职场文书
运动员加油词
2015/07/18 职场文书
七年级作文之游记
2019/12/11 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python