vinlon/laravel-wechat-auth

Wechat Authentication in Laravel framework

0.5.0 2021-12-30 06:52 UTC

This package is auto-updated.

Last update: 2024-04-29 04:46:49 UTC


README

更新日志

v0.4.0: 升级到laravel8.0, 增加手机号绑定接口 v0.3.0: wxapp/fast_login接口支持模拟登录,便于在开发环境进行测试

小程序登录

使用指引

  1. 引入package

    composer require vinlon/laravel-wechat-auth
  2. 发布config文件 (Laravel 版本 > 5.5)

    先执行如下命令

    php artisan vendor:publish --provider="Vinlon\Laravel\WechatAuth\WechatAuthServiceProvider"

    在应用程序的config目录下,将生成wechat-auth.php文件(注:一般情况下,此文件不需要做任何修改,配置的调整通过环境变量实现)

  3. 环境变量

    配置小程序的APPID 和 APPSECRET

    WECHAT_AUTH_WXAPP_APP_ID=
    WECHAT_AUTH_WXAPP_APP_SECRET=
    WECHAT_AUTH_TEST_CODE_PREFIX=
    
  4. 创建数据库表

    php artisan migrate
    
  5. 生成JWT_SECRET

    生成JWT_SECRET, 并自动写入根目录下的.env文件

    php artisan jwt:secret
    
  6. 根据实际需要调用对应的接口

    详见接口说明

  7. 使用 auth middleware 对请求的登录状态进行验证

    Route::group(['middleware' => ['auth:wxapp']], function () {
        //这里放置你的需要登录的 api 路由
    });
    

接口说明

fast_login

快速登录,小程序端不需要进行授权, 但对于新用户来说,用户表中只会记录openid, 如果需要用户昵称、头像等,需要调用 profile 接口提交用户信息

接口地址: wxapp/fast_login
请求方式:POST
INPUT:

参数 说明
code 微信客户端调用wx.login得到的code

OUTPUT:

参数 说明
access_token JWT Token, 具体使用方式见 [JWT Token 使用说明](#JWT Token 使用说明)
token_type Bearer
expires_in access_token有效期
user_info 字段命令和微信getUserInfo的返回值保持一致,如果
如果数据中未保存用户信息,则不包含此字段

注: 如果用户被禁用,则该接口将返回 401:Unauthenticated

示例

{
  "access_token": "eyJ0eXAi...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "user_info": {
    "nickName": "测试数据",
    "gender": 1,
    "country": "中国",
    "province": "北京",
    "city": "北京",
    "avatarUrl": "https://thirdwx.qlogo.cn/mm..."
  }
}

mobile

此接口需要在fast_login登录成功的情况下调用,保存用户微信绑定的手机号

接口地址:wxapp/mobile

请求方式: POST

参数 说明
code 微信客户端调用wx.login得到的code
encrypted_data wx.getUserInfo返回的数据,包括敏感数据在内的完整用户信息的加密数据
iv wx.getUserInfo返回的数据,加密算法的初始向量

OUTPUT: []

wxapp/profile

此接口一般在fast_login请求成功的情况下调用,直接将wx.getUserInfo中返回的用户信息(未加密)保存到服务器

参数 说明
nickName 用户昵称
country 国家
province 省份
city 城市
gender 性别,0:未知,1:男,2: 女
avatarUrl 用户头像地址

OUTPUT: []

JWT Token 使用说明

使用jwt-auth的验证方式, 详见

# Authorization header
Authorization: Bearer eyJhbGciOiJIUzI1NiI...

# Query String
http://example.dev/me?token=eyJhbGciOiJIUzI1NiI...

异常

WechatAuthException

事件

  • UserAdded

    由于用户记录是在用户第一次调用login接口时创建的,此时记录中并不包含除app_id和openid以外的其它信息

  • UserUpdated

    当用户调用 profile 接口时,如果用户信息发生变化,则会触发该事件

  • UserLoggedIn

    用户登录成功后会触发该事件

WxAppGuard 配置

下面的配置不需要手动设置,已经通过WechatAuthServiceProvider自动将配置添加到auth config中

# guards
'guards' => [
    'wxapp' => [
        'driver' => 'jwt',
        'provider' => 'wxusers',
    ],
],

# providers
'providers' => [
    'wxusers' => [
        'driver' => 'eloquent',
        'model' => vinlon\Laravel\WechatAuth\Models\WxUser::class,
    ],
]

引用

https://github.com/tymondesigns/jwt-auth
https://github.com/overtrue/laravel-wechat

参考

xiaohuilam/laravel-wxapp-login
为什么用jwt-auth而不是laravel/passport