参考博客:

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. Java流程控制03:顺序结构

    顺序结构 Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行. 顺序结构是最简单的算法结构.从上到下 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处 ...

  2. 数论同余学习笔记 Part 2

    逆元 准确地说,这里讲的是模意义下的乘法逆元. 定义:如果有同余方程 \(ax\equiv 1\pmod p\),则 \(x\) 称为 \(a\bmod p\) 的逆元,记作 \(a^{-1}\). ...

  3. 通过json动态创建控制器

    通过字符串来创建控制器 如果通过字符串来创建控制器 不可以直接通过类型来获取对应的类 因为Swift有命名空间,类前需要加上命名空间的名称 获取命名空间的名称 let executable = NSB ...

  4. java创建自定义类的对象数组

      1 public class Student{ 2 static int number = 0; // 静态变量的访问可以不用创建类的实例就可就可使用< 类名.属性 >的方法访问 3 ...

  5. Kubernetes家族容器小管家Pod在线答疑?

    Kubernetes家族容器小管家Pod在线答疑 不知道学习k8s的小伙伴们有没有跟我一样的疑问? k8s为什么不是直接运行容器,而是让Pod介入? Pod又是什么?为什么在应用容器化如此普遍的情况下 ...

  6. 5个不常提及的HTML技巧

    2021年你需要知道的HTML标签和属性 Web开发人员都在广泛的使用HTML.无论你使用什么框架或者选择哪个后端语言,框架在变,但是HTML始终如一.尽管被广泛使用,但还是有一些标签或者属性是大部分 ...

  7. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3) 0x00 摘要 0x01 回顾 0x0 ...

  8. Redis学习详解(一):Redis持久化机制之RDB

    Redis的持久化机制有两种:RDB持久化和AOF持久化.因为Redis是一个内存数据库,如果没有合适的持久化机制,那么一旦服务器进程退出,服务器中的数据库状态也会消失.本章介绍RDB持久化机制. R ...

  9. MySQL架构原理之运行机制

    所谓运行机制即MySQL内部就如生产车间如何进行生产的.如下图: 1.建立连接,通过客户端/服务器通信协议与MySQL建立连接.MySQL客户端与服务端的通信方式是"半双工".对于 ...

  10. log4j的替换方案

    去年12月份,随着log4j暴露出高危漏洞,对于 Java 开发人员来说不是一个好消息,对于 Ops 来说更是如此.前者必须使用固定的 Log4J 版本重新打包他们的应用程序,而后者必须重新部署.但对 ...