1.使用框架和扩展

详细请看composer.json

  1. "php": "^7.1.3",
  2. "laravel-admin-ext/config": "^1.0",
  3. "laravel-admin-ext/helpers": "^1.1",
  4. "laravel/framework": "5.8.*",
  5. "laravel/passport": "7.4.*",
  6. "laravel/tinker": "^1.0",
  7. "dingo/api": "2.2.*",
  8. "encore/laravel-admin": "1.7.7",
  9. "fideloper/proxy": "^4.0",
  10. "jxlwqq/screenfull": "^1.0",
  11. "mpociot/laravel-apidoc-generator": "3.17.*",
  12. "caouecs/laravel-lang": "~4.0"

说明:

  1. 整体 -----------------php laravel框架
  2. 国际化扩展------------caouecs/laravel-lang
  3. 后台管理---------------encore/laravel-admin
  4. 后台管理扩展-----------laravel-admin-ext/config(配置) laravel-admin-ext/helpers(小助手)jxlwqq/screenfull(全屏)
  5. 后台模块编写-----------helpers中脚手架来快速构建
  6. 前台oauth认证---------laravel中默认auth模块
  7. 前台接口文档-----------mpociot/laravel-apidoc-generator
  8. 接口管理--------------dingo/api
  9. oauth认证------------laravel/passport

2.Dingo API+ laravel passport

Dingo API 负责api route 配置部分

passport 复杂oauth2.0认证

流程:

  1. 请求接口 => oauth认证授权=>重新发起请求=> 签名认证等安全认证 => 逻辑接口 => 数据返回

App目录结构

  1. ├── Admin
  2.    ├── bootstrap.php
  3.    ├── Controllers
  4.       ├── ApiLogController.php
  5.       ├── AuthController.php
  6.       ├── ExampleController.php
  7.       ├── HomeController.php
  8.       ├── OauthClientsController.php
  9.       └── UsersController.php
  10.    └── routes.php
  11. ├── Console
  12.    └── Kernel.php
  13. ├── Exceptions
  14.    └── Handler.php
  15. ├── Helpers
  16.    └── functions.php
  17. ├── Http
  18.    ├── Controllers
  19.       ├── Api
  20.          └── ProductController.php
  21.       ├── Auth
  22.          ├── ForgotPasswordController.php
  23.          ├── LoginController.php
  24.          ├── RegisterController.php
  25.          ├── ResetPasswordController.php
  26.          └── VerificationController.php
  27.       ├── Controller.php
  28.       └── HomeController.php
  29.    ├── Kernel.php
  30.    └── Middleware
  31.    ├── ApiSign.php
  32.    ├── Authenticate.php
  33.    ├── CheckForMaintenanceMode.php
  34.    ├── EncryptCookies.php
  35.    ├── RedirectIfAuthenticated.php
  36.    ├── TrimStrings.php
  37.    ├── TrustProxies.php
  38.    └── VerifyCsrfToken.php
  39. ├── Models
  40.    ├── ApiLogModel.php
  41.    ├── OauthClientsModel.php
  42.    └── UsersModel.php
  43. ├── Observers
  44.    └── ApiLogObserver.php
  45. ├── Providers
  46.    ├── AppServiceProvider.php
  47.    ├── AuthServiceProvider.php
  48.    ├── BroadcastServiceProvider.php
  49.    ├── EventServiceProvider.php
  50.    └── RouteServiceProvider.php
  51. └── User.php

3.核心文件代码

ApiLogObserver api观察者类

  1. namespace App\Observers;
  2. class ApiLogObserver
  3. {
  4. private $startTime = 0;
  5. private $stopTime = 0;
  6. //开始运行时间
  7. public function start()
  8. {
  9. $this->startTime = $this->getMicrotime();
  10. }
  11. //结束时间
  12. public function stop()
  13. {
  14. $this->stopTime = $this->getMicrotime();
  15. }
  16. //开始和结束之间总时长
  17. public function spentTime()
  18. {
  19. return ($this->stopTime - $this->startTime);
  20. }
  21. private function getMicrotime()
  22. {
  23. list($usec, $sec) = explode(' ', microtime());
  24. return ((float)$usec + (float)$sec);
  25. }
  26. }

