php实现微信小程序授权登录功能(实现流程)


Posted in PHP onNovember 13, 2019

先上图

php实现微信小程序授权登录功能(实现流程)php实现微信小程序授权登录功能(实现流程)php实现微信小程序授权登录功能(实现流程)php实现微信小程序授权登录功能(实现流程)

实现流程:

1、授权登陆按钮和正文信息放到了同一个页面,未授权的时候显示登陆按钮,已授权的时候隐藏登陆按钮,显示正文信息,当然也可以授权和正文分开成两个页面,在授权页面的onload里判断是否已授权,若已授权就直接跳转正文的页面。这里只说授权按钮和正文在同一页面的情况。

2、在onload里先判断是否已授权,如果已授权,就隐藏授权登陆按钮,显示正文信息,如果没有授权,显示授权登陆按钮。

3、前端使用button的open-type="getUserInfo"来操作,点击授权按钮之后,“e”中会携带userInfo,用户的基本信息(和使用wx.getUserInfo接口获取的数据一样,所以我是在"e"里面直接取的,没有调用wx.getUserInfo接口)

4、使用wx.login接口获取登陆凭证code,使用code去后解密换取openid,传输code的时候带上第3步获取的用户信息一块发送给后台解密(也可以不携带,携带的目的是为了验证签名,这样安全一些,不验证也可以)

5、后台解密使用的是“auth.code2Session”接口,解密用到的SDK下载地址

“https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html”。

5、后台解密之后(后台语言用的是php),会返回openid等敏感信息,就还可以把这些信息存起来了。

6、获取授权成功之后,再隐藏授权登陆按钮,显示正文信息。

7、如果用户点击拒绝授权,提示引导用户再次授权。

注意,要考虑到授权失败的情况

以下是详细代码

wxml

<view wx:if="{{isHide}}">
  <view wx:if="{{canIUse}}" >
    <view class='header'>
      <image src='/images/icon/wx_login.png'></image>
    </view>
 
    <view class='content'>
      <view>申请获取以下权限</view>
      <text>获得你的公开信息(昵称,头像等)</text>
    </view>
 
    <button class='bottom' type='primary' open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
      授权登录
    </button>
  </view>
  <view wx:else>请升级微信版本</view>
</view>
 
<view wx:else>
  <view>我的首页内容</view>
</view>

wxss

.header {
  margin: 90rpx 0 90rpx 50rpx;
  border-bottom: 1px solid #ccc;
  text-align: center;
  width: 650rpx;
  height: 300rpx;
  line-height: 450rpx;
}
.header image {
  width: 200rpx;
  height: 200rpx;
}
.content {
  margin-left: 50rpx;
  margin-bottom: 90rpx;
}
.content text {
  display: block;
  color: #9d9d9d;
  margin-top: 40rpx;
}
.bottom {
  border-radius: 80rpx;
  margin: 70rpx 50rpx;
  font-size: 35rpx;
}

js

// pages/test1/test1.js
var app = getApp();
Page({
 /**
  * 页面的初始数据
  */
 data: {
  //判断小程序的API,回调,参数,组件等是否在当前版本可用。
  canIUse: wx.canIUse('button.open-type.getUserInfo'),
  isHide: false
 },
 /**
  * 生命周期函数--监听页面加载
  */
 onLoad: function (options) {
  var that = this;
  // 查看是否授权
  wx.getSetting({
   success: function (res) {
    if (!res.authSetting['scope.userInfo']) {
     // 还未授权,显示授权按钮
     that.setData({
      isHide: true
     });
    } else {
     // 已授权,隐藏授权按钮,显示正文
     that.setData({
      isHide: false
     });
    }
   }
  })
 },
 //授权登陆按钮
 bindGetUserInfo: function (e) {
  var that = this;
  console.log(e)
  if (e.detail.userInfo) {
   //用户授权登陆,并跳转首页
   // that.getOpenid()
   wx.login({
    success: function (res) {
     // 请求自己后台获取用户openid
     wx.request({
      url: app.domain + 'teacherapi/Wx_Decode/WxDecode',
      method: 'POST',
      header: { 'content-type': 'application/x-www-form-urlencoded' },
      data: {
       encryptedData: e.detail.encryptedData,
       signature: e.detail.signature,
       rawData: e.detail.rawData,
       iv: e.detail.iv,
       code: res.code
      },
      success: function (res_user) {
       if (res_user.data.status == 0) {
        var data = JSON.parse(res_user.data.msg)//json转对象
        //授权成功返回的数据,根据自己需求操作
        console.log(data)
        //授权成功后,隐藏授权按钮,显示正文
        that.setData({
         isHide: false
        });
       }
      }, fail: function () {
       that.showModal('获取授权信息失败')
      }
     })
    }
   })
  } else {
   //用户按了拒绝授权按钮,提示引导授权
   that.showModal('请授权后使用小程序')
  }
 },
 //未授权弹窗
 showModal: function (e) {
  wx.showModal({
   title: '提示',
   content: e,
   showCancel: false,
   confirmText: '返回授权',
   success: function (res) {
    if (res.confirm) {
     console.log('用户点击了“返回授权”')
    }
   }
  })
 },
})

