小程序授权登录并 laravel7(laravel8) token 应用
参考博客:
https://blog.csdn.net/qq_42839386/article/details/118279530
1:composer 下载
composer require firebase/php-jwt
2:手动新建目录app\Service

3:service下建一个Token.php,加人以下代码
<?php
namespace App\Service;
use Firebase\JWT\JWT; class Token
{
protected $key;
public function __construct()
{
$this->key = 'lizichen';
}
/**
* 生成token
*/
public function createToken($uid)
{
$time = time();
$payload = array(
"iss" => "",
"aud" => "",
"iat" => $time,
"nbf" => $time,
"exp" => $time+7200,
"uid" => $uid
); $token = JWT::encode($payload,$this->key); return $token;
} /**
* 验证token
*/
public function validateToken($token)
{
try {
$decoded = JWT::decode($token, $this->key, array('HS256'));
return $decoded->uid;
}catch (\Exception $e){
return 'token过期';
}
}
}
4:App\Http\Middleware 下新建JwtToken.php 文件,写以下代码

<?php
namespace App\Http\Middleware;
use App\Service\Token;
use Closure;
use Illuminate\Http\Request; class JwtToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$token = $request->header('token');
if(empty($token)){
return response()->json(['code'=>40001,'msg'=>'请先登录','data'=>'']);
}
$res = (new Token())->validateToken($token);
if(!is_numeric($res)){
return response()->json(['code'=>40002,'msg'=>$res,'data'=>'']);
}
$request['uid'] = $res;
return $next($request);
}
}
5:App\Service新建Curl.php文件
<?php namespace App\Service; class Curl
{
public static function getCurl($url)
{
$headerArray =array("Content-type:application/json;","Accept:application/json");
$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);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output,true);
return $output;
} }
6:这里先去写小程序页面,将用户信息添加入库用用户id进行生成token
wxml:
<button type="primary" open-type="getUserInfo" bind:tap="login">授权登录</button>

wxjs
// 微信授权
login(evt){
var that=this;
// wx.getUserProfile获取用户信息
wx.getUserProfile({
// desc 声明获取用户个人信息后的用途,不超过30个字符
desc: 'desc',
success:res=>{
if (res.userInfo) {
/* wx.login 调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台帐号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台帐号)及本次登录的会话密钥(session_key)*/
wx.login({
success:ret=>{ // 获取code
var code=ret.code;
// 获取用户昵称
var nickName=res.userInfo.nickName;
// 获取用户照片
var avatarUrl=res.userInfo.avatarUrl;
// 发送至php后端
wx.request({
url: 'http://www.yan.com/api/xcx/login', //仅为示例,并非真实的接口地址
data: {
code:code,
nickName:nickName,
avatarUrl:avatarUrl
},
method:"POST",
header: {
'content-type': 'application/json' // 默认值
},
// 数据返回json格式
success (res) {
// 获取返回来的token,并将token进行保存至本地缓冲中
console.log(res.data.data);
wx.setStorageSync('token', res.data.data.token)
// 将用户id储存于本地
wx.setStorageSync('userid', res.data.data.id);
}
})
}
})
}else{
console.log('用户拒绝啦');
}
}
})
}
小程序将用户信息发送至后台,所以要定义路由 route/api.php ,加入中间件进行检测


protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
// 中间件
'jwt' => JwtToken::class
];
api.php定义路由:
Route::group(['namespace'=>'xcx','middleware'=>'jwt'],function (){
// 登录
Route::post('xcx/login','LoginController@login');
//商品添加
Route::post('xcx/getData','LoginController@getData');
//商品展示
Route::post('xcx/goodIndex','LoginController@goodIndex');
//图片
Route::post('xcx/xcxImg','LoginController@xcxImg');
});

