小程序开发讲究的就是一个敏捷软件开发模式,作为微信小程序授权也有多个项目的积累,所以想贴出来代码,让需要用到的朋友拿来即用(当然前提是需要修改自己的小程序appid和秘钥)。

  1. 前端调用wx.login()获取code值。
  2. 前端通过调用wx.getUserInfo获取iv、rawData、signature、encryptedData等加密数据,传递给服务端。
  3. 服务器通过code请求api--auth.code2Session,换回session_key和openid(判断用户的openid是否在数据库中不在就提交,再给前端发送token(md5用户id+时间戳) )。
  4. 前端发送消息到服务器时带上token,即请求服务端接口时,token作为参数与其他参数一并传来。
  5. 服务器验证token(需要用户数据表创建一个token字段(char 64))。
<?php
class WechatController
{/*** 微信snsapi_base静默授权与snsapi_userinfo网页授权的实现* snsapi_base只能获取access_token和openID,流程走完即终止* snsapi_userinfo可以获取更详细的用户资料,比如头像、昵称、性别等* 这里我们需要的获取用户详细信息,所以选择snsapi_userinfo*/static $scopes = 'snsapi_userinfo';// 微信小程序appid和秘钥public $appid = 'xxxxxxx';public $secret = 'xxxxxxxxxxxxxxxx';/*** 微信小程序授权* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector*/public function appletAuth(){// 获取微信小程序授权所需参数$data = \Request::getData(['code','signature','rawData','encryptedData','iv',]);$code = $data['code'];if(empty($code)){return \Response::echoError('请传入code授权码!');}$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$this->appid&secret=$this->secret&js_code=$code&grant_type=authorization_code";//dump($url);$result = $this->getJson($url);if(isset($result['errcode'])){return \Response::echoError($result['errmsg']);}else{$session_key = $result['session_key'];$signature = $data['signature'];$raw = trim($data['rawData']);$encryptedData = $data['encryptedData'];$iv = $data['iv'];if(empty($signature) || empty($raw) || empty($encryptedData) || empty($iv)){return \Response::echoError('参数不完整!');}$signature2 = sha1($raw.$session_key);if($signature != $signature2){return \Response::echoError('签名错误!');}$user_info = new wxBizDataCrypt($this->appid, $session_key);$errCode = $user_info->decryptData($encryptedData, $iv, $info);if($errCode != 0){return \Response::echoError($errCode);}$info = json_decode($info,true);// 检查是否已存在该微信小程序的用户openid,存在表示之前已授权,直接更新token$res = Model('User')->where(['openId' => $info['openId']])->first();Model()->startTrans();if(!$res){$result_res = Model('User')->create(['nickname' => $info['nickName'],'openid' => $info['openId'],'headimgurl' => $info['avatarUrl'],'gender' => $info['gender'],'create_time' => date('Y-m-d H:i:s'),'update_at' => date('Y-m-d H:i:s'),]);if(!$result_res){Model()->rollback();return \Response::echoError('授权失败!');}else{//保存当前用户登录信息(用户id等)到缓存$loginLogic = new LoginLogic();$loginLogic->save($result_res->id);// 更新token$token = md5($result.time());Model('User')->where(['id' => $result_res->id])->update(['token' => $token]);Model()->commit();return \Response::echoSuccess($token, '授权成功!');}}else{// 更新token$token = md5($res['id'].time());Model('User')->where(['id' => $res->id])->update(['token' => $token]);Model()->commit();return \Response::echoSuccess($token, '已授权成功!');}}}/*** curl的get请求* @param $url* @return mixed*/function getJson($url){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($ch);curl_close($ch);return json_decode($output, true);}
}

对微信小程序用户加密数据的解密示例代码

<?php
/*** 对微信小程序用户加密数据的解密示例代码.** @copyright Copyright (c) 1998-2014 Tencent Inc.*/
class WXBizDataCrypt
{public static $OK = 0;public static $IllegalAesKey = -41001;public static $IllegalIv = -41002;public static $IllegalBuffer = -41003;public static $DecodeBase64Error = -41004;private $appid;private $sessionKey;/*** 构造函数* @param $sessionKey string 用户在小程序登录后获取的会话密钥* @param $appid string 小程序的appid*/public function __construct($appid, $sessionKey){$this->sessionKey = $sessionKey;$this->appid = $appid;}/*** 检验数据的真实性,并且获取解密后的明文.* @param $encryptedData string 加密的用户数据* @param $iv string 与用户数据一同返回的初始向量* @param $data string 解密后的原文** @return int 成功0,失败返回对应的错误码*/public function decryptData( $encryptedData, $iv, &$data ){if (strlen($this->sessionKey) != 24) {return ErrorCode::$IllegalAesKey;}$aesKey=base64_decode($this->sessionKey);if (strlen($iv) != 24) {return ErrorCode::$IllegalIv;}$aesIV=base64_decode($iv);$aesCipher=base64_decode($encryptedData);$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);$dataObj=json_decode( $result );if( $dataObj  == NULL ){return ErrorCode::$IllegalBuffer;}if( $dataObj->watermark->appid != $this->appid ){return ErrorCode::$IllegalBuffer;}$data = $result;return ErrorCode::$OK;}}
}

保存当前用户登录信息(用户id等)到缓存的LoginLogic.php

