当前位置:Gxlcms > PHP教程 > PHP实现RSA签名生成订单功能【支付宝示例】

PHP实现RSA签名生成订单功能【支付宝示例】

时间:2021-07-01 10:21:17 帮助过:76人阅读

这篇文章主要介绍了PHP实现RSA签名生成订单功能,涉及php随机字符串及编码相关操作技巧,以及支付宝公钥文件读取与使用方法,需要的朋友可以参考下

本文实例讲述了PHP实现RSA签名生成订单功能。分享给大家供大家参考,具体如下:

  1. //组合签名
  2. $a=time();
  3. $b=substr($a, 1);
  4. //生成随机订单号
  5. $orderid= $b.mt_rand(10000,99999);
  6. //合作身份者id,以2088开头的16位纯数字
  7. $mygoods['partner']="2088011744308664";
  8. //商家账号
  9. $mygoods['seller']="2088011744308664";
  10. //订单号
  11. $mygoods['out_trade_no']=$orderid;
  12. //主题
  13. $mygoods['subject']=$goods_name;
  14. //商品描述信息
  15. $mygoods['body']=$goods_infro;
  16. //商品价格
  17. $mygoods['total_fee']=$score;
  18. //服务器端异步响应地址
  19. $mygoods['notify_url']= "http://211.149.220.47/php/notify_url.php";
  20. //排序
  21. $mygoods = argSort($mygoods);
  22. //拼接
  23. $mystr = createLinkstring($mygoods);
  24. //签名
  25. $sign = rsaSign($mystr);
  26. //对签名进行urlencode转码
  27. $sign = urlencode($sign);
  28. //生成最终签名信息
  29. $orderInfor = $mystr."&sign=".$sign."&sign_type=RSA";
  30. /*******特殊的 验签支付宝反馈给App的签名信息*******/
  31. //支付宝反馈给App端信息拆解如下
  32. $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';
  33. //被拆解后的支付宝签名
  34. $sign = 'Itorzqous2F7kYWWOpmoB%2FJUYgySRzh%2FOOKMhVhv%2BM48CnFk%2BQCp2cKcSsNGcDTs2AsAk%2BRYTuyMYZkGH56t8jcV2GGFkrJr%2FPxcGRlEK08QadAhImYzy9piVjoW0102lhSJYapiXGBTl5eiZ88RiyRA62D2nJEtH%2FBVXpuq63A%3D';
  35. //得到签名
  36. $sign = urldecode($sign);
  37. //得到待签名字符串
  38. $str = urldecode($str);
  39. //验签数据,验签成功将返回true 否则 flase
  40. var_dump(verify($str, $sign));
  41. /*************************需要使用到的方法*******************************/
  42. /**
  43. * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  44. * @param $para 需要拼接的数组
  45. * return 拼接完成以后的字符串
  46. */
  47. function createLinkstring($para) {
  48. $arg = "";
  49. while (list ($key, $val) = each ($para)) {
  50. $arg.=$key."=".$val."&";
  51. }
  52. //去掉最后一个&字符
  53. $arg = substr($arg,0,count($arg)-2);
  54. //如果存在转义字符,那么去掉转义
  55. if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
  56. return $arg;
  57. }
  58. /**
  59. * 对数组排序
  60. * @param $para 排序前的数组
  61. * return 排序后的数组
  62. */
  63. function argSort($para) {
  64. ksort($para);
  65. reset($para);
  66. return $para;
  67. }
  68. /**
  69. * RSA签名
  70. * @param $data 待签名数据
  71. * @param $private_key_path 商户私钥文件路径
  72. * return 签名结果
  73. */
  74. function rsaSign($data, $private_key_path) {
  75. $priKey = file_get_contents($private_key_path);
  76. $res = openssl_get_privatekey($priKey);
  77. openssl_sign($data, $sign, $res);
  78. openssl_free_key($res);
  79. //base64编码
  80. $sign = base64_encode($sign);
  81. return $sign;
  82. }
  83. /**RSA验签
  84. * $data待签名数据
  85. * $sign需要验签的签名
  86. * 验签用支付宝公钥
  87. * return 验签是否通过 bool值
  88. */
  89. function verify($data, $sign) {
  90. //读取支付宝公钥文件
  91. $pubKey = file_get_contents('key/alipay_public_key.pem');
  92. //转换为openssl格式密钥
  93. $res = openssl_get_publickey($pubKey);
  94. //调用openssl内置方法验签,返回bool值
  95. $result = (bool)openssl_verify($data, base64_decode($sign), $res);
  96. //释放资源
  97. openssl_free_key($res);
  98. //返回资源是否成功
  99. return $result;
  100. }

以上就是PHP实现RSA签名生成订单功能【支付宝示例】的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行