控制器生成token,并发送至小程序进行本地缓冲
<?php namespace App\Http\Controllers\xcx; use App\Http\Controllers\Controller;
use App\Models\GoodRelease;
use App\Models\Wxuser;
use App\Service\Token;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator; class LoginController extends Controller
{
//
public function login(Request $request)
{
$params = $request->post();
// 获取appid
$appid = "wx64832aa6eaea82b0";
// 从微信公众平台获得secret
$secret = "95e2acaf355dbcb443f5cd4748a152ed";
// 发送请求换取openid和sessionkey
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=" . $params['code'] . "&grant_type=authorization_code";
// 暂使用file_get_contents()发送请求,你可以使用CURL扩展的形式实现,获取opid和session_key
$res = json_decode(file_get_contents($url), true);
// 给$params追加openid
$params['openid'] = $res['openid'];
// 给$params追加session_key
$params['session_key'] = $res['session_key']; // 查看数据库里是否有openid,有就修改,没有就添加
$res = Wxuser::where('openid', $params['openid'])->first(); //用查找到的用户信息的id生成token
$token=(new Token())->createToken($res->id);
// 将token发送至小程序,小程序进行缓冲token和用户id
$res['token']=$token;
// 有就修改用户的额openID
if ($res) {
Wxuser::where('openid', $params['openid'])->update($params);
return ['code' => 201, 'meg' => '修改成功', 'data' => $res];
} else {
// 没有就添加新用户
$add = Wxuser::create($params);
return ['code' => 200, 'meg' => '添加成功', 'data' => $res];
} }
}
这样就基本完成啦,再调用接口的时候使用就可以啦,小程序举例,看第8行,看第8行,看第8行重要的事情说3遍
1 find(res){
2 let m_id = res.currentTarget.dataset.m_id;
3 let token = wx.getStorageSync('token')
4 wx.request({
5 url: 'http://www.think2.com/movieFind',
6 method:'POST',
7 data:{m_id},
8 header:{token},
9 success:res=>{
10 console.log(res);
11 wx.navigateTo({
12 url: '../find/find?m_id='+ m_id,
13 })
14 }
15 })
我在这里在进行举例:
l 小程序轮播图搭建
l 轮播图接口开发,要求符合规范,路由编写符合规范
1.首先我们将数据库放入3张图片

2.创建laravel 模型

3:控制器进行调用:
<?php namespace App\Http\Controllers\Task\task15; use App\Http\Controllers\Controller;
use App\Http\Controllers\Task\Task13\BaseConttoller;
use App\Models\Task\task15\Rotation;
use Illuminate\Http\Request; class RotationController extends BaseConttoller
{
// public function rotation(){
$data=Rotation::get();
return $this->getJsonData('200','success',$data);
}
}
4,书写路由:
//task15 登录 创建token
Route::post('task15/getlogininfo', 'Task\task15\TaskController@getUserInfo');
/*图片轮播*/
Route::group(['namespace' => 'Task', 'middleware' => 'jwt'], function () {
Route::post('task15/rotation', 'task15\RotationController@rotation');
});

