编辑代码

<?php 
//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
class SignUtils
{

    function getSign($array, $merchantSecretKey) {
        $result = "";
        try {
            $keys = array_keys($array);
            sort($keys);            
            $str = "";
            foreach ($keys as $key) {                
                $val = $array[$key];
                if (!empty($val) && $key != "sign") {                    
                    $str .= $key . "=" . $val . "&";
                }
            }
            $str = $str . "key=" . $merchantSecretKey;
            $result = $str;
        } catch (Exception $e) {
            return null;
        }
        return $result;
    }
}

class SHA256WithRSAUtils
{

    /**
     * 初始化RSA算法密钥对
     *
     * @param int $keysize RSA1024已经不安全了,建议2048
     * 
     * 使用示例
     * 调用函数生成 RSA 密钥对,指定密钥长度为 2048 位
        $result = initRSAKey(2048);

        echo "私钥:\n";
        echo $result['private_key'] . "\n";

        echo "公钥:\n";
        echo $result['public_key'] . "\n";
     */
    public function initRSAKey($keysize=2048) {
        $config = array(
            "digest_alg" => "sha256",
            "private_key_bits" => $keysize,
            "private_key_type" => OPENSSL_KEYTYPE_RSA,
        );
        // 生成新的 RSA 密钥对,使用 SHA256 算法
        $rsaKey = openssl_pkey_new($config);

        // 获取私钥
        openssl_pkey_export($rsaKey, $privateKey);

        // 获取公钥
        $publicKey = openssl_pkey_get_details($rsaKey);
        $publicKey = $publicKey["key"];

        return array(
            'public_key' => $publicKey,
            'private_key' => $privateKey
        );
    }

    /**
     * 获取完整的私钥
     * $privateKey; 私钥内容,不要头尾和换行符,只要内容
     */
    public function getPrivateKey($privateKey)
    {
        $pem = "-----BEGIN RSA PRIVATE KEY-----" . PHP_EOL;

        $pem .= chunk_split($privateKey, 64, PHP_EOL);

        $pem .= "-----END RSA PRIVATE KEY-----" . PHP_EOL;

        return openssl_pkey_get_private($pem);
    }

    /**
     * 获取完整的公钥
     * @return bool|resource
     * $publicKey; 公钥内容,不要头尾和换行符,只要内容
     */
    public function getPublicKey($publicKey)
    {
        $pem = "-----BEGIN PUBLIC KEY-----" . PHP_EOL;

        $pem .= chunk_split($publicKey, 64, PHP_EOL);

        $pem .= "-----END PUBLIC KEY-----" . PHP_EOL;

        return openssl_pkey_get_public($pem);
    }

    /**
     * 私钥加密
     * @param string $data 要加密的数据
     * @param string $privateKey 私钥
     * @return 加密后的字符串
     */
    public function buildRSASignByPrivateKey($data,$privateKey)
    {
        $privatekey = openssl_get_privatekey($this->getPrivateKey($privateKey));
        //php5.4+ OPENSSL_ALGO_SHA256
        openssl_sign($data, $result, $privatekey, OPENSSL_ALGO_SHA256);
        //php5.3 SHA256
        //openssl_sign($data, $result, $privatekey, 'SHA256');
        $result = base64_encode($result);
        return $result;
    }

    /**
     * 公钥验证
     * @param string $data 源数据
     * @param string $publicKey 公钥
     * @param string $sign 校验的加密字符串
     * @return boolean true代表验证成功,false代表验证失败
     */
    public function buildRSAverifyByPublicKey($data,$publicKey,$sign)
    {
        $publicKey = openssl_get_publickey($this->getPublicKey($publicKey));
        //php5.4+ OPENSSL_ALGO_SHA256
        $result = openssl_verify($data, base64_decode($sign), $publicKey, OPENSSL_ALGO_SHA256) == 1 ? true : false;
        //php5.3 SHA256
        //$result = openssl_verify($data, base64_decode($sign), $publicKey, 'SHA256') == 1 ? true : false;
        return $result;

    }
}


class Abc{

    const API_HOST = 'https://uat-interface.haipay.asia';