class LoginLogic{/*** 保存登录信息到缓存* @param $user_id*/function save($user_id){// 用户信息$info = Model('User')->where(['id' => $user_id])->first(['id','openid',]);if(empty($info)){return '账户信息不存在';}session(['user_id' => $info->id,'openid' => $info->openid,'is_login' => true]);return true;}
}

接下来就是使用授权,创建一个公共的控制器,需要微信授权才能看到的信息都需要过这个公共的控制器。比如创建一个CommonController.php

// 判断是否小程序授权过
class CommonController
{// 登录验证openidpublic function __construct(){// 接收验证登录的参数$data = \Request::getData(['token',]);if(empty($data['token'])){return \Response::echoError('请输入授权token参数!');}$res = Model('User')->where(['token' => $data['token']])->select('id')->first();if(!$res){return \Response::echoError('请先授权!');}else{//保存当前用户登录信息$loginLogic = new LoginLogic();$loginLogic->save($result_res->id);}
}

PHP快速实现微信小程序授权相关推荐

  1. 新版微信小程序授权登录流程及问题汇总(getUserProfile)

    问题来源:前不久去面试的时候有面试官问我你有自己的博客啥的吗?只能很尴尬的说没有.其实一直想有一个属于自己的博客啥的去记录自己在开发过程中遇到的问题,正好现在微信小程序比较流行,就花了两天自己搞了一个 ...

  2. jeecg uniapp 微信小程序 授权备忘

    jeecg uniapp 微信小程序 授权备忘 修改前提: 2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息 推荐使用wx.getUserProfile获取用 ...

  3. 上传文件 微信小程序input_快速上手微信小程序UI框架

    本课程属于 微信小程序 A计划,不单独售卖,加入 A 计划可免费观看本课程及所有 微信小程序 收费课程~ 微信小程序 A计划永久有效期购买链接: http://www.sikiedu.com/clas ...

  4. 只需两步快速获取微信小程序源码

    第一次在掘金这样高大上的社区写文章,忐忑地敲下我获取小程序源码过程中的经验分享. 最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了某个小程序的前端实现,过程一言难尽,差不多两 ...

  5. 微信小程序授权登录 组件的封装

    微信小程序授权登录 组件的封装 新建components文件 写wxml文件 wxss部分 js部分 json引用 页面使用 页面js 授权登录 流程如下: 因为多个页面功能需要登录状态 所以做了个组 ...

  6. 微信小程序---授权保存图片或视频,拒绝后不在出现弹窗---自定义组件弹窗

    微信小程序授权保存图片后拒绝授权,(当拒绝授权后,微信再次调用保存不在出现授权弹窗): 这么一来,微信提供给开发者的解决方法就是跳入设置页面里面让用户自己打开权限. 那么今天自己自定义了一个组件. 根 ...

  7. SpringBoot微信小程序授权登录

    SpringBoot微信小程序授权登录 一.appId 1.1.自己是管理者:微信公众平台,申请或登录自己的微信小程序,在开发者管理中即可看到 2.2.自己是开发者:让管理员将自己加入到小程序开发者管 ...

  8. uniapp微信小程序授权登录和获取微信绑定的手机号码

    uniapp微信小程序授权登录和获取微信绑定的手机号码 弹出授权的弹框 <view class="weixinOk" @tap="getUserProfile&qu ...

  9. 微信小程序授权登录取消授权重新授权处理方法 附可用代码

    微信小程序授权登录基本是小程序的标配了,但是官方的demo,取消授权后,就不能再重新点击登录,除非重新加载小程序才可以,这下怎么办? 我们可以先在首页引导用户点击,然后跳转到一个新的页面,在新的页面进 ...

最新文章

  1. ThinkPHP框架搭建网站
  2. 架构模式: 事务日志跟踪
  3. GDT、GDTR、LDT、LDTR的学习
  4. 如何构建高扩展性网站?
  5. SpringIOCAOP
  6. “匿名句柄” 是一切皆文件背后功臣……
  7. ASP.NET MVC的JavaScriptResult
  8. Python+matplotlib自定义坐标轴位置、颜色、箭头
  9. 在taobao上安家了,欢迎大家来选购呀
  10. 如何查找MySQL中查询慢的SQL语句
  11. 金蝶站点重新输入服务器ip,金蝶KIS客户端和服务器不在同一IP段互相访问
  12. goland 注释模板_Java程序员简历模板,怎样才是一份好的技术简历
  13. 每天有数百人搜索App破解,开发者该怎么保护自己的手机应用呢?
  14. 2020年数学建模亚太赛赛后分享总结
  15. 神经网络机器翻译的实现
  16. python constants_Python constants包_程序模块 - PyPI - Python中文网
  17. uni-app弹窗多选样式分享
  18. CTF隐写常见套路归纳
  19. GM8775C 型 DSI 转双通道 LVDS 发送器
  20. 参考 | 给C盘 “搬家“

热门文章

  1. 海绵宝宝python代码_Python那些事——python还能这么玩?帅呆了
  2. 定制Python计时器的类
  3. 计算机显示连接到多重网络,win7系统网络连接后出现多重网络的解决方法
  4. 湖南卫视为纪念袁隆平逝世,停播一期《快乐大本营》
  5. 查看磁盘信息命令和查看目录以及文件占用空间大小命令
  6. windows 2019 server AD域统一设置桌面壁纸
  7. Win10去除下角标
  8. steam游戏寒冷_如何获得Steam游戏的退款
  9. 机器学习笔记 - 自动编码器autoencoder
  10. windows系统怎么实现桌面图标的任意移动和摆放?