PHP 做 RSA 簽名 生成訂單

//組合簽名
$a=time();
$b=substr($a, 1);
//生成隨機訂單號
$orderid= $b.mt_rand(10000,99999);
//合作身份者id,以2088開頭的16位純數字
$mygoods['partner']="2088011744308664";
//商家賬號
$mygoods['seller']="2088011744308664";
//訂單號
$mygoods['out_trade_no']=$orderid;
//主題
$mygoods['subject']=$goods_name;
//商品描述信息
$mygoods['body']=$goods_infro;
//商品價格
$mygoods['total_fee']=$score;
//服務器端異步響應地址
$mygoods['notify_url']= "http://211.149.220.47/php/notify_url.php";
//排序
$mygoods = argSort($mygoods);
//拼接
$mystr = createLinkstring($mygoods);
//簽名
$sign = rsaSign($mystr);
//對簽名進行urlencode轉碼
$sign = urlencode($sign);
//生成最終簽名信息
$orderInfor = $mystr."&sign=".$sign."&sign_type=RSA";

/*******特殊的 驗籤支付寶反饋給App的簽名信息*******/
//支付寶反饋給App端信息拆解如下
$str = 'body=%E7%B2%BE%E5%93%81%E5%84%BF%E7%AB%A5%E4%B9%A6%E5%8C%85%E5%96%9C%E6%B4%8B%E6%B4%8B%E7%9A%84&notify_url=http%3A%2F%2F211.149.220.47%2Fphp%2Fnotify_url.php&out_trade_no=40609294027478&partner=2088011744308664&seller=2088011744308664&subject=%E4%B9%A6%E5%8C%85&success=true&total_fee=0.01';

//被拆解後的支付寶簽名
$sign = 'Itorzqous2F7kYWWOpmoB%2FJUYgySRzh%2FOOKMhVhv%2BM48CnFk%2BQCp2cKcSsNGcDTs2AsAk%2BRYTuyMYZkGH56t8jcV2GGFkrJr%2FPxcGRlEK08QadAhImYzy9piVjoW0102lhSJYapiXGBTl5eiZ88RiyRA62D2nJEtH%2FBVXpuq63A%3D';

 //得到簽名
$sign = urldecode($sign);
//得到待簽名字符串
$str = urldecode($str);
//驗籤數據,驗籤成功將返回true 否則 flase
var_dump(verify($str, $sign));


/*************************需要使用到的方法*******************************/
/**
 * 把數組所有元素,按照“參數=參數值”的模式用“&”字符拼接成字符串
 * @param $para 需要拼接的數組
 * return 拼接完成以後的字符串
 */
function createLinkstring($para) {
    $arg  = "";
    while (list ($key, $val) = each ($para)) {
        $arg.=$key."=".$val."&";
    }
    //去掉最後一個&字符
    $arg = substr($arg,0,count($arg)-2);
     
    //如果存在轉義字符,那麼去掉轉義
    if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
     
    return $arg;
}
/**
 * 對數組排序
 * @param $para 排序前的數組
 * return 排序後的數組
 */
function argSort($para) {
    ksort($para);
    reset($para);
    return $para;
}
 
/**
 * RSA簽名
 * @param $data 待簽名數據
 * @param $private_key_path 商戶私鑰文件路徑
 * return 簽名結果
 */
function rsaSign($data, $private_key_path) {
    $priKey = file_get_contents($private_key_path);
    $res = openssl_get_privatekey($priKey);
    openssl_sign($data, $sign, $res);
    openssl_free_key($res);
    //base64編碼
    $sign = base64_encode($sign);
    return $sign;
}



/**RSA驗籤
 * $data待簽名數據
 * $sign需要驗籤的簽名
 * 驗籤用支付寶公鑰
 * return 驗籤是否通過 bool值
 */
function verify($data, $sign)  {
    //讀取支付寶公鑰文件
    $pubKey = file_get_contents('key/alipay_public_key.pem');

    //轉換爲openssl格式密鑰
    $res = openssl_get_publickey($pubKey);

    //調用openssl內置方法驗籤,返回bool值
    $result = (bool)openssl_verify($data, base64_decode($sign), $res);
	
    //釋放資源
    openssl_free_key($res);

    //返回資源是否成功
    return $result;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章