    public function buildSign(){
        $request = array(
            "merId" => "320",
            "orderNo" => "1000"
        );
        $this->buildSign($request);
    }
    public function run($params){
        $publicKey  = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqNAaegEWhN8X0OcoLILHm4CH18Hj/dOHPj03Kr7g8uRXu3HSdDDEOJouIs4voyi+dDuo3uyFhPJ7y+26nBpr6/dVyRyL0N9E0T3lztSY1NCb7saQEuScElC7naDig8CdqTKW6z917L3eIFJmByjpUObczAwHdIPVIx2kG6l9ag3t7WOwR5PTXUbw4e4hedBZg9NogHq8mQPVPrWZvjyOpf8g7tg3qxfTsHrHqnmhMFyX0uWNgh9BE5j9eO4Sxymzrvdgg5WntQoCtFVE2Bp3haGD8KVnkrvme1xdu/NyWmvyUuc7Kv/wsh8e47xnF+mtCzgsUDX1y1QjXFKCTWAubQIDAQAB';
        $privateKey = 'MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCKqgxszb4ObuoJ5U8Ddz2ytOFFc81fmniRFo+jvNtrOegMUpd9gBPvMEaBzdeJC74Cg/HsAE7f9u24APLi0oLYZCwthhs01xTIhAis8h7IYCSdWrcbn8gpB7apSe4Ud0dS6zkuRcDTVGsLNrzNOMKHfT8S13dtsqDyDBBhSpkBwe9TkeLQB8K5ZjDYJ8uTtsrcey95eNFe22r8qAhv562yUBTG0PjZpQmiJWD0T6URLLzNYEOXEzsVVZgPKBNWSVZvMjLg32eFv/2Mw+x83n44w39FLx6E347A5hVQYWbBLuHDyFUzW/endOmMSj1YJmGDhctgEK+UIA1bNbexYo33AgMBAAECggEAZlZ6NRLjYeOZ9xO17OjkMDAu0gNVX2mx8eKkwENx7QEfsXiDNayBCdanMsWofQydf13B/lt72u9zIooQuDaFOw8zS6XeDnFudU582KcY8OmEHF4HJewW3bFDrk1R2OjvStMvsGbqmQ2EsxIC5bMuXrChDFbZXayn+/vLWwKjShetqPkN2cRHcKWaASqOnWOAnpgHm5VuGu2ttaR5K14pmMq7a0TOaj7lDYyHelWejCfqFFiWfYLefNj3oFVAfiNxwsxj8q42xWwPZ/Xzhn8p0cInja//1AMuNLIadyC4r6VR7cOIKm4F7XwCTCRCSmPbhDu5pOEA//pERFTTNtE7gQKBgQDdzbujAJRqkn0WwPtbKE7ZxR2KFjc4fM1LyPyODz4tbXhtXtZeMcjjsKn8pTpzbgj+Cfmhz9X8sKAqdxe1WJTtkgg5zbvPQ8A+Q0Su19LZMfFCuC0RCp1SX/asl4XeQe6fQZCft3AG7RgA5HjHET0/7Mpwb3C7A/xBwMfn51T0+wKBgQCgCuy9NmpG2bG/MEz1gDojYe08yKOGgTLp6v/UZcn+U6Oit37/sFe0vU7n9NMtkCLdhf2mqF1cNCUv+rzHkvtgG8FaNlsuozOMXuTNCJ6nj/IypMOnU8vV9DL9zUq5cUnny7HKwCTuS8FYZTjI75GfDDwrxIhhzOIkh2leQD+iNQKBgDV1xOgA18ToEeZOFUdfa8HpVLlXqW+gBQtjIhxLaD0iyYfy99A0R6s5hX8zg+cWemxgkx6BLZ5+I9yYX8qB00N/kyP7hmzqc4eORxutQVDATNo78gDNgiW8o4Pt8YIkehNAhk84s3O36bUtXD7+1Lh3pkN7WLx6tW5TvNsUUtHJAoGBAIYOoJ8dpYgTccAkRVKfRhO9Q2tW5SMVtgAayJCxcrGGfdseuVKT8+OBb0b83KedxJaqVf3zqcBCLaQy80543/dxSFS4k0hNjDBYjG7yeXMCMG4bdYgDuQpOsyfFfoI3UyDGjva2XDj/W8UfhKFLiz8ekIhY56SEaikPBEPerW7BAoGBAIW+5xD7BH4Z/w+GNrA5WFWNNH02+32AD/k6W59GQ+ejrFzCa9/SPa/7WEbBjKNWnzYl9pcdA0lP3LGEbKzrm6Zy+6lCHI6Hx/o4PbHaKTQg2jAIJdEUrAOKR44rjIY41a8wtgilfZA4I4zDSvJMPkMYOItIXjFCwHTxLLfw0CJp';


        $sign = new SignUtils();
        $merchantSecretKey = "C9q19z6bxaao19PZMRu9Y8Q98l7z4h2R";

        $content = $sign->getSign($params, $merchantSecretKey);

        $rsa = new SHA256WithRSAUtils();

        $sign = $rsa->buildRSASignByPrivateKey($content,$privateKey);
        $flag = $rsa->buildRSAverifyByPublicKey($content,$publicKey,$sign);
        var_dump($content,$sign,$flag);
    }


    public function queryAccount(){
        $uri = '/idr/account/ledger';
        $params = [
            'appId'=>1431,
            'sign'=>'',
        ];
        $url = API_HOST . $uri;

        echo $url . PHP_EOL;
    }
}


var_dump('dsf');exit;
$rsaUtil = new SHA256WithRSAUtils();
var_dump($rsaUtil->initRSAKey());

// $abc = new Abc();
// $abc->run();