drlndkhib08556095 2014-02-27 10:35
浏览 99
已采纳

Paypal IPN - PHP已弃用:不推荐使用函数eregi()

This is for a paypal automated payment system.

This used to work perfectly fine until this morning and I'm very confused as I haven't changed anything.

The errors are:

[27-Feb-2014 02:30:49 UTC] PHP Deprecated:  Function eregi() is deprecated in /path/ on line 124

[27-Feb-2014 02:30:49 UTC] PHP Warning:  fopen(C:/errorlog/.ipn_results.log) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /home/customxn/public_html/donate/paypal.class.php on line 162

[27-Feb-2014 02:30:49 UTC] PHP Warning:  fwrite() expects parameter 1 to be resource, boolean given in /path/ on line 163

[27-Feb-2014 02:30:49 UTC] PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /path/ on line 165

[27-Feb-2014 10:08:05 UTC] PHP Deprecated:  Function eregi() is deprecated in /path/ on line 124

[27-Feb-2014 10:08:05 UTC] PHP Warning:  fopen(C:/errorlog/.ipn_results.log) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory in /path/ on line 162

[27-Feb-2014 10:08:05 UTC] PHP Warning:  fwrite() expects parameter 1 to be resource, boolean given in /home/customxn/public_html/donate/paypal.class.php on line 163

[27-Feb-2014 10:08:05 UTC] PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /path/ on line 165

The PHP version is 5.3.28 And the code for the file it's complaining about is:

