微信的授权登录和QQ、新浪等平台的授权登录都大同小异,均采用OauthOAuth2.0鉴权方式。

微信授权分为两种:静默授权

弹窗授权,需要用户手动同意

两种scope的区别说明以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

具体而言,网页授权流程分为四步:引导用户进入授权页面同意授权,获取code

通过code换取网页授权access_token(与基础支持中的access_token不同)

如果需要,开发者可以刷新网页授权access_token,避免过期

通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

以下是封装的微信操作类,需要用到两个数据表,用于保存access_token、ticket,由于他们具有一定有效期,且每天请求数有上限,所以开发者需自行保存<?php

/**

*   微信操作表

*   wxtoken 表结构

*   id

*   access_token

*   addtime

*   wxticket 表结构

*   id

*   ticket

*   addtime

*/

class WX {

private $appid;

private $appserect;

private $curl;

private $msg;

protected $errs = array(

'-1' => '系统繁忙,此时请开发者稍候再试',

'0' => '请求成功',

'40001' => 'AppSecret错误或者AppSecret不属于这个公众号,请开发者确认AppSecret的正确性',

'40002' => '请确保grant_type字段值为client_credential',

'40164' => '调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置。',

);

function __construct($appid, $appserect) {

$this->appid = $appid;

$this->appserect = $appserect;

$this->curl = new Curl();

}

/*

微信网页授权登录  需要在公众号设置 - 功能设置 - 网页授权域名

第一步:用户同意授权,获取code

scope : snsapi_base 只能获取openid 直接跳转

snsapi_userinfo

*/

public function getCode($redirect_uri, $scope = 'snsapi_userinfo', $state = '1') {

$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&state={$state}#wechat_redirect";

header("Location:{$url}");

exit;

}

/*

第二步:通过code换取网页授权access_token

*/

public function getAccessTokenByCode($code) {

$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->appserect}&code={$code}&grant_type=authorization_code";

// exit($url);

// $curl = new Curl();

$result = $this->curl->doGet($url);

if (!$result) {

// $this->curl->getError()

$this->msg = "获取token失败";

return false;

}

$result = json_decode($result, true);

if ($result['errcode']) {

$this->msg = $result['errmsg'];

return false;

}

return $result;

}

// 第三步:刷新access_token(如果需要) 通过code 获取openid $type 0静默授权 1弹窗授权

public function getUserInfo($code, $type = 0, $lang = 'zh_CN ') {

$result = $this->getAccessTokenByCode($code);

if (!$result) {

return false;

}

$member = C::t(PT_USER)->getByOpenid($result['openid']);

if ($member) {

return $member;

} else {

if ($type) {

$url = "https://api.weixin.qq.com/sns/userinfo?access_token={$result['access_token']}&openid={$result['openid']}&lang={$lang}";

// $return = $this->curl->doGet($url);

// 这接口有病 强制显示文件头

$return = file_get_contents($url);

if (!$return) {

$this->msg = '获取用户信息失败';

return false;

}

$return = json_decode($return, true);

if (!$return) {

$this->msg = '获取用户信息返回失败';

return false;

}

// file_put_contents('ccc.txt',print_r($return,true),FILE_APPEND);

$data = array(

'openid' => $return['openid'],

'name' => $return['nickname'],

'sex' => $return['sex'],

'province' => $return['province'],

'city' => $return['city'],

'country' => $return['country'],

'img' => $return['headimgurl'],

'bindtel' => 0,

);

} else {

$data = array(

'openid' => $result['openid'],

'username' => "微信用户_" . random(6, 1)

);

}

$name = rand(100000, 1000000000);

$e = $name . "@qq.com";

$password = $e;

$id = UserAddEdit(0, $data['username'], $password, $e, 10, 0, "", $msg);

if ($id <= 0) {

$this->msg = $msg;

return false;

}

C::t(PT_USER)->update($data, $id);

$member = C::t(PT_USER)->get($id);

return $member;

}

}

