多系统对接-签名校验案例(PHP)

config/Sign.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php

// 第三方平台调用『当前系统』接口的签名密钥
return [
    // 签名生命周期设置,单位秒
    'sign_ttl' => env('SIGN_TTL', 600),

    // 签名类型
    'sign_type_xxx' => 'xxx', //  xxx系统
    'sign_type_test' => 'test', //  test系统

    // 密钥
    'sign_type_secret' => [
        'xxx' => env('SIGN_SECRET_XXX', 'test_123456'),
        'test' => env('SIGN_SECRET_TEST', 'test_123456'),
    ],
];

app/Services/AuthSign.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php

namespace App\Services;

// 第三方平台请求的签名校验
class AuthSign
{
    /**
     * 签名校验
     * @param string $signType 签名类型,对接哪个第三方系统的标识
     * @param string $sign 签名
     * @param int $requestTime 请求时间戳
     * @return array
     */
    public static function checkSign(string $signType, string $sign, int $requestTime): array
    {
        // 签名类型:新增对外接口签名类型时,需要去配置新的签名类型和密钥
        $signSecret = config('sign.sign_type_secret')[$signType] ?? '';

        if ($signSecret == '') {
            return ['result' => false, 'msg' => '该签名类型还没配置'];
        }

        if ($sign != md5("{$requestTime}-{$signType}-{$signSecret}")) {
            return ['result' => false, 'msg' => '签名有误'];
        }

        $currentTime = time();
        if ($currentTime < $requestTime || ($currentTime-$requestTime) > config('sign.sign_ttl')) {
            return ['result' => false, 'msg' => '签名已过期'];
        }

        return ['result' => true, 'msg' => '签名校验成功'];
    }

    /**
     * 生成签名
     * @param string $signType 签名类型,对接哪个第三方系统的标识
     * @return array
     */
    public static function getSign(string $signType): array
    {
        $signSecret = config('sign.sign_type_secret')[$signType] ?? '';
        if ($signSecret == '') {
            return ['result' => false, 'msg' => '该签名类型还没配置'];
        }
        $requestTime = time();
        return ['result' => true, 'time' => $requestTime, 'sign' => md5("{$requestTime}-{$signType}-{$signSecret}")];
    }
}

app/Http/Middleware/AuthSignTest.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

namespace App\Http\Middleware;

use App\Facades\Response;
use Symfony\Component\HttpFoundation\Response as FoundationResponse;
use Closure;

// 『test系统』请求『当前系统』接口的签名校验
class AuthSignTest
{
    public function handle($request, Closure $next)
    {
        $sign = $request->header('sign') ?: '';
        $time = $request->header('time') ? : '';

        if (empty($sign) || empty($time)) {
            return Response::fail('传参有误', [], FoundationResponse::HTTP_UNAUTHORIZED);
        }

        $signData = \App\Services\AuthSign::checkSign(config('sign.sign_type_test'), $sign, (int)$time);
        if (!$signData['result']) {
            return Response::fail("sign校验失败:{$signData['msg']}", [], FoundationResponse::HTTP_UNAUTHORIZED);
        }

        return $next($request);
    }
}

app/Http/Kernel.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    // 注册中间件
    protected $routeMiddleware = [
        'auth.test' => \App\Http\Middleware\AuthSignTest::class,
    ];
}

routes/api_sign.php

1
2
3
4
5
6
<?php

// 路由使用签名做校验
Route::group(['prefix' => 'mini', 'middleware' => ['auth.test', 'request.log'], 'namespace' => 'test'], function () {
    Route::put('xxx', 'SignController@setXXX');
});

两分钟规则

2分钟规则

每当你发现很难开始执行某项任务时,可以试试将其缩减成2分钟的版本。

  • 看一本书 → 看一页书
  • 写一篇文章 → 写一句话
  • 跑10公里 → 穿上跑鞋
  • 做100次俯卧撑 → 做1次俯卧撑
  • 多吃蔬菜水果 → 吃一个水果
  • 编写一个程序 → 编写一个函数 → 编写一行代码

这样做的目的是使上手变得超级容易,让你先上手再说。一旦开始做了(这可能是最艰难的一步),你就会开始有动力,可能会继续做下去。

http和https

HTTP的通信技术发展史

网络传输

互联网传输的三个非常重要的特点:延时、丢包、抖动。

延时和抖动天生就紧密相连,但它们其实并不同。延时是 数据 从网络上的一个端点移动到另一个端点所花费的时间,这是一个受多种因素影响的复杂的值。另一方面,抖动是两个 数据包 之间的延时差异。

孩子教育记录

兴趣班学习时间

  1. 从小学开始就要鼓励孩子探索自己的兴趣爱好,培养独立思考和创新精神
  2. 三年级之前都是以启蒙为主,三年级后才能真正开始入门学习

注意事项

电视等电子产品使用注意

素描简单了解

素描的定义

使用单一色彩表现明度变化的绘画。

素描是绘画的基础,绘画的骨骼;也是最节制、最需要理智来协助的艺术。

素描学习成长路线

  • 第一阶段:素描石膏几何体
  • 第二阶段:素描静物
  • 第三阶段:素描动物
  • 第四阶段:人物素描/风景素描/动画素描

初学者需要哪些必备工具

铅笔+橡皮+素描纸+画板或速写板+美工刀或转笔刀

微服务

为什么要用微服务

小项目发展到大项目过程中,出于维护、稳定性等考虑,将一个整体项目分为多个微小服务。

为什么说做好微服务很难

要想做好微服务,我们需要理解和掌握的知识点非常多,从几个维度上来说:

OLTP和OLAP

根据数据库处理的业务数据量,以及处理数据的不同方式,人们把数据库分为 OLTP 和 OLAP 两大类型。

OLTP vs OLAP

常见的 Oracle、MySQL 等数据库都属于 OLTP 类型,也就是 On-Line Transaction Processing,联机事务处理。OLTP 数据库处理请求和数据时对延迟要求很高,并且要保证数据的完整性和一致性。此类数据库是面向最终客户的,需要具备 7x24 不间断服务能力。

悟道

佛说,苦非苦,乐非乐,只是一时的执念而已。执于一念,将受困于一念;一念放下,会自在于心间。有些人,有些事,只可遇而不可求,既然这样,何不将心胸放宽,顺其自然?

可视化工具

Metabase

概述

Metabase可以帮助你把数据库中的数据更好的呈现给更多人,数据分析人员通过建立一个”查询“(Metabase中定义为Question)来提炼数据,再通过仪表盘(Dashboards)来组合展示给公司成员

PHP-FPM

PHP-FPM

CGI是Common Gateway Interface(通用网管协议),用于让交互程序和Web服务器通信的协议。它负责处理URL的请求,启动一个进程,将客户端发送的数据作为输入,由Web服务器收集程序的输出并加上合适的头部,再发送回客户端。