class paypal_class {

var $last_error;                 // holds the last error encountered

var $ipn_log;                    // bool: log IPN results to text file?

var $ipn_log_file;               // filename of the IPN log
var $ipn_response;               // holds the IPN response from paypal  
var $ipn_data = array();         // array contains the POST values for IPN

var $fields = array();           // array holds the fields to submit to paypal


function paypal_class() {

  // initialization constructor.  Called when class is created.

  $this->paypal_url = 'https://www.paypal.com/cgi-bin/webscr';

  $this->last_error = '';

  $this->ipn_log_file = 'C:/errorlog/.ipn_results.log';
  $this->ipn_log = true;
  $this->ipn_response = '';

  // populate $fields array with a few default values.  See the paypal
  // documentation for a list of fields and their data types. These defaul
  // values can be overwritten by the calling script.

  $this->add_field('rm','2');           // Return method = POST
  $this->add_field('cmd','_xclick');

}

function add_field($field, $value) {

  // adds a key=>value pair to the fields array, which is what will be
  // sent to paypal as POST variables.  If the value is already in the
  // array, it will be overwritten.

  $this->fields["$field"] = $value;
}

function submit_paypal_post() {

  // this function actually generates an entire HTML page consisting of
  // a form with hidden elements which is submitted to paypal via the
  // BODY element's onLoad attribute.  We do this so that you can validate
  // any POST vars from you custom form before submitting to paypal.  So
  // basically, you'll have your own form which is submitted to your script
  // to validate the data, which in turn calls this function to create
  // another hidden form and submit to paypal.

  // The user will briefly see a message on the screen that reads:
  // "Please wait, your order is being processed..." and then immediately
  // is redirected to paypal.

  echo "<html>
";
  echo "<head><title>Processing Payment...</title></head>
";
  echo "<body onLoad=\"document.forms['paypal_form'].submit();\">
";
  echo "<center><h2>Please wait, your order is being processed and you";
  echo " will be redirected to the paypal website.</h2></center>
";
  echo "<form method=\"post\" name=\"paypal_form\" ";
  echo "action=\"".$this->paypal_url."\">
";

  foreach ($this->fields as $name => $value) {
     echo "<input type=\"hidden\" name=\"$name\" value=\"$value\"/>
";
  }
  echo "<center><br/><br/>If you are not automatically redirected to ";
  echo "paypal within 5 seconds...<br/><br/>
";
  echo "<input type=\"submit\" value=\"Click Here\"></center>
";

  echo "</form>
";
  echo "</body></html>
";

}

function validate_ipn() {

  // parse the paypal URL
  $url_parsed=parse_url($this->paypal_url);        

  // generate the post string from the _POST vars aswell as load the
  // _POST vars into an arry so we can play with them from the calling
  // script.
  $post_string = '';    
  foreach ($_POST as $field=>$value) {
     $this->ipn_data["$field"] = $value;
     $post_string .= $field.'='.urlencode(stripslashes($value)).'&';
  }
  $post_string.="cmd=_notify-validate"; // append ipn command

  // open the connection to paypal
  $fp = fsockopen($url_parsed[host],"80",$err_num,$err_str,30);
  if(!$fp) {

     // could not open the connection.  If loggin is on, the error message
     // will be in the log.
     $this->last_error = "fsockopen error no. $errnum: $errstr";
     $this->log_ipn_results(false);      
     return false;

  } else {

     // Post the data back to paypal
     fputs($fp, "POST $url_parsed[path] HTTP/1.1
");
     fputs($fp, "Host: $url_parsed[host]
");
     fputs($fp, "Content-type: application/x-www-form-urlencoded
");
     fputs($fp, "Content-length: ".strlen($post_string)."
");
     fputs($fp, "Connection: close

");
     fputs($fp, $post_string . "

");

     // loop through the response from the server and append to variable
     while(!feof($fp)) {
        $this->ipn_response .= fgets($fp, 1024);
     }

     fclose($fp); // close connection

  }

  if (eregi("VERIFIED",$this->ipn_response)) {

     // Valid IPN transaction.
     $this->log_ipn_results(true);
     return true;      

  } else {

     // Invalid IPN transaction.  Check the log for details.
     $this->last_error = 'IPN Validation Failed.';
     $this->log_ipn_results(false);  
     return false;

  }

}

function log_ipn_results($success) {

  if (!$this->ipn_log) return;  // is logging turned off?

  // Timestamp
  $text = '['.date('m/d/Y g:i A').'] - ';

  // Success or failure being logged?
  if ($success) $text .= "SUCCESS!
";
  else $text .= 'FAIL: '.$this->last_error."
";

  // Log the POST variables
  $text .= "IPN POST Vars from Paypal:
";
  foreach ($this->ipn_data as $key=>$value) {
     $text .= "$key=$value, ";
  }

  // Log the response from the paypal server
  $text .= "
IPN Response from Paypal Server:
 ".$this->ipn_response;

  // Write to log
  $fp=fopen($this->ipn_log_file,'a');
  fwrite($fp, $text . "

");

  fclose($fp);  // close file
}

function dump_fields() {

  // Used for debugging, this function will output all the field/value pairs
  // that are currently defined in the instance of the class using the
  // add_field() function.

  echo "<h3>paypal_class->dump_fields() Output:</h3>";
  echo "<table width=\"95%\" border=\"1\" cellpadding=\"2\" cellspacing=\"0\">
       <tr>
          <td bgcolor=\"black\"><b><font color=\"white\">Field Name</font></b></td>
          <td bgcolor=\"black\"><b><font color=\"white\">Value</font></b></td>
       </tr>";

  ksort($this->fields);
  foreach ($this->fields as $key => $value) {
     echo "<tr><td>$key</td><td>".urldecode($value)."&nbsp;</td></tr>";
  }

  echo "</table><br>";
}
}

Any ideas?

Apparently eregi() has been deprecated since PHP 5.3, what would I use instead of eregi() ?

  • 写回答

1条回答 默认 最新

  • dslkchyv673627 2014-02-27 11:00
    关注

    eregi() is deprecated since PHP 5.3, use preg_match() instead :

    if (preg_match( "~VERIFIED~i", $this->ipn_response)) {
        // ...
    }
    

    Like stckrboy says, your sysadmin may have adjust error handling, or they just updated the PHP version.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开