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中对数据库操作的封装
Oct 09 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 PHP
PHP 批量更新网页内容实现代码
Jan 05 PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 PHP
PHP Curl出现403错误的解决办法
May 29 PHP
PHP 使用memcached简单示例分享
Mar 05 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
学习PHP的数组总结【经验】
May 05 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
Laravel 验证码认证学习记录小结
Dec 20 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
改造一台复古桌面收音机
2021/03/02 无线电
php array_merge下进行数组合并的代码
2008/07/22 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
javascript中的window.location.search方法简介
2013/09/02 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
2019/12/25 Javascript
python实现哈希表
2014/02/07 Python
Python argv用法详解
2016/01/08 Python
python取代netcat过程分析
2018/02/10 Python
python简单实现AES加密和解密
2019/03/28 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
C++面试题目
2013/06/25 面试题
幼儿园教师获奖感言
2014/03/11 职场文书
幼儿园秋游感想
2014/03/12 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
自主招生自荐信范文
2015/03/04 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript
JavaScript实现简单的音乐播放器
2022/08/14 Javascript