添加三方接口记录

dev
vine_liutk 2023-07-18 11:01:50 +08:00
parent 51101bc087
commit bb241fbb2e
13 changed files with 401 additions and 0 deletions

View File

@ -0,0 +1,56 @@
<?php
namespace App\Admin\Controllers;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Admin;
use App\Models\ThirdAccess;
use Dcat\Admin\Http\Controllers\AdminController;
class ThirdAppController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new ThirdAccess(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('third_name');
$grid->column('third_appid')->copyable();
$grid->column('third_appkey')->copyable();
$grid->column('created_at')->sortable();
$grid->model()->orderBy('created_at', 'desc');
$grid->showCreateButton(! config('admin.permission.enable') || Admin::user()->can('dcat.admin.third_apps.create'));
$grid->showQuickEditButton(! config('admin.permission.enable') || Admin::user()->can('dcat.admin.third_apps.edit'));
$grid->showDeleteButton(! config('admin.permission.enable') || Admin::user()->can('dcat.admin.third_apps.destroy'));
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('third_name')->width(3);
});
});
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
return Form::make(new ThirdAccess(), function (Form $form) {
$form->display('id');
$form->text('third_name')->required();
$form->text('third_appid')->required();
$form->display('created_at');
$form->display('updated_at');
});
}
}

View File

@ -0,0 +1,40 @@
<?php
namespace App\Admin\Controllers;
use Dcat\Admin\Grid;
use Dcat\Admin\Admin;
use App\Models\ThirdLog;
use Dcat\Admin\Http\Controllers\AdminController;
class ThirdLogController extends AdminController
{
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new ThirdLog(), function (Grid $grid) {
$grid->column('id')->sortable();
$grid->column('app_id')->copyable();
$grid->column('api_path')->copyable();
$grid->column('api_name');
$grid->column('sign_status')->bool();
$grid->column('http_code');
$grid->column('request_params')->copyable();
$grid->column('response_params')->copyable();
$grid->column('created_at')->sortable();
$grid->model()->orderBy('created_at', 'desc');
$grid->disableActions();
$grid->filter(function (Grid\Filter $filter) {
$filter->equal('app_id')->width(3);
});
});
}
}

View File

@ -23,4 +23,7 @@ Route::group([
$router->resource('crop-yields', 'CropYieldController')->names('crop_yields');
$router->resource('devices', 'DeviceController')->names('devices');
$router->resource('third-apps', 'ThirdAppController')->names('third_apps');
$router->resource('third-logs', 'ThirdLogController')->names('third_logs');
});

View File

@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers\ThirdApi;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\ThirdLog;
class SendSmsController extends Controller
{
public function startMachine(Request $request)
{
$logId = $request->log_id ?? 0;
$log = ThirdLog::find($logId);
if(empty($log)){
return response()->json([
'respCd'=>'99',
'respMsg' => '系统错误',
], 500);
}
$log->api_name = '发送农机开机提醒';
$resData = [
'respCd'=>'00',
'respMsg'=>'',
];
$log->resp_status = 1;
$log->response_params = json_encode($resData);
$log->save();
return response()->json($resData);
}
public function makeSign(){
$params = [
'appKey'=>'aaaa',
'timeStamp'=>time(),
// 'startTime'=>'2022-05-01 00:00:00',
// 'endTime'=>'2022-06-01 00:00:00',
// 'signDate'=>'2022-6-1',
];
$appSecret = 'yK44SmeRktiXnn4QrapE3XOykcKsDM0O';
$paramStr = '';
ksort($params);
foreach ($params as $k=>$v) {
$paramStr .= "$k=".$v."&";
}
$paramStr = substr($paramStr, 0, -1);
$params['sign'] = md5($paramStr.$appSecret);
return response()->json($params);
}
}

View File

