参考博客:

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. 完整微信小程序授权登录页面教程

    完整微信小程序授权登录页面教程 1.前言 微信官方对getUserInfo接口做了修改,授权窗口无法直接弹出,而取而代之是需要创建一个button,将其open-type属性绑定getUseInfo方 ...

  2. 微信小程序授权登录--PHP后端接口

    由于之前做过公众号的一个开发,所以再开发小程序就没有那么多坑了,在这也记录一下开发过程,以方便后续进行参考. 废话不多说,直接上官方文档,任何使用第三方开发的,不看文档就是耍流氓.小程序开发文档,可以 ...

  3. 微信小程序授权登录

    目录 自定义授权页面 点击授权登录后出现微信自带的授权登录弹窗 <!--index.wxml--> <!-- 授权界面 --> <cover-view class='au ...

  4. uni-app开发经验分享二十: 微信小程序 授权登录 获取详细信息 获取手机号

    授权页面 因为微信小程序提供的 权限弹窗 只能通用户确认授权 所以可以 写一个授权页面,让用户点击 来获取用户相关信息 然后再配合后台就可以完成登录 <button class="bt ...

  5. 微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出

    前言:4月8号升级了小程序业务后提交了版本并上线.突然一个同事说体验版的点击"登录"按钮无效.当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀.然后 ...

  6. uni-app 微信小程序授权登录

    1.微信小程序 获取用户信息 与获取手机号 详细信息看官方公告:https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce8 ...

  7. 微信小程序授权登录将open_id传至后台并入库

    要求能把用户昵称.头像以及open_id写入数据库,服务端保持用户登录状态 wxml: <block wx:else> <button type="primary" ...

  8. 微信小程序之登录连接django,以及用户的信息授权认证

    小结: 1 如何自定义组件 - 组件和页面一样,也是由四个文件组成,所以我们自定义组件的时候,模拟pages文件夹,把所有的所有的组件都放在一个文件夹中,每个组件又由一个文件夹包裹,方便管理,在对应目 ...

  9. 小程序获取openid 小程序授权

    小程序获取openid 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系. wx.login(Object object) 调用接口获取登录凭证(cod ...

随机推荐

  1. Net6 DI源码分析Part2 Engine,ServiceProvider

    ServiceProvider ServiceProvider是对IServiceProvider实现,它有一个internal的访问修饰符描述的构造,并需要两个参数IServiceCollectio ...

  2. java实现以docx格式导出

    直接上代码:Map<String, Object> dataMap = afterLoanReportService.exportReport(startDate, endDate);// ...

  3. js instanceof 解析

    js中的instanceof运算符 概述 instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上 语法 obj instanceofOb ...

  4. JSP两种声明变量的区别

    感谢大佬:https://blog.csdn.net/tiercel2008/article/details/11553899?utm_source=distribute.pc_relevant.no ...

  5. NSMutableDictionary基本概念

    1.NSMutableDictionary 基本概念 什么是NSMutableDictionary NSMutableDictionary是NSDictionary的子类 NSDictionary是不 ...

  6. 直播流媒体fms

    第一步  下载  Flash Media Server 4.5 安装教程网上很多 也很简单 我的密码记录  用户admin  密码admin23456 第二步 直接 下载 直播测试工具 FlashMe ...

  7. Docker的资源控制管理

    Docker的资源控制管理 1.CPU控制 2.对内存使用进行限制 3.对磁盘I/O配额控制的限制 1.CPU控制: cgroups,是一个非常强大的linux内核工具,他不仅可以限制被namespa ...

  8. 一加6刷入kali nethunter

    Installing Kali NetHunter On the OnePlus 6 准备工具: adb: https://jingyan.baidu.com/article/22fe7cedf67e ...

  9. 基于UDP传输协议局域网文件接收软件设计 Java版

    网路传输主要的两大协议为TCP/IP协议和UDP协议,本文主要介绍基于UDP传输的一个小软件分享,针对于Java网络初学者是一个很好的练笔,大家可以参考进行相关的联系,但愿能够帮助到大家. 话不多说, ...

  10. 框架02--Iptables实际应用

    目录 Iptables实际应用 一.安装iptables 1. 安装iptables软件包 2. 命令格式 3. 参数 二.iptables动作 三.Iptables基本的条件匹配(协议) 四.-s ...