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 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
完美实现GIF动画缩略图的php代码
Jan 02 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
跟我学Laravel之路由
Oct 15 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 PHP
php框架知识点的整理和补充
Mar 01 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微信支付通知的处理方式
2014/05/25 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
JS中的模糊查询功能
2019/12/08 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
vue+openlayers绘制省市边界线
2020/12/24 Vue.js
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
Python卸载模块的方法汇总
2016/06/07 Python
Python中return self的用法详解
2018/07/27 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
为什么使用接口?
2014/08/13 面试题
县优秀教师事迹材料
2014/01/31 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
爱心捐助倡议书
2014/05/19 职场文书
事业单位考核材料
2014/05/21 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
车辆管理制度范本
2015/08/05 职场文书