/*

公众号 安全中心 设置IP白名单

公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

*/

public function getAccessToken($type) {

$addtime = TIMESTAMP - 7200;

$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appserect}";

$row = C::t(PT_WXTOKEN)->getNew($addtime, $type);

if ($row) {

return $row['access_token'];

} else {

$result = $this->curl->doGet($url);

if (!$result) {

$this->msg = "无法获取令牌内容";

return false;

}

$result = json_decode($result, true);

if (!$result) {

$this->msg = "解析令牌内容失败";

return false;

}

if ($result['access_token']) {

C::t(PT_WXTOKEN)->addToken($result['access_token'], $type);

return $result['access_token'];

} else {

$this->msg = "获取令牌失败";

return false;

}

}

}

// 获取js票据  需要在公众号设置 - 功能设置 - JS接口安全域名设置

public function getJsTicket() {

$addtime = TIMESTAMP - 7200;

$row = C::t(PT_WXTICKET)->getNew($addtime);

if ($row) {

return $row['ticket'];

} else {

$token = $this->getAccessToken();

if (!$token) {

return false;

}

$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi";

$result = $this->curl->doGet($url);

if (!$result) {

$this->msg = "无法获取js票据";

return false;

}

$result = json_decode($result, true);

if (!$result) {

$this->msg = "解析js票据内容失败";

return false;

}

if ($result['ticket']) {

C::t(PT_WXTICKET)->addTicket($result['ticket']);

return $result['ticket'];

} else {

$this->msg = "获取js票据失败";

return false;

}

}

}

// js sdk 票据签名 当前网页的URL,不包含#及其后面部分

public function jsSign($data) {

// 1.所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)

ksort($data);

// 2.URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1 采用原始值,不进行URL 转义

$string1 = $this->ToUrlParams($data);

// echo "string1:{$string1}
";

// 3.对string1做sha1加密

$sign = sha1($string1);

// echo "signature:{$sign}
";

return $sign;

}

// 获取消息内容

public function getMsg() {

return $this->msg;

}

/**

* 格式化参数格式化成url参数

*/

public function ToUrlParams($data) {

$buff = "";

foreach ($data as $k => $v) {

if ($k != "sign" && $v != "" && !is_array($v)) {

$buff.= $k . "=" . $v . "&";

}

}

$buff = trim($buff, "&");

return $buff;

}

}

?>

登录// 微信登录

