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

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

背景

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

一、开发须知

1.概念区分

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

2.归纳整理

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

3.典型问题

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

所以:当你出现这种情况,可以参考下面的指导进行 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.简要引导

  • 根据在下的需求,选择了“网站应用开发” 的创建,然后按照官方提示进行材料的申请,一般需要三天以上
  • 可以注意到,网站应用开发 的简要功能介绍
  • 当应用创建通过后,必须还要满足接口权限的获取,会有工作人员主动联系,一般一天就能完成

2.官方提供的场景参考

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

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

4.授权获取 access_token 时序图

三、代码实现

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

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.前端显示

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

  • 扫描登录成功后进行页面跳转

四、总结

  • 小程序官方提供了 UnionID机制说明,可进行对比参考
  • 网上看到一篇不错的文章,建议参考:微信公众号用户与网站用户的绑定方案
  • 总结小点:
  • 1.根据上面功能实现的最后,可以获取登录用户的信息,而其中的 openIDUnionID 可存储数据库进行后期业务的处理.
  • 2.在下阐述能力有限,建议多参考官方开发文档,谷歌前辈的干货经验…

附录

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP微信开发技巧汇总》、《php curl用法总结》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《PHP中json格式数据操作技巧汇总》及《PHP针对XML文件操作技巧总结》

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

(0)

相关推荐

  • PHP后台实现微信小程序登录

    微信小程序官方给了十分详细的登陆时序图,当然为了安全着想,应该加上签名加密. 微信小程序端 1).调用wx.login获取 code . 2).调用wx.getUserInfo获取签名所需的 rawData , signatrue , encryptData . 3).发起请求将获取的数据发送的后台. login: function(e) { var that = this; wx.login({ success: function(res){ var code = res.code; //获取

  • php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)

    怎么调用微信高级接口 微信高级接口和微信普通接口的区别 后台服务器可以调用微信的接口与微信用户进行讯息的通信,这样的行为就是在调用微信的接口,这些接口是基础接口,你不需要任何付费行为或者身份认证行为就可以调用.但是有一些高级接口,你的微信公众号必须达到一定的权限如通过微信认证才能调用自定义菜单.微信支付等高级功能. 不过微信公众帐号的测试号系统可以应用这些高级接口(微信支付等涉及交易的接口除外). 微信高级接口的调用 微信高级接口的调用需要先调用一个token_access接口,只有先调用这个接

  • php的laravel框架快速集成微信登录的方法

    本文面向的是php语言laravel框架的用户,介绍的是基于该框架实现的一个简易集成微信登录的方法.使用方法如下: 1. 安装php_weixin_provider 在项目下运行composer require thirdproviders/weixin,即可完成安装.安装成功后,在项目的vendor目录下应该能看到php_weixin_provider的库文件: 2. 配置微信登录的参数 一共有7个参数可以配置,分别是: client_id:对应公众号创建的应用appid client_sec

  • 微信小程序 PHP生成带参数二维码

    微信小程序 PHP生成带参数二维码 官方获取小程序页面API 由于小程序参数二维码API提供的帮助有限,以下是我对该功能的一些理解 我主要是通过thinkphp后台接口实现,代码如下: 1.先获取ACCESS_TOKEN: $tokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".

  • PHP版微信第三方实现一键登录及获取用户信息的方法

    本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要"服务号"才可以哦,所以必须到官方申请. 一开始你需要进入微信公众平台开启开发模式,并且填写oauth2的回调地址,地址填写你项目的域名就可以了.比如:www.baidu.com或zhidao.baidu.com.如果你的项目在二级域名就写二级域名 前端url授权地址,在url中填写appid与你项目中方法中的oauth的地址,具体在下面的代码中可以

  • php微信开发之批量生成带参数的二维码

    带参数的二维码对于渠道营销推广来说是很有用的,可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送,可喜的是微信开通了这个接口,那下面就来研究一下吧.  具体接口说明请参见,微信公众平台开发者文档(http://mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html) ,我这里就直接上代码.  演示图: 由于带参数二维码生成是有限的,所有我是按编号生成的,下次生成的时候直接累加. 另外带设置有备注,方便以后统

  • PHP Curl模拟登录微信公众平台、新浪微博实例代码

    使用curl之前先打开curl配置,具体方式百度一下就知道,开启curl扩展.密码用md5加密,这是经过测试成功的,把用户跟密码改成你的就行了. 下面一段代码给大家介绍php使用curl模拟登录微信公众平台,具体代码如下所示: <?php //模拟微信登入 $cookie_file = tempnam('./temp','cookie'); $login_url = 'https://mp.weixin.qq.com/cgi-bin/login'; $pwd = md5("********

  • PHP实现微信小程序人脸识别刷脸登录功能

    首先我们先确认我们的百度云人脸库里已经上传了我们的个人信息照片 然后我们在后台写刷脸登陆的接口login我们要把拍照获取的照片存储到服务器 public function login(){ // 上传文件路径 $dir = "./Uploads/temp/"; if(!file_exists($dir)){ mkdir($dir,0777,true); } $upload = new \Think\Upload(); $upload->maxSize = 2048000 ;//

  • PHP实现的微信公众号扫码模拟登录功能示例

    本文实例讲述了PHP实现的微信公众号扫码模拟登录功能.分享给大家供大家参考,具体如下: PHP微信公众号扫码模拟登录功能 功能只是将:https://github.com/huanz/wechat-mp-hack 改成PHP实现罢了. 之前有个休闲豆每日晨报订阅号每天定时群发消息,去年微信突然要求一定要扫码授权才能登录,FK,然后就放弃了,前几天看到早有人使用程序扫码登录,获取token,cookie自动群发了,闲着也是闲着,就将js改成php实现了登录功能. 主要流程如下 1,先访问https

  • PHP微信PC二维码登陆的实现思路

    一.思路: 思路关键在于如何与微信端交互起来,毕竟目前微信登录只能是在微信端. 但是微信有一个特殊的方法用于生成自定义的二维码,这就让我们能够在PC上显示二维码,而二维码的值可以是我们定义的.另外看微信开发文档中存在一个scan事件,可以检测用户使用微信扫描二维码并获取值.其实问题的关键就在于这个值,这个值算是一个联通PC和微信的通信ID了. 二.具体实现流程(下面代码使用了TP5的框架,有个大前提是存在一个服务号的公众号) 1.生成PC端的二维码: 代码如下: 控制器: namespace a

  • php版微信自动登录并获取昵称的方法

    本文实例讲述了php版微信自动登录并获取昵称的方法.分享给大家供大家参考,具体如下: 微信自动登录并获取昵称是可以通过api接口来获取的也是通过微信开放的接口来实现了,下面我们一起来看一个例子 仅记录:微信获取昵称自动登录 经过反复几次验证,发现我这个方法有缺陷: 微信内 未关注进入网站,无法获得昵称. 关注后用我这个方法可以获得昵称. 是否是因为第一次生成openid 所以还未生成昵称?待测试. /** * 获取当前页面完整URL地址 */ function get_url() { $sys_

随机推荐