本文实例讲述了PHP实现RSA签名生成订单功能。分享给大家供大家参考,具体如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
//组合签名
$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程序设计有所帮助。
相关文章
猜你喜欢
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-06-04 25
-
2025-05-25 71
-
2025-05-25 14
-
2025-05-27 23
-
CentOS 6.4安装配置LNMP服务器(Nginx+PHP+MySQL)
2025-05-25 67
热门评论