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数据库连接类~~做成一个分页类!
Nov 25 PHP
php str_pad 函数用法简介
Jul 11 PHP
关于php mvc开发模式的感想
Jun 28 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
深入理解PHP中的global
Aug 19 PHP
php过滤HTML标签、属性等正则表达式汇总
Sep 22 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 09 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中intval()等int转换时的意外异常情况
2013/06/21 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
asp.net和php的区别点总结
2019/10/10 PHP
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
2014/06/19 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python自动生产表情包
2017/03/17 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python实现换位加密算法的示例
2018/10/14 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
毕业自我鉴定范文
2013/11/06 职场文书
自动化职业生涯规划书范文
2014/01/03 职场文书
就业表自我评价分享
2014/02/06 职场文书
毕业生求职信
2014/06/10 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
大四学生个人总结
2015/02/15 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
《暗黑破坏神2:重制版》本周进行第一轮A测 目前可官网进行申请报名
2021/04/07 其他游戏