Verify.php 2.1 KB
<?php

namespace Lackoxygen\TiktokShop\Support;

use Illuminate\Support\Arr;
use Lackoxygen\TiktokShop\Application;
use Lackoxygen\TiktokShop\Attribute\Config\Config;
use Lackoxygen\TiktokShop\Attribute\Config\Option;
use Lackoxygen\TiktokShop\ServiceProvider;
use Illuminate\Http\Request;

class Verify extends Config
{
    /**
     * @var Signature
     */
    protected Signature $signature;

    /**
     * @param Option $option
     */
    public function __construct(Option $option)
    {
        parent::__construct($option);

        $this->signature = new Signature($option);
    }

    /**
     * @param string $sign
     * @param string $body
     * @return bool
     */
    public function md5(string $sign, string $body): bool
    {
        $md5 = $this->signature->md5(
            $this->config->getAppKey() .
            $body .
            $this->config->getAppSecret()
        );
        return $md5 === $sign;
    }

    /**
     * @param string $sign
     * @param string $body
     * @return bool
     */
    public function sha256(string $sign, string $body): bool
    {
        $sha256 = $this->signature->sha256(
            $body
        );

        return $sha256 === $sign;
    }

    /**
     * @param string $sign
     * @param string $body
     * @param string $signMethod
     * @param string $appid
     * @return bool|void
     */
    public function through(string $sign, string $body, string $signMethod, string $appid)
    {
        $configs = \config(ServiceProvider::$name);

        $appName = null;

        foreach ($configs as $name => $config) {
            if (Arr::get($config, 'app_key') === $appid) {
                $appName = $name;
                break;
            }
        }

        if (!$appName) {
            throw new \InvalidArgumentException('Unknown application information');
        }

        $config = Arr::get($configs, $appName);

        $this->config = Application::newConfigFormArray($config);

        switch ($signMethod) {
            case 'hmac-sha256':
                return $this->sha256($sign, $body);
            case 'md5':
                return $this->md5($sign, $body);
        }
    }
}