php rsa签名验签,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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值