function wxlogin() {

global $_G,$identifier,$config,$wx;

if (!$_G['uid']) {

if ($_GET['state']) {

//回调

$member = $wx->getUserInfo($_GET['code']);

if (!$member) {

exit($wx->getMsg());

}

if (!function_exists("setloginstatus")) {

include_once libfile('function/member');

}

// 设置登录状态$wx

setloginstatus($member, 2592000);

checkfollowfeed();

$_G['uid'] = $member['uid'];

$_G['member'] = $member;

} else {

//请求授权 对参数编码

$redirect = urlencode(getProtocol() . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

$wx->getCode($redirect, 'snsapi_base');

}

}

}

function getProtocol() {

return is_HTTPS() ? 'https://' : 'http://';

}

function is_HTTPS() {  if ($_SERVER['HTTPS'] === 1 || $_SERVER['HTTPS'] === 'on' || $_SERVER['SERVER_PORT'] == 443) {

return true;

}

return false;

}

微信扫码查看本文

php微信授权登录sdk,微信授权登录相关推荐

  1. 微信登录 sdk 服务器,微信登录(微信公众号授权)的开发(详解)——两三行代码的事,何必呢...

    新版重构的SDK已经开始在写了,具体的使用方法参考 新版重构的SDK已经开始在写了,具体的使用方法参考 新版重构的SDK已经开始在写了,具体的使用方法参考 新版重构的SDK已经开始在写了,具体的使用方 ...

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

    前言 在移动互联网浪潮中,联网APP已经把单机拍死在沙滩上,很多公司都希望自家应用能够有一套帐号系统,可是许多用户却并不一定买账:我凭啥注册你家应用的帐号?微博,微信,QQ几乎成了每个人手机中的必装应 ...

  3. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)...

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  4. url 微信公众号开发 配置失效_微信公众号开发之授权登录

    一.UnionId和openId 微信登录最重要的两个返回信息,一个是UnionId,一个是OpenId.两者之间有着必然的联系. UnionID机制的作用说明:如果开发者拥有多个移动应用.网站应用和 ...

  5. Php静默授权,【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)...

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  6. 微信授权绑定手机号 java_微信小程序获取手机号授权用户登录功能

    小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写. 1.getPhoneNumber这个组件通过button来实现(别的标签无 ...

  7. uniapp 微信小程序授权获取手机并绑定登录

    检查是否已登录 onLoad(option) {//检查用户是否已授权登录this.checkLogin();}, //检查用户是否登录checkLogin() {let token = wx.get ...

  8. 微信开放平台开发第三方授权登陆:微信扫码登录

    一.概述 根据需求,需要拥有第三方微信登录功能,并获取到用户信息. 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 二.前期准备工作 1.注册邮箱账号. 2.根 ...

  9. 微信公众号扫码授权登录思路

    引言 上学期研究了一下微信登录相关内容,也写了两三篇笔记,但是最后实际登录流程没有写,主要因为感觉功能完成有所欠缺,一直也没有好的思路:这两天我又看了看官方文档,重新构思了一下微信公众号登录相关的内容 ...

  10. 微信网页扫码登录与微信公众号授权登录的区别

    最近着手开发了微信网页扫码登录和公众号授权登录收获颇丰,两者的开发很类似.以下是我个人摸索过程中发现的两者的异同: 两者都可以通过微信客户端扫码授权的方式,让第三方页面获得微信用户的一些基本信息(昵称 ...

最新文章

  1. 树莓派 ROS 段错误
  2. 一款基于jquery ui的动画提交表单
  3. LPC43xx SGPIO Pattern Match Mode
  4. yum 方式安装nginx
  5. Centos 7下安装nginx,使用yum install nginx,提示没有可用的软件包(亲测)
  6. 工业串口服务器如何使用
  7. 记录一次 Ubuntu 16.04 path 错误救机
  8. struts配置json需要的jar包
  9. 爱数智慧荣获“阿里云2021年度优秀供应商” | 喜讯
  10. 化学能推进永远无法实现外星旅行
  11. 深度学习算法-YOLO
  12. 基于中国天气网的数据库设计与开发(python+MySQL)
  13. html怎么做成gif,(图解)如何制作gif动态图片
  14. 哈工大深圳计算机水平怎么样,赞!哈工大(深圳)学子在第四届“龙芯杯”全国大学生计算机系统能力培养大赛中获多个奖项...
  15. 通过CrossTalk在Delphi中使用ADO.Net(1)
  16. 车间制造管理系统(下)
  17. 步进电机低频震动问题
  18. linux源码中,.org 0x2000,ENTRY(pg1)表示的是什么意思?org是什么意思,ENTRY是什么意思啊?
  19. Java学习:IT行业是否已经开始饱和或者过剩?
  20. 关于纸质书管理APP的测评

热门文章

  1. 您需要计算机管理员提供的权限才能更改,您需要管理员权限才能删除此文件夹...
  2. 如何制作MacOS安装U盘
  3. python Craps赌博游戏
  4. LFS 11.1 arm64 meson编译失败,libffi路径错误
  5. 简单几步即可速查电脑WiFi密码,无需任何工具!
  6. web kettle 数据采集
  7. 网课python程序设计答案_中国大学MOOCPython程序设计网课答案
  8. 台式计算机快捷键大全,最常用的电脑键盘快捷键大全
  9. matlab常用开头,在MATLAB编辑中,以“”开头的表示()。
  10. 高等数学-考试常用的三角函数公式