ApiSign api签名认证

  1. namespace App\Http\Middleware;
  2. use Closure;
  3. use Illuminate\Support\Facades\DB;
  4. use Illuminate\Support\Facades\Validator;
  5. class ApiSign
  6. {
  7. private $rule = [
  8. 'api/test' => [
  9. 'keyId' => 'required|numeric|max:999999',
  10. 'sign' => 'required|max:32',
  11. ],
  12. 'api/accountInfo' => [
  13. 'keyId' => 'required|numeric|max:999999',
  14. 'sign' => 'required|max:32',
  15. ],
  16. 'api/submitOrder' => [
  17. 'keyId' => 'required|numeric|max:999999',
  18. 'sign' => 'required|max:32',
  19. 'orderJson' => 'required|json',
  20. 'updateJson' => '',
  21. ],
  22. ];
  23. /**
  24. * Handle an incoming request.
  25. *
  26. * @param \Illuminate\Http\Request $request
  27. * @param \Closure $next
  28. * @return mixed
  29. */
  30. public function handle($request, Closure $next)
  31. {
  32. //1.参数的验证
  33. $routeName = $request->path();
  34. if (!empty($this->rule[$routeName]))
  35. {
  36. $result = Validator::make($request->all(), $this->rule[$routeName]);
  37. if ($result->fails())
  38. {
  39. return response()->json([
  40. 'message' => '不合法的请求参数',
  41. //'errors' => $result->errors(),
  42. 'code' => '40001',
  43. 'data' => []
  44. ]);
  45. }
  46. }
  47. //2.数据库验证
  48. //获取用户key_screct
  49. $authsiteInfo = DB::connection("mysql_shop")->table('authsite')->where('key_id', $request->input("keyId"))
  50. ->where('status', 1)->first();
  51. if (empty($authsiteInfo))
  52. {
  53. return response()->json([
  54. 'message' => '不合法的请求参数: keyId非法',
  55. 'code' => '40002',
  56. 'data' => []
  57. ]);
  58. }
  59. //3.验证授权ip
  60. if ($authsiteInfo->ip !='' && $authsiteInfo->ip != $request->ip())
  61. {
  62. return response()->json([
  63. 'message' => '不合法的请求参数: ip未授权',
  64. 'code' => '40005',
  65. 'data' => []
  66. ]);
  67. }
  68. //4.验证签名
  69. $screctVal = $authsiteInfo->key_secret;
  70. $requestArr = $request->input();
  71. unset($requestArr['sign']);
  72. //var_dump($this->getSign($requestArr, $screctVal));
  73. if ($request->input("sign") != $this->getSign($requestArr, $screctVal))
  74. {
  75. return response()->json([
  76. 'message' => '不合法的请求参数: 签名sign错误',
  77. 'code' => '40003',
  78. 'data' => []
  79. ]);
  80. }
  81. return $next($request);
  82. }
  83. /**
  84. * 获取sign
  85. */
  86. private function getSign($tempArr, $randStr = '')
  87. {
  88. ksort($tempArr);
  89. $signStr = "";
  90. foreach ($tempArr as $key => $val)
  91. {
  92. $signStr .= $key . "=" . $val . "&";
  93. }
  94. $signStr = trim($signStr, "&");
  95. return md5($signStr . $randStr);
  96. }
  97. }

DemoController 接口逻辑类

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User:
  5. * Date: 2019/10/22
  6. * Time: 15:17
  7. */
  8. namespace App\Http\Controllers\Api;
  9. use App\Http\Controllers\Controller;
  10. use App\Observers\ApiLogObserver;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\DB;
  13. /**
  14. * @group 生产系统接口
  15. *
  16. * 接口为第三商城提供api接口,通过api接口可以提交绿爱生产系统!
  17. */
  18. class DemoController extends Controller
  19. {
  20. protected $apiLogObserver;
  21. protected $dbShop;
  22. private $result = [
  23. 'code' => 0,
  24. 'message' => "",
  25. 'data' => []
  26. ];
  27. //通过验证后开始提交标识
  28. private $get_ins_id = 0;
  29. public function __construct(ApiLogObserver $apiLogObserver)
  30. {
  31. $this->apiLogObserver = $apiLogObserver;
  32. $this->apiLogObserver->start();
  33. //商城数据库
  34. $this->dbShop = DB::connection("mysql_shop");
  35. }
  36. /**
  37. *
  38. * 测试接口是否可用
  39. *
  40. * @bodyParam keyId string required 用户的appkey.
  41. * @bodyParam sign string required 用户的签名.
  42. *
  43. * @authenticated
  44. *
  45. * @response {
  46. * "code": 0,
  47. * "massage": "测试可以正常使用",
  48. * "data": []
  49. * }
  50. */
  51. public function test()
  52. {
  53. $this->result['massage'] = "测试可以正常使用";
  54. return response()->json($this->result);
  55. }
  56. /**
  57. *
  58. * 查询用户平台的账户信息
  59. *
  60. * @bodyParam keyId string required 用户的appkey.
  61. * @bodyParam sign string required 用户的签名.
  62. *
  63. * @authenticated
  64. *
  65. * @response {
  66. * "code": 0,
  67. * "massage": "查询成功",
  68. * "data": ['balance']
  69. * }
  70. */
  71. public function getAccountInfo(Request $request)
  72. {
  73. // 验证
  74. $keyId = $request->input('keyId');
  75. $authsiteInfo = $this->dbShop->table('authsite')->select("balance")->where('status', 1)->where('key_id', $keyId)->first();
  76. if (empty($authsiteInfo))
  77. {
  78. $this->result['code'] = "40002";
  79. $this->result['message'] = "不合法的请求参数: key_id非法";
  80. return $this->returnRespone();
  81. }
  82. //数据返回
  83. $this->result['data']['balance'] = $authsiteInfo->balance;
  84. $this->result['message'] = "查询成功";
  85. return $this->returnRespone();
  86. }
  87. // 返回信息
  88. private function returnRespone()
  89. {
  90. $this->apiLogObserver->stop();
  91. return response()->json($this->result);
  92. }
  93. }

