alipay_notify.class.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. /* *
  3. * 类名:AlipayNotify
  4. * 功能:支付宝通知处理类
  5. * 详细:处理支付宝各接口通知返回
  6. * 版本:3.2
  7. * 日期:2011-03-25
  8. * 说明:
  9. * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
  10. * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考
  11. *************************注意*************************
  12. * 调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
  13. */
  14. require_once("alipay_core.function.php");
  15. require_once("alipay_rsa.function.php");
  16. class AlipayNotify {
  17. function __construct($config){
  18. $this->config = $config;
  19. }
  20. function AlipayNotify($config) {
  21. $this->__construct($config);
  22. }
  23. /**
  24. *
  25. * @return 验证结果
  26. */
  27. function verifyNotify(){
  28. if(empty($_POST)) {//判断POST来的数组是否为空
  29. return false;
  30. }
  31. else {
  32. //生成签名结果
  33. $isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
  34. //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  35. if ($isSign) {
  36. return true;
  37. } else {
  38. return false;
  39. }
  40. }
  41. }
  42. /**
  43. * 针对return_url验证消息是否是支付宝发出的合法消息
  44. * @return 验证结果
  45. */
  46. function verifyReturn(){
  47. if(empty($_GET)) {//判断POST来的数组是否为空
  48. return false;
  49. }
  50. else {
  51. //生成签名结果
  52. $isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
  53. //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
  54. $responseTxt = 'false';
  55. if (! empty($_GET["notify_id"])) {$responseTxt = $this->getResponse($_GET["notify_id"]);}
  56. //写日志记录
  57. //if ($isSign) {
  58. // $isSignStr = 'true';
  59. //}
  60. //else {
  61. // $isSignStr = 'false';
  62. //}
  63. //$log_text = "responseTxt=".$responseTxt."\n return_url_log:isSign=".$isSignStr.",";
  64. //$log_text = $log_text.createLinkString($_GET);
  65. //logResult($log_text);
  66. //验证
  67. //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
  68. //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  69. if (preg_match("/true$/i",$responseTxt) && $isSign) {
  70. return true;
  71. } else {
  72. return false;
  73. }
  74. }
  75. }
  76. /**
  77. * 获取返回时的签名验证结果
  78. * @param $para_temp 通知返回来的参数数组
  79. * @param $sign 返回的签名结果
  80. * @return 签名验证结果
  81. */
  82. function getSignVeryfy($para_temp, $sign) {
  83. //除去待签名参数数组中的空值和签名参数
  84. $para_filter = paraFilter($para_temp);
  85. //对待签名参数数组排序
  86. $para_sort = argSort($para_filter);
  87. //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  88. $prestr = createLinkstring($para_sort);
  89. $isSgin = false;
  90. switch (strtoupper(trim($this->alipay_config['sign_type']))) {
  91. case "RSA" :
  92. $isSgin = rsaVerify($prestr, trim($this->alipay_config['alipay_public_key']), $sign);
  93. break;
  94. default :
  95. $isSgin = false;
  96. }
  97. return $isSgin;
  98. }
  99. /**
  100. * 获取远程服务器ATN结果,验证返回URL
  101. * @param $notify_id 通知校验ID
  102. * @return 服务器ATN结果
  103. * 验证结果集:
  104. * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
  105. * true 返回正确信息
  106. * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
  107. */
  108. function getResponse($notify_id) {
  109. $transport = strtolower(trim($this->alipay_config['transport']));
  110. $partner = trim($this->alipay_config['partner']);
  111. $veryfy_url = '';
  112. if($transport == 'https') {
  113. $veryfy_url = $this->https_verify_url;
  114. }
  115. else {
  116. $veryfy_url = $this->http_verify_url;
  117. }
  118. $veryfy_url = $veryfy_url."partner=" . $partner . "&notify_id=" . $notify_id;
  119. $responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);
  120. return $responseTxt;
  121. }
  122. }
  123. ?>