添加绑定手机号接口

main
liutk 2024-05-19 11:51:56 +08:00
parent afc887b4f2
commit 4a3ba818ec
10 changed files with 128 additions and 13 deletions

View File

@ -38,10 +38,11 @@ class UserController extends AdminController
amis()->TableColumn('avatar', __('admin.users.avatar'))->type('image')->height('50px')->width('50px')->enlargeAble(true),
amis()->TableColumn('phone', __('admin.users.phone')),
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('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([
$this->rowShowTypeButton('drawer', 'xl'),
])

View File

@ -22,7 +22,7 @@ class ActivityGameController extends ApiController
//若已经没有最新的活动了, 则拿取当天最后一个
if(!$game){
$activity?->games()->show()
$game = $activity?->games()->show()
->whereDate('game_at', now())
->orderBy('game_at', 'desc')->first();
}

View File

@ -25,12 +25,12 @@ class ApiController extends BaseController
return response()->json($result);
}
public function success($data = [], $message = '')
public function success($data = null, $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);
}

View File

@ -7,6 +7,7 @@ use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Services\Api\UserService;
use App\Http\Resources\Api\UserResource;
use App\Http\Requests\CodeRequest;
use Overtrue\LaravelWeChat\EasyWeChat;
use Illuminate\Support\Arr;
@ -14,13 +15,8 @@ class AuthController extends ApiController
{
protected string $serviceName = UserService::class;
public function codeToSession(Request $request)
public function codeToSession(CodeRequest $request)
{
$request->validate([
'code' => 'required',
], [
'code.required' => '授权码必填',
]);
//绑定OPenid
$code = $request->input('code');
$app = EasyWeChat::miniApp();

View File

@ -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('绑定失败,请稍后重试');
}
}

View File

@ -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]]));
}
}

View File

@ -8,11 +8,13 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable, Filterable;
protected $appends = ['last_ip'];
/**
* The attributes that are mass assignable.
*
@ -25,6 +27,16 @@ class User extends Authenticatable
'mini_openid',
'union_id',
'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) : "未知",
);
}
}

View File

@ -3,6 +3,7 @@
namespace App\Services\Api;
use App\Models\User;
use Illuminate\Http\Response;
/**
* @method User getModel()
@ -43,4 +44,16 @@ class UserService
)->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()
]);
}
}

View File

@ -323,6 +323,7 @@ return [
'avatar' => '头像',
'phone' => '手机号',
'mini_openid' => '小程序唯一标识',
'bind_phone_at' => '绑定手机时间',
'last_login_at' => '上次登录时间',
'last_login_ip' => '上次登录IP',
'created_at' => '首次进入时间',

View File

@ -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/{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(){