微信授权登录(PHP)

微信授权
OAuth2.0授权
微信网页授权

主要是在项目中遇到网页授权登录这个需求,就对此做些总结记录。

OAuth2.0授权
OAuth是一个开放协议,允许用户让第三方应用以安全且标准的方式获取该用户在某一网站、移动或桌面应用上存储的个人信息,而无需将用户名和密码提供给第三方应用。常见微信、QQ登录,省去管理账户的麻烦,也不会造成用户的流失。

打开微信的官方文档,会看到网页授权一些说明。(有点摸不着头脑,主要是当时没能关联起来,微信文档每次看都那么郁闷!!!)

来了解下授权的模式,官方说的详细(这得仔细阅读下):
关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

实现思路

101637543016285
  1. 在微信公众号中设定网页授权域名;
  2. 用户打开登录页,进入网页授权页面url;
  3. 微信询问用户是否同意授权给微信公众号;(snsapi_base 静默授权无此步骤,并且此模式snsapi_userinfo需关注微信公众号)
  4. 用户同意授权(snsapi_base静默授权直接默认同意)
  5. 回调code,带code参数请求微信,换取网页授权access_token(此步获取openid,微信用户的唯一标识)
  6. 通过【获取用户基本信息】接口,参数access_token(和上面的不同,普通的access_token)和openid,判断是否绑定微信公众号,未绑定,跳转绑定页。(此步骤snsapi_base无需,当然这个步骤可以去掉,视情况而定,像我项目就有这要求,唉)
  7. 将openid带入登录页,商户服务器检测当前openid是否存在数据库用户记录中
  8. 不存在openid记录,登录用户,商户服务器将openid存入用户表中;(存在openid记录跳过此步骤)
  9. openid记录存在,则拉取用户信息,存入会话,完成登录;

以上是本人实际项目中的做法,除此之外我们的接口做了签名验证,有一定安全性。仅供参考,总觉得有更好的思路,希望大家指出。

话不多说,贴出实现逻辑代码:
商户端登录

  public function actionLogin()
{
session_start();
$_SESSION['openid'] = empty( $_SESSION['openid'] ) ? $_GET['openid'] : $_SESSION['openid'];
if(!$_GET['openid']){
$this->apiget('WeixinServer/ScopeRedirectUriAppid',array('sign'=>$this->sign,'sourcetype'=>7,'data' => ''));
header("Location:".Yii::app()->params['apipath'].'/WeixinServer/ScopeRedirectUriAppid?sign='.$this->sign.'&sourcetype=7' );
exit;
}
if($_SESSION['openid']){
//判断绑定公众号
$jssdk = new JSSDK();
$access_token = $jssdk->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$_SESSION['openid']}&lang=zh_CN";
$UserInfo = json_decode($this->dogetCurl($url),1);
if( empty($UserInfo['subscribe']) ){
//跳转关注页
header("Location:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA3Mzg2MjMyNw==&scene=124#wechat_redirect" );
die;
} //微信登录
$WeixinLogin = $this->apiget('WeixinServer/WeixinLogin', array('sign'=>$this->sign,'sourcetype'=>7,'openid'=>$_SESSION['openid']));
if( $WeixinLogin['error']==1){
return $this->render($this->act);
}
$this->WeinxinLogin($WeixinLogin);
die;
}
$this->render($this->act);
} ##微信授权成功 写入session,跳转首页
public function WeinxinLogin( $data=array() ){
$_SESSION['user'] = $data['data']; $this->redirect('/index/index');
} ##curl请求
public function apiget($path, $param=array()){
$url = Yii::app()->params['apipath'].$path;
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERAGENT, '3'); //User-Agent
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $param);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($curl);
curl_close($curl);
$j = json_decode($return, 1);
return $return;
}

WeixinServer 处理微信授权

<?php

class WeixinServerController extends Controller
{
public function __construct()
{
//todo 验证签名
} public function error($msg){
header("Content-type: application/json");
$o['time'] = "".time();
$o['error'] = '1';
$o['errorMsg'] = $msg;
echo json_encode($o);die;
} public function Login($user=array()){
//todo 获取用户信息 } ##=====================================微信授权========================================##
##微信授权登录
public function actionWeixinLogin(){
if( empty($_POST['openid']) ) $this->error('openid为空');
//todo 通过openid查询用户
$user = DB::get_one("SELECT * FROM {{user}} WHERE openid='{$_POST['openid']}' ");
if( !$user )$this->error('openid不存在');
$userinfo = $this->Login($user['uid']);
$this->out($userinfo);
} ##微信授权 获取code
public function actionScopeRedirectUriAppid( ){
$APPID = "XXXXXXXXXXXX";
$REDIRECT_URI= 'http://'.$_SERVER['HTTP_HOST'].'/WeixinServer/WeixinOpenidCallback';
$scope='snsapi_base'; //手动授权snsapi_userinfo 静默授权snsapi_base $url='https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$APPID.'&redirect_uri='.urlencode($REDIRECT_URI).'&response_type=code&scope='.$scope.'&state=scene#wechat_redirect';
header("Location:{$url}" );
} ##微信回调,获取openid
public function actionWeixinOpenidCallback(){
if( $code= Yii::app()->request->getParam('code') ){
$APPID = "XXXXXXXXXXXX";
$SECRET = "XXXXXXXXXXXX";
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$APPID}&secret={$SECRET}&code={$code}&grant_type=authorization_code";
$UserOpenidArr = json_decode($this->dogetCurl($url),1);
if( empty($UserOpenidArr ['openid']) ) {
print_r( $UserOpenidArr );
die();
}
header("Location:http://XXXXXXXX/index/login?openid={$UserOpenidArr ['openid']}" );
}else{
die("微信授权失败");
}
} public function dogetCurl( $url ='' )
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt ( $ch, CURLOPT_HTTPHEADER, array( 'Connection: Keep-Alive', 'Keep-Alive: 300' ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close ( $ch );
return $data;
} }

代码结合实现思路,大致思想清楚就好实现了,希望对大家有帮助(代码写的烂,将就看吧)。

—— 路漫漫其修远兮 吾将上下而求索

微信授权登录(PHP)的更多相关文章

