PHP實現(xiàn)RSA簽名生成訂單功能【支付寶示例】
本文實例講述了PHP實現(xiàn)RSA簽名生成訂單功能。分享給大家供大家參考,具體如下:
//組合簽名
$a=time();
$b=substr($a, 1);
//生成隨機訂單號
$orderid= $b.mt_rand(10000,99999);
//合作身份者id,以2088開頭的16位純數(shù)字
$mygoods['partner']="2088011744308664";
//商家賬號
$mygoods['seller']="2088011744308664";
//訂單號
$mygoods['out_trade_no']=$orderid;
//主題
$mygoods['subject']=$goods_name;
//商品描述信息
$mygoods['body']=$goods_infro;
//商品價格
$mygoods['total_fee']=$score;
//服務(wù)器端異步響應(yīng)地址
$mygoods['notify_url']= "http://211.149.220.47/php/notify_url.php";
//排序
$mygoods = argSort($mygoods);
//拼接
$mystr = createLinkstring($mygoods);
//簽名
$sign = rsaSign($mystr);
//對簽名進行urlencode轉(zhuǎn)碼
$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¬ify_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);
//驗簽數(shù)據(jù),驗簽成功將返回true 否則 flase
var_dump(verify($str, $sign));
/*************************需要使用到的方法*******************************/
/**
* 把數(shù)組所有元素,按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串
* @param $para 需要拼接的數(shù)組
* return 拼接完成以后的字符串
*/
function createLinkstring($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
$arg.=$key."=".$val."&";
}
//去掉最后一個&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在轉(zhuǎn)義字符,那么去掉轉(zhuǎn)義
if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
return $arg;
}
/**
* 對數(shù)組排序
* @param $para 排序前的數(shù)組
* return 排序后的數(shù)組
*/
function argSort($para) {
ksort($para);
reset($para);
return $para;
}
/**
* RSA簽名
* @param $data 待簽名數(shù)據(jù)
* @param $private_key_path 商戶私鑰文件路徑
* return 簽名結(jié)果
*/
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待簽名數(shù)據(jù)
* $sign需要驗簽的簽名
* 驗簽用支付寶公鑰
* return 驗簽是否通過 bool值
*/
function verify($data, $sign) {
//讀取支付寶公鑰文件
$pubKey = file_get_contents('key/alipay_public_key.pem');
//轉(zhuǎn)換為openssl格式密鑰
$res = openssl_get_publickey($pubKey);
//調(diào)用openssl內(nèi)置方法驗簽,返回bool值
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
//釋放資源
openssl_free_key($res);
//返回資源是否成功
return $result;
}
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php字符串(string)用法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計算法總結(jié)》、《php排序算法總結(jié)》、《PHP常用遍歷算法與技巧總結(jié)》、《PHP數(shù)學(xué)運算技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
php中把對象轉(zhuǎn)換為數(shù)組幾種簡單巧妙的方法
在PHP中,對象是一種復(fù)雜的數(shù)據(jù)類型,它可以包含多個屬性和方法,有時候我們需要將對象轉(zhuǎn)換為數(shù)組進行操作,比如將對象存儲到數(shù)據(jù)庫中,或者將對象轉(zhuǎn)換為JSON格式等情況,對象轉(zhuǎn)數(shù)組不能用遞歸實現(xiàn)轉(zhuǎn)換,本文幾種簡單巧妙的方法2023-09-09
PhpMyAdmin中無法導(dǎo)入sql文件的解決辦法
PhpMyAdmin中無法導(dǎo)入sql文件的解決辦法2010-01-01

