generated from liutk/owl-admin-base
添加绑定手机号接口
parent
afc887b4f2
commit
4a3ba818ec
|
|
@ -38,10 +38,11 @@ class UserController extends AdminController
|
||||||
amis()->TableColumn('avatar', __('admin.users.avatar'))->type('image')->height('50px')->width('50px')->enlargeAble(true),
|
amis()->TableColumn('avatar', __('admin.users.avatar'))->type('image')->height('50px')->width('50px')->enlargeAble(true),
|
||||||
amis()->TableColumn('phone', __('admin.users.phone')),
|
amis()->TableColumn('phone', __('admin.users.phone')),
|
||||||
amis()->TableColumn('mini_openid', __('admin.users.mini_openid')),
|
amis()->TableColumn('mini_openid', __('admin.users.mini_openid')),
|
||||||
amis()->TableColumn('last_login_at', __('admin.users.last_login_at')),
|
|
||||||
amis()->TableColumn('last_login_ip', __('admin.users.last_login_ip')),
|
|
||||||
|
|
||||||
amis()->TableColumn('created_at', __('admin.users.created_at'))->type('datetime')->sortable(true),
|
amis()->TableColumn('created_at', __('admin.users.created_at'))->type('datetime')->sortable(true),
|
||||||
|
amis()->TableColumn('bind_phone_at', __('admin.users.bind_phone_at'))->type('datetime')->sortable(true),
|
||||||
|
amis()->TableColumn('last_login_at', __('admin.users.last_login_at')),
|
||||||
|
amis()->TableColumn('last_ip', __('admin.users.last_login_ip')),
|
||||||
|
|
||||||
Operation::make()->label(__('admin.actions'))->buttons([
|
Operation::make()->label(__('admin.actions'))->buttons([
|
||||||
$this->rowShowTypeButton('drawer', 'xl'),
|
$this->rowShowTypeButton('drawer', 'xl'),
|
||||||
])
|
])
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ class ActivityGameController extends ApiController
|
||||||
|
|
||||||
//若已经没有最新的活动了, 则拿取当天最后一个
|
//若已经没有最新的活动了, 则拿取当天最后一个
|
||||||
if(!$game){
|
if(!$game){
|
||||||
$activity?->games()->show()
|
$game = $activity?->games()->show()
|
||||||
->whereDate('game_at', now())
|
->whereDate('game_at', now())
|
||||||
->orderBy('game_at', 'desc')->first();
|
->orderBy('game_at', 'desc')->first();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ class ApiController extends BaseController
|
||||||
return response()->json($result);
|
return response()->json($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function success($data = [], $message = '')
|
public function success($data = null, $message = '')
|
||||||
{
|
{
|
||||||
return $this->json($data, Response::HTTP_OK, $message);
|
return $this->json($data, Response::HTTP_OK, $message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function error($message = '', $code = Response::HTTP_BAD_REQUEST, $data = [])
|
public function error($message = '', $code = Response::HTTP_BAD_REQUEST, $data = null)
|
||||||
{
|
{
|
||||||
return $this->json($data, $code, $message);
|
return $this->json($data, $code, $message);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ use Carbon\Carbon;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use App\Services\Api\UserService;
|
use App\Services\Api\UserService;
|
||||||
use App\Http\Resources\Api\UserResource;
|
use App\Http\Resources\Api\UserResource;
|
||||||
|
use App\Http\Requests\CodeRequest;
|
||||||
use Overtrue\LaravelWeChat\EasyWeChat;
|
use Overtrue\LaravelWeChat\EasyWeChat;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
|
|
||||||
|
|
@ -14,13 +15,8 @@ class AuthController extends ApiController
|
||||||
{
|
{
|
||||||
protected string $serviceName = UserService::class;
|
protected string $serviceName = UserService::class;
|
||||||
|
|
||||||
public function codeToSession(Request $request)
|
public function codeToSession(CodeRequest $request)
|
||||||
{
|
{
|
||||||
$request->validate([
|
|
||||||
'code' => 'required',
|
|
||||||
], [
|
|
||||||
'code.required' => '授权码必填',
|
|
||||||
]);
|
|
||||||
//绑定OPenid
|
//绑定OPenid
|
||||||
$code = $request->input('code');
|
$code = $request->input('code');
|
||||||
$app = EasyWeChat::miniApp();
|
$app = EasyWeChat::miniApp();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use Cache;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Http\Requests\CodeRequest;
|
||||||
|
use App\Services\Api\UserService;
|
||||||
|
use App\Http\Resources\Api\UserResource;
|
||||||
|
use Overtrue\LaravelWeChat\EasyWeChat;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
|
||||||
|
class UserController extends ApiController
|
||||||
|
{
|
||||||
|
protected string $serviceName = UserService::class;
|
||||||
|
|
||||||
|
public function bindPhone(CodeRequest $request)
|
||||||
|
{
|
||||||
|
$code = $request->input('code');
|
||||||
|
$app = EasyWeChat::miniApp();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = $app->getClient()->postJson('wxa/business/getuserphonenumber', [
|
||||||
|
'code' => $code
|
||||||
|
]);
|
||||||
|
}catch (\Throwable $th) {
|
||||||
|
return $this->error($th->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Arr::get($response, 'errcode')) {
|
||||||
|
return $this->error(Arr::get($response, 'errmsg'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$phone = Arr::get($response['phone_info'], 'phoneNumber');
|
||||||
|
// $phone = '17784326301';
|
||||||
|
$res = $this->service->bindPhone(auth('api')->user(), $phone);
|
||||||
|
|
||||||
|
if($res){
|
||||||
|
return $this->success(null, '绑定成功');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->error('绑定失败,请稍后重试');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Http\Exceptions\HttpResponseException;
|
||||||
|
use Illuminate\Contracts\Validation\Validator;
|
||||||
|
|
||||||
|
class CodeRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function authorize()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rules()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'code' => 'required|string|max:100',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function messages(){
|
||||||
|
$message = [
|
||||||
|
'code.required' => 'code码必填',
|
||||||
|
];
|
||||||
|
return $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function failedValidation(Validator $validator){
|
||||||
|
$error = $validator->errors()->all();
|
||||||
|
throw new HttpResponseException(response()->json(['data' => null, 'code' => 400, 'message' => $error[0]]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,11 +8,13 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
|
||||||
use Illuminate\Notifications\Notifiable;
|
use Illuminate\Notifications\Notifiable;
|
||||||
use Laravel\Sanctum\HasApiTokens;
|
use Laravel\Sanctum\HasApiTokens;
|
||||||
use EloquentFilter\Filterable;
|
use EloquentFilter\Filterable;
|
||||||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
|
||||||
class User extends Authenticatable
|
class User extends Authenticatable
|
||||||
{
|
{
|
||||||
use HasApiTokens, HasFactory, Notifiable, Filterable;
|
use HasApiTokens, HasFactory, Notifiable, Filterable;
|
||||||
|
|
||||||
|
protected $appends = ['last_ip'];
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
*
|
*
|
||||||
|
|
@ -25,6 +27,16 @@ class User extends Authenticatable
|
||||||
'mini_openid',
|
'mini_openid',
|
||||||
'union_id',
|
'union_id',
|
||||||
'last_login_at',
|
'last_login_at',
|
||||||
'last_login_ip'
|
'last_login_ip',
|
||||||
|
'bind_phone_at'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
//ip
|
||||||
|
protected function lastIp():Attribute
|
||||||
|
{
|
||||||
|
return Attribute::make(
|
||||||
|
get: fn($value) => $this->last_login_ip ? long2ip($this->last_login_ip) : "未知",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
namespace App\Services\Api;
|
namespace App\Services\Api;
|
||||||
|
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use Illuminate\Http\Response;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method User getModel()
|
* @method User getModel()
|
||||||
|
|
@ -43,4 +44,16 @@ class UserService
|
||||||
)->plainTextToken;
|
)->plainTextToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function bindPhone(User $user, $phone)
|
||||||
|
{
|
||||||
|
if(User::where('phone', $phone)->where('id', '<>', $user->id)->exists()){
|
||||||
|
return response()->json(['data'=>[], 'code'=> Response::HTTP_BAD_REQUEST, 'message' => '该手机号已被其他微信号绑定,请更换手机号绑定']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $user->update([
|
||||||
|
'phone' => $phone,
|
||||||
|
'bind_phone_at' => now()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -323,6 +323,7 @@ return [
|
||||||
'avatar' => '头像',
|
'avatar' => '头像',
|
||||||
'phone' => '手机号',
|
'phone' => '手机号',
|
||||||
'mini_openid' => '小程序唯一标识',
|
'mini_openid' => '小程序唯一标识',
|
||||||
|
'bind_phone_at' => '绑定手机时间',
|
||||||
'last_login_at' => '上次登录时间',
|
'last_login_at' => '上次登录时间',
|
||||||
'last_login_ip' => '上次登录IP',
|
'last_login_ip' => '上次登录IP',
|
||||||
'created_at' => '首次进入时间',
|
'created_at' => '首次进入时间',
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,9 @@ Route::group(['prefix' => 'miniprogram', 'namespace' => 'Api\Miniprogram'], func
|
||||||
Route::get('articles', [App\Http\Controllers\Api\ArticleController::class, 'index']);
|
Route::get('articles', [App\Http\Controllers\Api\ArticleController::class, 'index']);
|
||||||
Route::get('articles/{article}', [App\Http\Controllers\Api\ArticleController::class, 'show']);
|
Route::get('articles/{article}', [App\Http\Controllers\Api\ArticleController::class, 'show']);
|
||||||
|
|
||||||
|
// 绑定接口
|
||||||
|
Route::put('users/bind-phone', [App\Http\Controllers\Api\UserController::class, 'bindPhone']);
|
||||||
|
|
||||||
// 已授权绑定手机号
|
// 已授权绑定手机号
|
||||||
Route::middleware([HasBindPhone::class])->group(function(){
|
Route::middleware([HasBindPhone::class])->group(function(){
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue