• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

小程序授权登录并 laravel7(laravel8) token 应用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

参考博客:

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 进行格式化代码

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
微信小程序之遍历和跳转发布时间:2022-07-18
下一篇:
小程序登录 之 支付宝授权发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap