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

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

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

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

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

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

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

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

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

4、通过网页授权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;

}

APP微信登录后端PHP,PHP开发微信授权登录教程相关推荐

  1. 微信小游戏申请注册流程+开发微信小游戏类目需要具备条件

    微信小游戏申请注册流程+开发微信小游戏类目需要具备条件 在这里先讲一下,小程序和小游戏前面的注册流程都是一样的,在注册完毕登录小程序后台后选择类目时需要注意一下,我下面讲解的是已经通过认证的服务号进行 ...

  2. 微信公众号H5页面开发--微信JS-SDK引用

    微信公众号H5页面开发–微信JS-SDK引用 微信提供了微信公众号开发者手册,官方地址:https://mp.weixin.qq.com/ 公众号内许多复杂的业务场景,都是通过网页形式来提供服务,这时 ...

  3. 新浪微博客户端开发之授权登录+获取微博列表

    新浪微博客户端开发之授权登录+获取微博列表 闲篇: 最近实在是乱得不行,至于怎么乱我也不知该怎么说,那么久没发博客就证明了这点,一般如果小巫有做详尽的计划,并把时间投入到上面的话,我是可以用最短的时间 ...

  4. 3.2【微信小程序全栈开发课程】登录功能(一)--实现登录功能

    在本地搭建好后端环境之后,我们来实现登录功能 1.安装SDK插件 SDK插件用来获取用户的openId SDK是server端(也就是后端)的插件,帮助我们很容易的获取openId.openId是微信 ...

  5. 微信公众号开发之授权登录(前端vue篇)

    前序: 由于之前一直是后端直接调用微信授权后,拿到相关信息后再返回给我(就是以前的前后端不分离),所以对微信公众号开发的微信授权登录还一直处于懵逼情况,直到今天有一个项目需要前后端分离,要前端主动去获 ...

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

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

  7. php 微信开发 网页授权登录,微信开发网页授权登录——2018年6月2日

    微信网页授权登录用户同意授权,获取code 通过code,获取网页的access_token 拉取用户信息(scope 为snsapi_userinfo) application\index\cont ...

  8. 微信web开发工具-授权登录

    释: 我是订阅号,申请的微信开发测试账号,操作授权登录 1.  下载web开发工具 2.  在公众号列表中, 开发者工具->web开发工具-> 绑定开发者账号 ->输入你的微信号(微 ...

  9. PHP+laravel 微信开发工具授权登录详解

    微信小程序登录流程时序 废话不多说,直接上代码: html 代码 <button open-type="getUserInfo" bindtap="login&qu ...

  10. 《小程序》微信小程序绑定系统账号并授权登录之微信端

    小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系 登录流程时序 说明 调用 wx.login() 获取 临时登录凭证code ,并回传到开发 ...

最新文章

  1. ubuntu 刷 android 5.0,IT之家学院:将刷了Ubuntu Touch的魅族PRO 5恢复为安卓系统
  2. 我的Java开发学习之旅------gt;Java经典排序算法之希尔排序
  3. 关闭生成调试信息和嵌入清单
  4. 【原创】新手入门一篇就够:从零开发移动端IM
  5. 维护没有源代码的遗留 Java 项目
  6. 后端技术:数据持久化框架为什么放弃 Hibernate、JPA、Mybatis,最终选择 JDBCTemplate!...
  7. 在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展
  8. append在python里是什么意思_“一棵绿萝七个鬼”是什么意思?卧室里到底能不能养绿萝!...
  9. #include 中的stat.h文件到底在哪个目录下面?
  10. JSON中的JSON.parseArray()方法、JSON.parseObject()方法和JSON.tojsonString()方法
  11. 向量函数具有固定模的充要条件
  12. 联想小新触摸板驱动_联想笔记本触摸板驱动下载
  13. 每个人都会有的第一次
  14. 软件架构C4模型简介
  15. 快牙网传——推送通知
  16. Android app后台服务在锁屏情况下一直运行的方法
  17. gnuplot软件学习笔记
  18. 若依ruoyi-vue总结
  19. Python的基本操作
  20. 打印输入的字符串(C语言)

热门文章

  1. Mac读写NTFS驱动程序神器Tuxera NTFS2022
  2. matlab sae模型,发动机平均值模型的三篇SAE论文
  3. oracle普通索引改唯一索引,Oracle唯一索引功能替代
  4. JS设计模式 - 工厂模式
  5. 如何快速提取pdf中矢量图
  6. java 事务回滚报rollback-only异常
  7. 几款好用的敏捷开发工具
  8. 好中的计算机英文ei,电子信息类容易中的英文EI期刊有哪些
  9. SpringBoot框架下集成萤石云平台开发海康的摄像头
  10. Linux下查看日志常用命令