5:小程序js文件请求接口
// pages/homepage/homepage.js
Page({ /**
* 页面的初始数据
*/
data: { rotation:[]
}, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 获取本地存储的token
let token= wx.getStorageSync('token') wx.request({
url: 'http://www.yan.com/api/task15/rotation', //仅为示例,并非真实的接口地址 header:{token},
method:"post",
success:res=> {
this.setData({
rotation :res.data.data
}) }
}) },

6,页面渲染:
<!--pages/homepage/homepage.wxml-->
<view>
<swiper indicator-dots="{{true}}" circular="{{true}}" autoplay="{{true}}" interval="2000">
<block wx:for="{{rotation}}">
<swiper-item>
<image src="{{item.img}}"></image>
</swiper-item>
</block>
</swiper>
</view>

格式化shift+alt+f 进行格式化代码
小程序授权登录并 laravel7(laravel8) token 应用的更多相关文章
- 完整微信小程序授权登录页面教程
完整微信小程序授权登录页面教程 1.前言 微信官方对getUserInfo接口做了修改,授权窗口无法直接弹出,而取而代之是需要创建一个button,将其open-type属性绑定getUseInfo方 ...
- 微信小程序授权登录--PHP后端接口
由于之前做过公众号的一个开发,所以再开发小程序就没有那么多坑了,在这也记录一下开发过程,以方便后续进行参考. 废话不多说,直接上官方文档,任何使用第三方开发的,不看文档就是耍流氓.小程序开发文档,可以 ...
- 微信小程序授权登录
目录 自定义授权页面 点击授权登录后出现微信自带的授权登录弹窗 <!--index.wxml--> <!-- 授权界面 --> <cover-view class='au ...
- uni-app开发经验分享二十: 微信小程序 授权登录 获取详细信息 获取手机号
授权页面 因为微信小程序提供的 权限弹窗 只能通用户确认授权 所以可以 写一个授权页面,让用户点击 来获取用户相关信息 然后再配合后台就可以完成登录 <button class="bt ...
- 微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出
前言:4月8号升级了小程序业务后提交了版本并上线.突然一个同事说体验版的点击"登录"按钮无效.当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀.然后 ...
- uni-app 微信小程序授权登录
1.微信小程序 获取用户信息 与获取手机号 详细信息看官方公告:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce8 ...
- 微信小程序授权登录将open_id传至后台并入库
要求能把用户昵称.头像以及open_id写入数据库,服务端保持用户登录状态 wxml: <block wx:else> <button type="primary" ...
- 微信小程序之登录连接django,以及用户的信息授权认证
小结: 1 如何自定义组件 - 组件和页面一样,也是由四个文件组成,所以我们自定义组件的时候,模拟pages文件夹,把所有的所有的组件都放在一个文件夹中,每个组件又由一个文件夹包裹,方便管理,在对应目 ...
- 小程序获取openid 小程序授权
小程序获取openid 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. wx.login(Object object) 调用接口获取登录凭证(cod ...
随机推荐
- 计算机电子书 2020 CDNDrive 备份(预览版)
下载方式 pip install CDNDrive # 或 # pip install git+https://github.com/apachecn/CDNDrive cdrive download ...
- [SDOI2017]数字表格 & [MtOI2019]幽灵乐团
P3704 [SDOI2017]数字表格 首先根据题意写出答案的表达式 \[\large\prod_{i=1}^n\prod_{j=1}^mf_{\gcd(i,j)} \] 按常规套路改为枚举 \(d ...
- 「NOI十联测」深邃
「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...
- JS let, var, const的用法以及区别
本文摘自多位前辈的博文,另外还有一些我的多余补充,摘自地址已补充.非常感谢各位前辈.仅以笔记学习为目的! 深入学习ES6的知识还请访问阮一峰老师的ES6教程 如果不使用let或者const,在JS只有 ...
- windows doc命令复制粘贴文件
# 删除前端文件 rmdir /s/q E:\yuanbo2019\public\static del E:\yuanbo2019\public\index.html @echo off ::被复制的 ...
- 使用kubeadm快速部署一套K8S集群
一.Kubernetes概述 1.1 Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. K8S用于容器化应用程序的 ...
- java短信接入
1,注册一个中间公司的短信平台(比如网建) 2,找到密匙 3,找到链接案例 4,复制代码 下载jar包 import java.io.UnsupportedEncodingException;imp ...
- 人工智能与智能系统3-> 机器人学3 | 移动机器人平台
机器人学的基本工具已经了解完毕,现在开始了解移动机器人,这部分包括机器人平台.导航.定位. 所谓机器人平台就是指机器人的物理结构及其驱动方式.本文将学习两种典型移动机器人平台(四旋翼和轮式车)的运动与 ...
- Linux vi 命令 – 文本编辑器
vi命令是linux系统字符界面下的最常用的文本编辑器. vi编辑器是所有linux的标准编辑器,用于编辑任何ASCⅡ文本,对于编辑源程序尤其有用.iv编辑器功能非常强大,可以对文本进行创建,查找,替 ...
- c++ 拷贝构造函数、拷贝运算符、析构函数
拷贝构造函数.拷贝运算符.析构函数 拷贝构造函数.拷贝运算符.析构函数 定义行为像值的类 class HasPtr{ public: HasPtr(const string &s = stri ...