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 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
Jun 02 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
3个PHP多维数组转为一维数组的方法实例
Mar 13 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
两个php日期控制类实例
Dec 09 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
Jun 13 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP中md5()函数的用法讲解
Mar 30 PHP
PHP反射学习入门示例
Jun 14 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
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
让Vue也可以使用Redux的方法
2018/05/23 Javascript
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
Python的迭代器和生成器
2015/07/29 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python文字转语音的实例代码分析
2019/11/12 Python
Python必须了解的35个关键词
2020/07/16 Python
python 写一个文件分发小程序
2020/12/05 Python
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
土木工程毕业生自荐信
2013/09/21 职场文书
班主任工作年限证明
2014/01/12 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
企业新年寄语
2014/04/04 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
司考复习计划
2015/01/19 职场文书
房产公证书
2015/01/23 职场文书
租车协议书
2015/01/27 职场文书
英语教师个人工作总结
2015/02/09 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python