@ -0,0 +1,90 @@
<?php
namespace App\Http\Middleware;
use Closure;
use App\Models\ThirdLog;
use App\Models\ThirdAccess;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class ApiCustomToken
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
//获取body参数
$postData = $request->input();
$params = '';
$appKey = Arr::get($postData, 'appKey', '');
$timeStamp = Arr::get($postData, 'timeStamp','');
//拿出sign剩下的参数按照key排序, 拼接
$postSign = Arr::get($postData, 'sign', '');
if(empty($appKey) || empty($postSign) || empty($timeStamp)){
$resData = [
'respCd' => '02',
'respMsg' => '参数缺失',
];
return response()->json($resData, 400);
}
//记录请求日志
$log = new ThirdLog();
$log->app_id = $appKey;
$log->api_path = $request->path();
$log->request_params = json_encode($postData);
unset($postData['sign']);
ksort($postData);
foreach ($postData as $k=>$v) {
$params .= "$k=".$v."&"; //默认UTF-8编码格式
}
$postDataStr = substr($params, 0, -1);
$appSecret = ThirdAccess::where('third_appid', $appKey)->value('third_appkey');
//
$sign = md5($postDataStr.$appSecret);
if($sign !== $postSign){
$resData = [
'respCd' => '01',
'respMsg' => '签名失败',
];
//签名失败
$log->sign_status = 0;
$log->http_code = 400;
$log->response_params = json_encode($resData);
$log->save();
return response()->json($resData, 400);
}
if(abs(time() - $timeStamp) > 5*60){
$resData = [
'respCd' => '05',
'respMsg' => '签名过期',
];
//签名过期
$log->sign_status = 0;
$log->http_code = 400;
$log->response_params = json_encode($resData);
$log->save();
return response()->json($resData, 400);
}
$log->save();
$request->offsetSet('log_id', $log->id);
return $next($request);
}
}

View File

@ -13,5 +13,6 @@ class VerifyCsrfToken extends Middleware
*/
protected $except = [
'callback/*',
'third/*'
];
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
class ThirdAccess extends Model
{
use HasDateTimeFormatter;
protected $fillable = [
'third_name', 'third_appid', 'third_appkey'
];
protected static function boot()
{
parent::boot();
// 监听 oldman 的创建事件,用于初始化 位置信息
static::creating(function ($thirdAccess) {
$thirdAccess->third_appkey = \Illuminate\Support\Str::random(32);
});
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
class ThirdLog extends Model
{
use HasDateTimeFormatter;
}

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateThirdAccessesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('third_accesses', function (Blueprint $table) {
$table->id();
$table->string('third_name')->comment('第三方名称');
$table->string('third_appid')->nullable()->default('')->comment('第三方APPid');
$table->string('third_appkey')->nullable()->default('')->comment('第三方AppSecret');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('third_accesses');
}
}

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateThirdLogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('third_logs', function (Blueprint $table) {
$table->id();
$table->string('app_id')->nullable()->comment('应用id');
$table->string('api_path')->nullable()->comment('接口地址');
$table->string('api_name')->nullable()->comment('接口名称');
$table->unsignedTinyInteger('sign_status')->default(1)->comment('验签状态:0未通过1通过');
$table->string('http_code')->default(200)->comment('响应HTTPcode');
// $table->string('mobile')->nullable()->comment('手机号');
$table->text('request_params')->nullable()->comment('请求参数');
$table->text('response_params')->nullable()->comment('返回参数');
$table->unsignedTinyInteger('resp_status')->default(0)->comment('结果状态:0否1是');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('third_logs');
}
}

View File

@ -0,0 +1,15 @@
<?php
return [
'labels' => [
'ThirdApp' => '三方应用',
'third-apps' => '三方应用',
],
'fields' => [
'third_name' => '名称',
'third_appid' => 'APPid',
'third_appkey' => 'APPkey',
],
'options' => [
],
];

View File

@ -0,0 +1,19 @@
<?php
return [
'labels' => [
'ThirdLog' => '三方请求日志',
'third-logs' => '三方请求日志',
],
'fields' => [
'app_id' => 'APPid',
'api_path' => '接口地址',
'api_name' => '接口名称',
'sign_status'=>'验签状态',
'http_code'=>'HTTP-CODE',
'request_params'=>'请求参数',
'response_params'=>'返回参数',
],
'options' => [
],
];

View File

@ -2,9 +2,19 @@
use App\Http\Controllers\Callback\LinkosController;
use Illuminate\Support\Facades\Route;
use App\Http\Middleware\ApiCustomToken;
use App\Http\Controllers\ThirdApi\SendSmsController;
Route::post('callback/linkos', LinkosController::class);
Route::group(['prefix'=>'third'], function(){
Route::middleware([ApiCustomToken::class])->group(function(){
Route::post('send/sms/start-machine', [SendSmsController::class, 'startMachine']);
});
Route::get('g-sign', [SendSmsController::class, 'makeSign']);//记得注释
});
Route::get('/', function () {
return view('welcome');
});