PHP实现网站应用微信登录功能详解


Posted in PHP onApril 11, 2019

本文实例讲述了PHP实现网站应用微信登录功能。分享给大家供大家参考,具体如下:

背景

  • 近期进行 PC 端的网站开发,需要用到微信授权登录,考虑到前期手机端已经获得了大量的微信用户群,现在想着进行资源整合,满足同一个微信用户的数据同步

一、开发须知

1.概念区分

  • 因为接触到微信开发的知识,必然会接触 OpenIDUnionID 的使用,以下为微信官方文档的的介绍,请注意区分:
  • 在关注者与公众号产生消息交互后,公众号可获得关注者的 OpenID(加密后的微信号,每个用户对每个公众号的 OpenID 是唯一的。对于不同公众号,同一用户的 OpenID 不同)。
  • 公众号可通过相应接口来根据 OpenID 获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。
  • 请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用 UnionID 机制来满足上述需求。
  • 简单概括来讲:
  • OpenID 是普通用户的标识,对当前开发者帐号唯一。一个 OpenID 对应一个公众号。
  • UnionID 是用户统一标识。针对一个 微信开放平台帐号 下的应用,同一用户的 UnionID 是唯一的。

2.归纳整理

  • 绕了这个圈,也就是说,微信公众号开发与微信开发平台开发是有差别的
  • 想让同一个微信用户使用不同平台(如PC端、app、微信小程序等)的网站登录,需要进行账号绑定,而这个绑定的账号不能以 OpenID 区分,而需要用 UnionID 区分。

3.典型问题

  • 附录一个常见的设计问题,主要在于开发前的知识使用不够全面,而造成后续拓展的影响,当然,这也是我遇到的问题,希望可以给各位敲个警钟。

PHP实现网站应用微信登录功能详解

所以:当你出现这种情况,可以参考下面的指导进行 unionID 数据的后期获取 获取用户基本信息(UnionID机制)

  • 个人参考代码如下:
/**
   * 根据用户已获得的 openID 获取其他信息 (主要为 unionID)
   */
  public function getUnionidByOpenid($openID = ''){
    $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="
      .$this->getaccesstoken()
      ."&openid=".$openID."&lang=zh_CN";
    $jsonRes = $this->http_get($url);
    if ($jsonRes){
      $arrRes = json_decode($jsonRes, true);
      return $arrRes['unionid'];
    }else{
      return '';
    }
  }

二、微信开放平台操作

  • 登录 微信开放平台

1.简要引导

  • 根据在下的需求,选择了“网站应用开发” 的创建,然后按照官方提示进行材料的申请,一般需要三天以上
    PHP实现网站应用微信登录功能详解

  • 可以注意到,网站应用开发 的简要功能介绍
    PHP实现网站应用微信登录功能详解

  • 当应用创建通过后,必须还要满足接口权限的获取,会有工作人员主动联系,一般一天就能完成
    PHP实现网站应用微信登录功能详解

2.官方提供的场景参考

PHP实现网站应用微信登录功能详解

3.绑定公众账号/小程序

为了保证同一个开发账号下对应微信用户的 UnionID 绑定使用,需要在下面的列表中绑定对应的公众号/服务号,文档中介绍一般要满足微信支付功能

PHP实现网站应用微信登录功能详解

4.授权获取 access_token 时序图

PHP实现网站应用微信登录功能详解

三、代码实现

  • 其实,主要的时间都花费在了前期的申请操作上,而真正的代码实现却是极为简单,以下是我的实现方式,敬请指摘

1、公共文件配置

  • 习惯主要的配置信息同意放在了配置文件中,‘\Application\Common\Conf\config.php'。
'WEIXIN_LOGIN' => array(
    // 微信开放平台 使用微信帐号登录App或者网站 配置信息
    'OPEN_APPID' => 'wxbd961b2a6b7b2963', //应用 AppID
    'OPEN_APPSECRET' => 'e6xxxxxxxxxxxxxxxxxxxxe90',//应用 AppSecret
    'OPEN_CALLBACKURL' => 'http://www.52zhenmi.com/Home/Login/wxBack', //微信用户使用微信扫描二维码并且确认登录后,PC端跳转路径
  ),

