快速构建第三方api应用
1.使用框架和扩展
详细请看composer.json
"php": "^7.1.3",
"laravel-admin-ext/config": "^1.0",
"laravel-admin-ext/helpers": "^1.1",
"laravel/framework": "5.8.*",
"laravel/passport": "7.4.*",
"laravel/tinker": "^1.0",
"dingo/api": "2.2.*",
"encore/laravel-admin": "1.7.7",
"fideloper/proxy": "^4.0",
"jxlwqq/screenfull": "^1.0",
"mpociot/laravel-apidoc-generator": "3.17.*",
"caouecs/laravel-lang": "~4.0"
说明:
整体 -----------------php laravel框架
国际化扩展------------caouecs/laravel-lang
后台管理---------------encore/laravel-admin
后台管理扩展-----------laravel-admin-ext/config(配置) laravel-admin-ext/helpers(小助手)jxlwqq/screenfull(全屏)
后台模块编写-----------helpers中脚手架来快速构建
前台oauth认证---------laravel中默认auth模块
前台接口文档-----------mpociot/laravel-apidoc-generator
接口管理--------------dingo/api
oauth认证------------laravel/passport
2.Dingo API+ laravel passport
Dingo API 负责api route 配置部分
passport 复杂oauth2.0认证
流程:
请求接口 => oauth认证授权=>重新发起请求=> 签名认证等安全认证 => 逻辑接口 => 数据返回
App目录结构
├── Admin
│ ├── bootstrap.php
│ ├── Controllers
│ │ ├── ApiLogController.php
│ │ ├── AuthController.php
│ │ ├── ExampleController.php
│ │ ├── HomeController.php
│ │ ├── OauthClientsController.php
│ │ └── UsersController.php
│ └── routes.php
├── Console
│ └── Kernel.php
├── Exceptions
│ └── Handler.php
├── Helpers
│ └── functions.php
├── Http
│ ├── Controllers
│ │ ├── Api
│ │ │ └── ProductController.php
│ │ ├── Auth
│ │ │ ├── ForgotPasswordController.php
│ │ │ ├── LoginController.php
│ │ │ ├── RegisterController.php
│ │ │ ├── ResetPasswordController.php
│ │ │ └── VerificationController.php
│ │ ├── Controller.php
│ │ └── HomeController.php
│ ├── Kernel.php
│ └── Middleware
│ ├── ApiSign.php
│ ├── Authenticate.php
│ ├── CheckForMaintenanceMode.php
│ ├── EncryptCookies.php
│ ├── RedirectIfAuthenticated.php
│ ├── TrimStrings.php
│ ├── TrustProxies.php
│ └── VerifyCsrfToken.php
├── Models
│ ├── ApiLogModel.php
│ ├── OauthClientsModel.php
│ └── UsersModel.php
├── Observers
│ └── ApiLogObserver.php
├── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
└── User.php
3.核心文件代码
ApiLogObserver api观察者类
namespace App\Observers;
class ApiLogObserver
{
private $startTime = 0;
private $stopTime = 0;
//开始运行时间
public function start()
{
$this->startTime = $this->getMicrotime();
}
//结束时间
public function stop()
{
$this->stopTime = $this->getMicrotime();
}
//开始和结束之间总时长
public function spentTime()
{
return ($this->stopTime - $this->startTime);
}
private function getMicrotime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
}
ApiSign api签名认证
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class ApiSign
{
private $rule = [
'api/test' => [
'keyId' => 'required|numeric|max:999999',
'sign' => 'required|max:32',
],
'api/accountInfo' => [
'keyId' => 'required|numeric|max:999999',
'sign' => 'required|max:32',
],
'api/submitOrder' => [
'keyId' => 'required|numeric|max:999999',
'sign' => 'required|max:32',
'orderJson' => 'required|json',
'updateJson' => '',
],
];
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//1.参数的验证
$routeName = $request->path();
if (!empty($this->rule[$routeName]))
{
$result = Validator::make($request->all(), $this->rule[$routeName]);
if ($result->fails())
{
return response()->json([
'message' => '不合法的请求参数',
//'errors' => $result->errors(),
'code' => '40001',
'data' => []
]);
}
}
//2.数据库验证
//获取用户key_screct
$authsiteInfo = DB::connection("mysql_shop")->table('authsite')->where('key_id', $request->input("keyId"))
->where('status', 1)->first();
if (empty($authsiteInfo))
{
return response()->json([
'message' => '不合法的请求参数: keyId非法',
'code' => '40002',
'data' => []
]);
}
//3.验证授权ip
if ($authsiteInfo->ip !='' && $authsiteInfo->ip != $request->ip())
{
return response()->json([
'message' => '不合法的请求参数: ip未授权',
'code' => '40005',
'data' => []
]);
}
//4.验证签名
$screctVal = $authsiteInfo->key_secret;
$requestArr = $request->input();
unset($requestArr['sign']);
//var_dump($this->getSign($requestArr, $screctVal));
if ($request->input("sign") != $this->getSign($requestArr, $screctVal))
{
return response()->json([
'message' => '不合法的请求参数: 签名sign错误',
'code' => '40003',
'data' => []
]);
}
return $next($request);
}
/**
* 获取sign
*/
private function getSign($tempArr, $randStr = '')
{
ksort($tempArr);
$signStr = "";
foreach ($tempArr as $key => $val)
{
$signStr .= $key . "=" . $val . "&";
}
$signStr = trim($signStr, "&");
return md5($signStr . $randStr);
}
}
DemoController 接口逻辑类
<?php
/**
* Created by PhpStorm.
* User:
* Date: 2019/10/22
* Time: 15:17
*/
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Observers\ApiLogObserver;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
/**
* @group 生产系统接口
*
* 接口为第三商城提供api接口,通过api接口可以提交绿爱生产系统!
*/
class DemoController extends Controller
{
protected $apiLogObserver;
protected $dbShop;
private $result = [
'code' => 0,
'message' => "",
'data' => []
];
//通过验证后开始提交标识
private $get_ins_id = 0;
public function __construct(ApiLogObserver $apiLogObserver)
{
$this->apiLogObserver = $apiLogObserver;
$this->apiLogObserver->start();
//商城数据库
$this->dbShop = DB::connection("mysql_shop");
}
/**
*
* 测试接口是否可用
*
* @bodyParam keyId string required 用户的appkey.
* @bodyParam sign string required 用户的签名.
*
* @authenticated
*
* @response {
* "code": 0,
* "massage": "测试可以正常使用",
* "data": []
* }
*/
public function test()
{
$this->result['massage'] = "测试可以正常使用";
return response()->json($this->result);
}
/**
*
* 查询用户平台的账户信息
*
* @bodyParam keyId string required 用户的appkey.
* @bodyParam sign string required 用户的签名.
*
* @authenticated
*
* @response {
* "code": 0,
* "massage": "查询成功",
* "data": ['balance']
* }
*/
public function getAccountInfo(Request $request)
{
// 验证
$keyId = $request->input('keyId');
$authsiteInfo = $this->dbShop->table('authsite')->select("balance")->where('status', 1)->where('key_id', $keyId)->first();
if (empty($authsiteInfo))
{
$this->result['code'] = "40002";
$this->result['message'] = "不合法的请求参数: key_id非法";
return $this->returnRespone();
}
//数据返回
$this->result['data']['balance'] = $authsiteInfo->balance;
$this->result['message'] = "查询成功";
return $this->returnRespone();
}
// 返回信息
private function returnRespone()
{
$this->apiLogObserver->stop();
return response()->json($this->result);
}
}
快速构建第三方api应用的更多相关文章
- 基于Go语言快速构建RESTful API服务
In this post, we will not only cover how to use Go to create a RESTful JSON API, but we will also ta ...
- Mysql EF Core 快速构建 Web Api
(1)首先创建一个.net core web api web项目; (2)因为我们使用的是ef连接mysql数据库,通过NuGet安装MySql.Data.EntityFrameworkCore,以来 ...
- 通过 SCF Component 轻松构建 REST API,再也不用熬夜加班了
本教程将分享如何通过 Serverless SCF Component .云函数 SCF 及 API 网关组件,快速构建一个 REST API 并实现 GET/PUT 操作. 当一个应用需要对第三方提 ...
- SpringBoot 快速构建微服务体系 知识点总结
可以通过http://start.spring.io/构建一个SpringBoot的脚手架项目 一.微服务 1.SpringBoot是一个可使用Java构建微服务的微框架. 2.微服务就是要倡导大家尽 ...
- 快速构建Windows 8风格应用12-SearchContract概述及原理
原文:快速构建Windows 8风格应用12-SearchContract概述及原理 本篇博文主要介绍Search Contract概述.Search Contract面板结构剖析.Search Co ...
- 快速构建Windows 8风格应用33-构建锁屏提醒
原文:快速构建Windows 8风格应用33-构建锁屏提醒 引言 Windows Phone(8&7.5)和Windows 8引入了锁屏概念,其实做过Windows Phone 7.5应用开发 ...
- 使用Vue.js和Axios从第三方API获取数据 — SitePoint
更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩.维基百科.org /维基/ application_programming_ ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
随机推荐
- CodeForces 375D Tree and Queries
传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...
- ssh批量免密
expect命令在linux下实现批量ssh免密 发布时间:2017-11-27 08:41:39 投稿:laozhang 本次文章主要给大家讲解了在linux系统下用expect命令实现批量ssh免 ...
- 使用springboot + druid + mybatisplus完成多数据源配置
一. 简介 1. 版本 springboot版本为2.0.3.RELEASE,mybatisplus版本为2.1.9, druid版本为1.1.9,swagger版本为2.7.0 2. 项目地址 ...
- 洛谷p1345---最小割的奇妙运用
让你去掉最少的点,使得c1和c2变得不连通,你有办法吗??? 这是最小割呀!!! 网络流的最小割去掉的是边,构造边的顶点的唯一关系就好了!!! 需要注意一点 #include<iostream& ...
- net core天马行空系列:SummerBoot,将SpringBoot的先进理念与C#的简洁优雅合二为一
系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 3.net core ...
- vue项目创建步骤 和 路由router知识点
菜单快捷导航: vue项目创建 vue路由router知识点(路径参数.查询参数.命名路由.嵌套路由.命名视图.hash/history模式) 1.创建一个vue项目步骤 (windows环境下).创 ...
- 【阿里云IoT+YF3300】10.快速开发188协议设备驱动
188协议的全称为CJ-T188-2004 <户用计量仪表数据传输技术条件>,是针对水表.燃气表.热量表和其他集中采集的一个国家行业标准协议. YFIOs就是YFSoft I/O Serv ...
- spring之通过注解方式配置Bean(一)
(1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...
- PythonI/O进阶学习笔记_9.python的生成器
content: 1. 什么是生成器 2. 生成器的实现 3. 生成器的应用 一.生成器简介 1.什么是生成器 在 Python 中,使用了 yield 的函数被称为生成器(genera ...
- postman 的基础使用篇(一)
简介 postman 是接口协作开发的优秀平台,可以用来进行接口设计.构建和调试,之前以chrome插件的形式,现在也有原生APP. 安装 Native app 通过链接 download page ...