php

<?php
namespace app\teacherapi\controller;
use think\Controller;
/**
* @date: 2018-12
* 微信操作类
*/
class WxDecode extends Controller
{
  public function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_URL, $url);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
  }
  /**
   * @author: zxf
   * @date: 2018-12-08
   * @description: 解密微信用户敏感数据
   * @return array
   */
  public function WxDecode()
  {
    // 接收参数
    $data = request() -> param();
    // 引入解密文件 在微信小程序开发文档下载
    vendor('wx.WXBizDataCrypt');
    vendor('wx.ErrorCode');
    $appid = config('TESTPPID');
    $appsecret = config('TESTSECREET');
    $grant_type = "authorization_code"; //授权(必填)
    $code = $data['code'];    //有效期5分钟 登录会话
    $encryptedData=$data['encryptedData'];
    $iv = $data['iv'];
    $signature = $data['signature'];
    $rawData = $data['rawData'];
    // 拼接url
    $url = "https://api.weixin.qq.com/sns/jscode2session?"."appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=".$grant_type;
    $res = json_decode($this->httpGet($url),true);
    $sessionKey = $res['session_key']; //取出json里对应的值
    $signature2 = sha1(htmlspecialchars_decode($rawData).$sessionKey);
    // 验证签名
    if ($signature2 !== $signature){
      return json("验签失败");
    } 
    // 获取解密后的数据
    $pc = new \WXBizDataCrypt($appid, $sessionKey);
    $errCode = $pc->decryptData($encryptedData, $iv, $data );
    if ($errCode == 0) {
      return return_succ($data);
    } else {
      return return_error($errCode);
    }
  }
}
PHP 相关文章推荐
说明的比较细的php 正则学习实例
Jul 30 PHP
php ftp文件上传函数(基础版)
Jun 03 PHP
php使用正则表达式进行字符串搜索的方法
Mar 23 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
May 12 PHP
php面向对象值单例模式
May 03 PHP
yii2使用gridView实现下拉列表筛选数据
Apr 10 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
解决Laravel5.5下的toArray问题
Oct 15 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
phpstorm激活码2020附使用详细教程
Sep 25 PHP
php 命名空间(namespace)原理与用法实例小结
Nov 13 #PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 #PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 #PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 #PHP
php array 转json及java 转换 json数据格式操作示例
Nov 13 #PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 #PHP
Yii框架自定义数据库操作组件示例
Nov 11 #PHP
You might like
理解php Hash函数,增强密码安全
2011/02/25 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
PHP命名空间(namespace)的动态访问及使用技巧
2014/08/18 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
Jquery submit()无法提交问题
2013/04/21 Javascript
jquery与prototype框架的详细对比
2013/11/21 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
pygame播放音乐的方法
2015/05/19 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
Python3 处理JSON的实例详解
2017/10/29 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
python 输出所有大小写字母的方法
2019/01/02 Python
学习python分支结构
2019/05/17 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
新闻通讯稿模板
2015/07/22 职场文书
企业安全生产规章制度
2015/08/06 职场文书