这篇文章主要介绍了php实现rsa签名生成订单功能,涉及php随机字符串及编码相关操作技巧,以及支付宝公钥文件读取与使用方法,需要的朋友可以参考下
本文实例讲述了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¬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);
//验签数据,验签成功将返回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;
}
以上就是php实现以支付宝为例的rsa签名生成订单功能的详细内容。