Passed
Pull Request — master (#909)
by Songda
02:02
created

AddPayloadSignaturePlugin::getSign()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 9
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yansongda\Pay\Plugin\Alipay;
6
7
use Closure;
8
use Yansongda\Pay\Contract\PluginInterface;
9
use Yansongda\Pay\Exception\ContainerException;
10
use Yansongda\Pay\Exception\Exception;
11
use Yansongda\Pay\Exception\InvalidConfigException;
12
use Yansongda\Pay\Exception\ServiceNotFoundException;
13
use Yansongda\Pay\Logger;
14
use Yansongda\Pay\Rocket;
15
16
use function Yansongda\Pay\get_alipay_config;
17
use function Yansongda\Pay\get_private_cert;
18
19
class AddPayloadSignaturePlugin implements PluginInterface
20
{
21
    /**
22
     * @throws ContainerException
23
     * @throws InvalidConfigException
24
     * @throws ServiceNotFoundException
25
     */
26
    public function assembly(Rocket $rocket, Closure $next): Rocket
27
    {
28
        Logger::debug('[Alipay][AddPayloadSignaturePlugin] 插件开始装载', ['rocket' => $rocket]);
29
30
        $rocket->mergePayload(['sign' => $this->getSign($rocket)]);
31
32
        Logger::info('[Alipay][AddPayloadSignaturePlugin] 插件装载完毕', ['rocket' => $rocket]);
33
34
        return $next($rocket);
35
    }
36
37
    /**
38
     * @throws ContainerException
39
     * @throws InvalidConfigException
40
     * @throws ServiceNotFoundException
41
     */
42
    protected function getSign(Rocket $rocket): string
43
    {
44
        $privateKey = $this->getPrivateKey($rocket->getParams());
45
46
        $content = $rocket->getPayload()->sortKeys()->toString();
47
48
        openssl_sign($content, $sign, $privateKey, OPENSSL_ALGO_SHA256);
49
50
        return base64_encode($sign);
51
    }
52
53
    /**
54
     * @throws ContainerException
55
     * @throws InvalidConfigException
56
     * @throws ServiceNotFoundException
57
     */
58
    protected function getPrivateKey(array $params): string
59
    {
60
        $privateKey = get_alipay_config($params)['app_secret_cert'] ?? null;
61
62
        if (is_null($privateKey)) {
63
            throw new InvalidConfigException(Exception::CONFIG_ALIPAY_INVALID, '配置异常: 缺少支付宝配置 -- [app_secret_cert]');
64
        }
65
66
        return get_private_cert($privateKey);
67
    }
68
}
69