<?php
//生成 sha256WithRSA 签名
function getSign($content, $privateKey){
    $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" .
        wordwrap($privateKey, 64, "\n", true) .
        "\n-----END RSA PRIVATE KEY-----";

    $key = openssl_get_privatekey($privateKey);
    openssl_sign($content, $signature, $key, "SHA256");
    openssl_free_key($key);
    $sign = base64_encode($signature);
    return $sign;
}

//验证 sha256WithRSA 签名
function verify($content, $sign, $publicKey){
    $publicKey = "-----BEGIN PUBLIC KEY-----\n" .
        wordwrap($publicKey, 64, "\n", true) .
        "\n-----END PUBLIC KEY-----";

    $key = openssl_get_publickey($publicKey);
    $ok = openssl_verify($content,base64_decode($sign), $key, 'SHA256');
    openssl_free_key($key);
    return $ok;
}

function createNonce($len)
{
    $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; // characters to build the password from
    $string='';
    for(;$len>=1;$len--)
    {
        $position=rand()%strlen($chars);
        $string.=substr($chars,$position,1);
    }
    return $string;
}

function postUrl($url,$header,$data){
    $reqHeader = array('Content-Type:application/json');
    foreach ($header as $key=>$value){
        array_push($reqHeader,$key.':'.$value);
    }
    $ch = curl_init( $url );
// set data as json string
    curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($data));
// define json as content type
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $reqHeader);
// tell curl to fetch return data
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt( $ch, CURLOPT_POST, true);

// follow location if redirect happens like http to https
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
// send request
    $result = curl_exec($ch);
// gives you the result - most of the time you only want this
//    var_dump($result);
// for debugging purpose, gives you the whole connection info
//    var_dump(curl_getinfo($ch));
// gives back any occurred errors
//    var_dump(curl_error($ch));
    curl_close($ch);
    return $result;
}

//$pubKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcoCTqjjslaQWAUG3DIyTDQDKpXaIXl4H7fjc34zY/AoUihpqouzwMWuf6n5w6VAPXm9FKbJAaR0CkmAQ0CGc5UN+SYFmnjLKj12o1neWSsE6DqpqFIbVsxf5nj2NA6GFAGMH9XFEtucFhAh1eH821DFVomJg0VZIxolnO+OWAuwIDAQAB';
//$priKey = 'MIICXQIBAAKBgQC5BCvmHOgVdHynDWJfb9OBVNaVDyQeByZhjIyz/7zmpW5vmtg1vjgr08jlPhYf6X5zcZe5uSzo/rb5JuLf21s/gSxJHOfpV+iBidmur4sSlrmnhvfhsGUBiAkPx/KvBpG2QucqYEnGs4Y/kb9TrFnXOadgjftP/H2mvckoOJdr5QIDAQABAoGAZtKAqyRJfxL768MudqepPekuUCzX/7Atjm0UDT0FeJFb7L57hnKuuPy8W1rD5PxZAEOS9O6KnPpiKdmIoKxB6vYVM2NmaQFdWy4pTF1snypAyMHjaHDSFpS5GeLmowJ86PRLMeQTPGibd0EG9CgdfjuR+Yx8K+JEDMYv+tJjeEECQQD/dco37bfD3zNxBVVPumZZhVk6m6AErYoV4h+XoBXICHIlnLRcSQB2/YrosN4WvesIhrPy4G1xA0gnbYapvNGdAkEAuWhFDtPl+pxl9LLRhKOAitujdBl+1URIvcwjEAdvImTOFGfPxwrEC2sPPjfvOt7q/VMTi5ZrSuJxhWKjfs/06QJBANQPcK1azXhwmWBR4A7OGlZn5rlLJNudP4qI6lbQ0iP6Nt9YJTSSeStNr3kYEVRplWi/gTO178OnyMbKGcZfctUCQD2oAR8XNGmMzRL8zFQRk1OaCtc3C0ictpv3YMmZz0lewHFkvGHyoJMzfRQxwaqQKxEnKV7IHNIAT8QNs1UejtECQQDD/qT59lsEwdqb64Xi6c0zBPtMgnVzYCozLHNrqWT48AGPvnBUwuOUtpBVNB7kbcuMMH3W2G11qcBnk9rxJzGS';

$testPublicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcXg6tcXgnTQsYBirt9WXCh2SBa70rc4ymKbMsPH2SW/bLsZxnOlvDhQinRq2csiC5/6cbCMn4VXZssKzS0t5rn9PPD9YUiPwCfpDuCtHPKWQnJLouDPbuLPPfkfPFlKdSDEoc0J125WPx0DZmqtifXePX8txjy+JIpw1A411HgwIDAQAB';
$testPrivateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANxeDq1xeCdNCxgGKu31ZcKHZIFrvStzjKYpsyw8fZJb9suxnGc6W8OFCKdGrZyyILn/pxsIyfhVdmywrNLS3muf088P1hSI/AJ+kO4K0c8pZCckui4M9u4s89+R88WUp1IMShzQnXblY/HQNmaq2J9d49fy3GPL4kinDUDjXUeDAgMBAAECgYEAnFNRADM9dEvQMeO2MoZiAMSBRNpEIP3gacOtKhVjUx9QDSHa/NPGYwYNpHScFku6sZetWJ08gaFG2EXg49HZG5jMn6pTW0b0DObzeP6aAIIE3Nza3DvMq1XSxWoTm8jxdiVAwgFb0n2wsilJeExQA/AnDxxsPQxQtGwrxBEOk8kCQQD3QruBfb2F/ivuvYutmKzcz85gAWl3rx2AebS7QJ7kA0cmXWhlpkM/4EJ0JP6nXPtz6PyE523h41Ev1hSfBoUHAkEA5Cf9J/azrCGR+qSj7c+1AGxgSrNVInXyhk5USVgDyBjM+WmW5awRMgbZaZU0jTVX+q5TwO54rvlJE80Z3CGmpQJBALhsi9LP6LaymC4gLriyseyZCwNMyk+8y7JyFL2+O0UytLUG4sE+u9Y+/RIILfDDR8JyuzaeL7VWic22Tfc3M60CQBOO4gK1AT32Or9TscHHFmsM30xIBzpHBh1BRbRr2RckGR4gURErKOYy9Bw68CBSvFH+86sMRkgpknwiDt9x+wkCQB+PSXSGDICc/c0KWQbdiNZg1myzGzB5gUq+87vy+5dEirMOtu9eD7yPkfQDpkzLHeL2BhhTxHd8mJzP4DFzxeQ=';


$requestHeader = array(
    "timestamp"=>time(),
    "nonce"=> createNonce(10),
    "api-key"=>"f65b29b7-9c11-43ec-9c8d-17f7cf2d7ed1",
    "version"=>"1.0",
    "lang"=>"en",
    "user_identifier"=>"916316559@qq.com",
);
$requestBody = array("user_identifier"=>"916316559@qq.com");

$signParameter = array_merge($requestHeader,$requestBody);
ksort($signParameter);
$beSignedParameter = http_build_query($signParameter);
$signature = getSign($beSignedParameter,$testPrivateKey);
$requestHeader["signature"]=$signature;

echo "RequestHeader:".json_encode($requestHeader);
echo "\n";
echo "RequestBody:".json_encode($requestBody);
echo "\n";

$result = postUrl('https://bankend-sdk-test.hyperpay.io/hypercard/sdk/merchant/start',$requestHeader,$requestBody);
echo  'Network Response:'.$result;


