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 数组排序 array_multisort与uasort的区别
Mar 24 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
在WordPress中实现发送http请求的相关函数解析
Dec 29 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 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
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
浅谈js原生拖放
2016/11/21 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
nodejs制作爬虫实现批量下载图片
2017/05/19 NodeJs
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
ES6 Set结构的应用实例分析
2019/06/26 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
使用django-crontab实现定时任务的示例
2018/02/26 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
Python绘制股票移动均线的实例
2019/08/24 Python
韩国邮政旗下生鲜食品网上超市:epost
2016/08/27 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
财产公证书
2014/04/10 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
护理医院见习报告
2014/11/03 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
亮剑精神观后感
2015/06/05 职场文书
小学运动会报道稿
2015/07/22 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
SqlServer 垂直分表(减少程序改动)
2021/04/16 SQL Server