ApimSign.php 2.44 KB
<?php
/**
 * Created by PhpStorm.
 * User: ChuXiang
 * Date: 2019/8/15
 * Time: 14:29
 */

namespace PgServiceSdk\Kernel\Library\Apim;


class ApimSign
{
    /**
     * GET 请求生产签名
     *
     * @param string $secret
     * @param string $apiKey
     * @param string $nonceStr
     * @param string $timeStamp
     * @param array  $query
     *
     * @return string
     */
    public static function getQuerySign($secret, $apiKey, $nonceStr, $timeStamp, array $query = [])
    {
        return self::getSign($query, $secret, $apiKey, $nonceStr, $timeStamp);
    }

    /**
     * 表单请求生产签名
     *
     * @param string $secret
     * @param string $apiKey
     * @param string $nonceStr
     * @param string $timeStamp
     * @param array  $from
     * @param array  $query
     *
     * @return string
     */
    public static function postFromSign($secret, $apiKey, $nonceStr, $timeStamp, array $from = [], array $query = [])
    {
        return self::getSign(array_merge($from, $query), $secret, $apiKey, $nonceStr, $timeStamp);
    }


    /**
     * JSON POST 请求生产签名
     *
     * @param string $secret
     * @param string $apiKey
     * @param string $nonceStr
     * @param string $timeStamp
     * @param array  $data
     * @param array  $query
     *
     * @return string
     */
    public static function postBodySign($secret, $apiKey, $nonceStr, $timeStamp, array $data = [], array $query = [])
    {
        $jsonRequestData = json_encode(empty($data) ? (object)$data : $data, 320);
        $query['body'] = $jsonRequestData;
        return self::getSign($query, $secret, $apiKey, $nonceStr, $timeStamp);
    }

    /**
     * 生产签名
     *
     * @param array $params
     * @param string $secret
     * @param string $apiKey
     * @param string $nonceStr
     * @param string $timeStamp
     *
     * @return string
     */
    public static function getSign(array $params, $secret, $apiKey, $nonceStr, $timeStamp)
    {
        $defaultParams = [
            'api_key' => $apiKey,
            'nonce_str' => $nonceStr,
            'timestamp' => $timeStamp,
        ];

        $signParams = array_merge($params, $defaultParams);
        // 按照字典排序
        ksort($signParams, SORT_STRING);
        // 以 & 链接并且前后拼接 secret
        $tmp = $secret . urldecode(http_build_query($signParams)) . $secret;
        // SHA 256 加密后,全部转大写
        return strtoupper(hash('sha256', $tmp));
    }
}