快速构建第三方api应用的更多相关文章

  1. 基于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 ...

  2. Mysql EF Core 快速构建 Web Api

    (1)首先创建一个.net core web api web项目; (2)因为我们使用的是ef连接mysql数据库,通过NuGet安装MySql.Data.EntityFrameworkCore,以来 ...

  3. 通过 SCF Component 轻松构建 REST API,再也不用熬夜加班了

    本教程将分享如何通过 Serverless SCF Component .云函数 SCF 及 API 网关组件,快速构建一个 REST API 并实现 GET/PUT 操作. 当一个应用需要对第三方提 ...

  4. SpringBoot 快速构建微服务体系 知识点总结

    可以通过http://start.spring.io/构建一个SpringBoot的脚手架项目 一.微服务 1.SpringBoot是一个可使用Java构建微服务的微框架. 2.微服务就是要倡导大家尽 ...

  5. 快速构建Windows 8风格应用12-SearchContract概述及原理

    原文:快速构建Windows 8风格应用12-SearchContract概述及原理 本篇博文主要介绍Search Contract概述.Search Contract面板结构剖析.Search Co ...

  6. 快速构建Windows 8风格应用33-构建锁屏提醒

    原文:快速构建Windows 8风格应用33-构建锁屏提醒 引言 Windows Phone(8&7.5)和Windows 8引入了锁屏概念,其实做过Windows Phone 7.5应用开发 ...

  7. 使用Vue.js和Axios从第三方API获取数据 — SitePoint

    更多的往往不是,建立你的JavaScript应用程序时,你会想把数据从远程源或消耗一个[ API ](https:/ /恩.维基百科.org /维基/ application_programming_ ...

  8. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...

  9. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

随机推荐

  1. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  2. ssh批量免密

    expect命令在linux下实现批量ssh免密 发布时间:2017-11-27 08:41:39 投稿:laozhang 本次文章主要给大家讲解了在linux系统下用expect命令实现批量ssh免 ...

  3. 使用springboot + druid + mybatisplus完成多数据源配置

    一. 简介 1. 版本 springboot版本为2.0.3.RELEASE,mybatisplus版本为2.1.9, druid版本为1.1.9,swagger版本为2.7.0 2. 项目地址   ...

  4. 洛谷p1345---最小割的奇妙运用

    让你去掉最少的点,使得c1和c2变得不连通,你有办法吗??? 这是最小割呀!!! 网络流的最小割去掉的是边,构造边的顶点的唯一关系就好了!!! 需要注意一点 #include<iostream& ...

  5. net core天马行空系列:SummerBoot,将SpringBoot的先进理念与C#的简洁优雅合二为一

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 3.net core ...

  6. vue项目创建步骤 和 路由router知识点

    菜单快捷导航: vue项目创建 vue路由router知识点(路径参数.查询参数.命名路由.嵌套路由.命名视图.hash/history模式) 1.创建一个vue项目步骤 (windows环境下).创 ...

  7. 【阿里云IoT+YF3300】10.快速开发188协议设备驱动

    188协议的全称为CJ-T188-2004 <户用计量仪表数据传输技术条件>,是针对水表.燃气表.热量表和其他集中采集的一个国家行业标准协议. YFIOs就是YFSoft I/O Serv ...

  8. spring之通过注解方式配置Bean(一)

    (1)组件扫描:spring能够从classpath下自动扫描.侦测和实例化具有特定注解的组件. (2)特定组件包括: @Component:基本注解,标识一个受spring管理的组件: @Respo ...

  9. PythonI/O进阶学习笔记_9.python的生成器

     content: 1. 什么是生成器 2. 生成器的实现 3. 生成器的应用   一.生成器简介 1.什么是生成器     在 Python 中,使用了 yield 的函数被称为生成器(genera ...

  10. postman 的基础使用篇(一)

    简介 postman 是接口协作开发的优秀平台,可以用来进行接口设计.构建和调试,之前以chrome插件的形式,现在也有原生APP. 安装 Native app 通过链接 download page  ...