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代码
Sep 14 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
php+xml实现在线英文词典之添加词条的方法
Jan 23 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 PHP
Joomla简单判断用户是否登录的方法
May 04 PHP
ThinkPHP删除栏目(实现批量删除栏目)
Jun 21 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
PHP 爬取网页的主要方法
Jul 13 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 PHP
PHP实现批量修改文件名的方法示例
Sep 18 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
深入php-fpm的两种进程管理模式详解
2013/06/03 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
基于JS实现简单滑块拼图游戏
2019/10/12 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
opencv实现图像几何变换
2021/03/24 Python
学生自我鉴定范文
2013/10/04 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
公司营业员的自我评价
2014/03/04 职场文书
高中班主任评语大全
2014/04/25 职场文书
李白故里导游词
2015/02/12 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python