2.核心代码

  • 具体代码,请参考路径 “zmPro\Application\Home\Controller\LoginController.class.php”
public function wxIndex(){
    //--微信登录-----生成唯一随机串防CSRF攻击
    $state = md5(uniqid(rand(), TRUE));
    $_SESSION["wx_state"]  =  $state; //存到SESSION
    $callback = urlencode($this->callBackUrl);
    'https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect';
    $wxurl = "https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid="
        .$this->appID."&redirect_uri="
        .$callback."&response_type=code&scope=snsapi_login&state="
        .$state."#wechat_redirect";
    header("Location: $wxurl");
  }

  public function wxBack(){
    if($_GET['state']!=$_SESSION["wx_state"]){
      echo 'sorry,网络请求失败...';
      exit("5001");
    }
    $url='https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appID.'&secret='.$this->appSecret.'&code='.$_GET['code'].'&grant_type=authorization_code';
    $arr = curl_get_contents($url);
    //得到 access_token 与 openid
    $url='https://api.weixin.qq.com/sns/userinfo?access_token='.$arr['access_token'].'&openid='.$arr['openid'].'&lang=zh_CN';
    $user_info = curl_get_contents($url);
    $this->dealWithWxLogin($user_info);
  }

  /**
   * 根据微信授权用户的信息 进行下一步的梳理
   * @param $user_info
   */
  public function dealWithWxLogin($user_info){
    //TODO 数据处理
    var_dump($user_info);
    die;
  }

3.前端显示

  • 根据官方文档的介绍,既可以直接访问授权扫码界面,也可以进行自定义设计
  • 估计本人脑抽,嵌套登录扫码的功能整了半天也没实现,在此只好使用默认跳转。

PHP实现网站应用微信登录功能详解

  • 通过点击上图中的微信图标,直接跳转如下链接
    https://https://blog.csdn.net/u011415782/article/details/open.weixin.qq.com/connect/qrconnect?appid=wxbd961b2a6b7b2963&redirect_uri=http%3A%2F%2Fwww.52zhenmi.com%2FHome%2FLogin%2FwxBack&response_type=code&scope=snsapi_login&state=204b244a5051207d1987a95f4a7e42c1#wechat_redirect

  • 显示效果如下:

PHP实现网站应用微信登录功能详解

  • 扫描登录成功后进行页面跳转
    PHP实现网站应用微信登录功能详解

四、总结

  • 小程序官方提供了 UnionID机制说明,可进行对比参考
  • 网上看到一篇不错的文章,建议参考:微信公众号用户与网站用户的绑定方案

  • 总结小点:

  • 1.根据上面功能实现的最后,可以获取登录用户的信息,而其中的 openIDUnionID 可存储数据库进行后期业务的处理.
  • 2.在下阐述能力有限,建议多参考官方开发文档,谷歌前辈的干货经验…

附录

  • 源代码参考

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

PHP 相关文章推荐
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
有关php运算符的知识大全
Nov 03 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 PHP
PHP实现多图片上传类实例
Jul 26 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
php中session与cookie的比较
Jan 27 PHP
PHP实现加强版加密解密类实例
Jul 29 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
使用PHP反射机制来构造"CREATE TABLE"的sql语句
Mar 21 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 #PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
Apr 10 #PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 #PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 #PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
Apr 10 #PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 #PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 #PHP
You might like
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
php格式化电话号码的方法
2015/04/24 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
js性能优化技巧
2015/11/29 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
python基础教程之匿名函数lambda
2017/01/17 Python
Python判断文件或文件夹是否存在的三种方法
2017/07/27 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
用Django写天气预报查询网站
2018/10/21 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python数据化运营的重要意义
2019/11/25 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
基于python代码批量处理图片resize
2020/06/04 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
举例说明类变量和实例变量的区别
2016/06/30 面试题
面料业务员岗位职责
2013/12/26 职场文书
高级编程求职信模板
2014/02/16 职场文书
运动会入场词50字
2014/02/20 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
师德师风自查材料
2014/10/14 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
2015年中个人总结范文
2015/03/10 职场文书
2015教师节通讯稿
2015/07/20 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
2022/04/24 Python