  1. 微信公众平台开发——微信授权登录(OAuth2.0)

    1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...

  2. [转] Android:微信授权登录与微信分享全解析

    https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...

  3. 【第二十一篇】手C# MVC 微信授权登录 OAuth2.0授权登录

    首先一定要熟读,最起码过一遍微信开发者文档 微信开发者文档 文档写的很清楚 授权登录四步走 在正文开始前,我得讲清楚一个事情 敲黑板,划重点:微信一共有两个 access_token 一个是7200就 ...

  4. .net core identity集成微信授权登录

    最快的方式是直接nuget安装AspNetCore.Authentication.WeChat包. 想要知道是如何实现的,可以看下面github上面的源码. 源码在这里:https://github. ...

  5. 微信授权登录mock(在没有真实微信账号的情况下测试大量微信账户授权登录的情况)

    场景介绍 对于构建在微信公众号的系统,帐号体系往往使用微信授权登录(如各类微信商城应用系统). 这样操作不仅可以实现静默注册,对用户几乎是无感的,同时也达到了区分用户,获取用户基本信息(头像,昵称等) ...

  6. wap2app(五)-- 微信授权登录以及踩过的坑

    应用场景是:用Hbuilder打包app,在app中点击微信授权登录或者某一操作,调起微信授权登录,用户授权后拿到用户信息. 一.登录插件配置 先配置微信登录参数 appid和appsecret,在m ...

  7. VUE开发SPA之微信授权登录

    SPA单页应用中微信授权登录的一点思路 单页应用应该如何解决微信授权登录的尴尬跳转?后退无法返回?主要遇到的问题就是 先进入单页应用,一边渲染页面一边判断用户有没有登录,当判断到没有登录时异步数据请求 ...

  8. Android接入微信SDK之一:发起微信授权登录

    1.重要的事情首先说! 包名.应用签名.app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功. 包名:就是在腾讯上申请的包名 应用签名:使用微信官网提供的<签名生成工具>(这个 ...

  9. 微信授权登录,关于调不起授权页面,无法响应回调方法,获取不到code 详解

    前期准备工作:申请AppId,下载资源包jar.文档等. 微信授权登录步骤: 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据c ...

随机推荐

  1. SQL Server pivot 行转列遇到的问题

    前段时间开发系统时,有个功能是动态加载列,于是就使用了SQL Server自带的PIVOT函数进行行转列,开始用的非常溜,效果非常好.但是提交测试后问题来了,测试添加的列名中包含空格,然后就杯具了,功 ...

  2. Linux下memcache的安装和启动测试

    memcache是一套分布式的高速缓存系统,MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作:如果请求的数据不在me ...

  3. poj1011 搜索+剪枝

    DFS+剪枝 POJ2362的强化版,重点在于剪枝 令InitLen为所求的最短原始棒长,maxlen为给定的棒子堆中最长的棒子,sumlen为这堆棒子的长度之和,那么InitLen必定在范围[max ...

  4. 深入理解JAVA序列化

    如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类序列化的问题.静 ...

  5. HDFS 架构简述

    HDFS 架构简述 Hadoop分布式文件系统(HDFS)是一个分布式的文件系统,运行在廉价的硬件上.它与现有的分布式文件系统有很多相似之处.然而与其他的分布式文件系统的差异也是显着的.HDFS是高容 ...

  6. 使用Java语言开发微信公众平台(七)——音乐消息的回复

    在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...

  7. 纯CSS图片缩放后显示详细信息

    哎~!突然好久没更新博客了,最近总在下雨,晚上也经常没有时间来管理博客(目前在敲自己的一个平台,晢时还在写逻辑层的代码),好吧!废话不多说了,言归正传. 现在很多图片缩放的特效大多数都是用javasc ...

  8. 使用javascript生成当前博文地址的二维码图片

    前面的话 在电脑端发现一篇好的博文,想在手机上访问.这时,就必须打开手机浏览器输入长长的URL地址才行,非常不方便.如果在博客标题的后面跟一张小的图片,点击该图片后,出现一张二维码的大图,然后再通过手 ...

  9. [开源] 基于ABP,Hangfire的开源Sharepoint文件同步程序----SuperRocket.SPSync

    (一)项目背景 Sharepoint是微软的一个产品,很多公司都在使用它,也有很多公司以前使用它,现在可能需要移植到别的平台,也可能只是移植其中的文件存储,比如说移植到微软云,或者亚马逊云存储.Sup ...

  10. 第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)

    前言 这部分也许是数据预处理最为关键的一个阶段. 如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析. 本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA),并给 ...