2013-08-23 3 views
0

У меня есть сценарий php, который я использовал в течение 2 лет, и изменил его для работы, когда paypal изменился на http 1.1. Он работал почти для каждой транзакции, но в последнее время провалился, и я не могу понять, почему. Ниже приведен код.PHP Paypal IPN иногда не работает

Он не работает, пытаясь найти ответ. Это INVALID

Может ли это иметь какое-то отношение к нестандартным символам в адресе?

Я попытался снова и снова отправить запрос СПИ и он всегда терпит неудачу

function paypal_ipn() { 
    $req = 'cmd=_notify-validate'; 

    foreach($_POST as $key => $value) { 
     $value = urlencode(stripslashes($value)); 
     $req .= "&{$key}={$value}"; 
    } 

    $res = ''; 
    $ch = curl_init(paypal_url()); 
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); 
    $res = curl_exec($ch); 
    curl_close($ch); 

    if(PAYPAL_IPN_DEBUG && !empty($_POST)) { 
     $fname = 'ipn_intial_' . date('Y.m.d-h.i.s', time()) . '.txt'; 
     file_put_contents('log/' . $fname, $req); 

     $fname = 'ipn_intial_result_' . date('Y.m.d-h.i.s', time()) . '.txt'; 
     file_put_contents('log/' . $fname, $res); 

    } 

    if(strcmp($res, "VERIFIED") == 0) { 

     switch($_POST['txn_type']) 
{ 
     case 'web_accept': 
      $data = array(); 
      $data['name'] = $_POST['first_name'] . ' ' . $_POST['last_name']; 
      $data['email'] = $_POST['payer_email']; 
      $data['txn_id'] = $_POST['txn_id']; 
      $data['payment_status'] = 'Completed'; 
      $res = save_payment($data); 
      if ($res) { 
       $data = payment_details(array('txn_id' => $data['txn_id'])); 
       mail_notification($data); 
      }    
      break; 

     case 'subscr_signup': 
      $params = array(); 
      $params['name'] = $_POST['first_name'] . ' ' . $_POST['last_name']; 
      $params['email'] = $_POST['payer_email']; 
      $params['subscr_id'] = $_POST['subscr_id']; 
      $params['subscr_status'] = 'payment'; 

      $data = save_subscription($params); 
      subscr_notification($data); 
      break; 
     case 'subscr_cancel': 
      $data = subscr_details(array('subscr_id' => $_POST['subscr_id'])); 

      if ($data) 
      { 
       mysql_update('subscriptions', array('subscr_id' => $_POST['subscr_id']), array('subscr_status' => 'cancelled', 'cancel_date' => date('Y-m-d H:i:s'))); 
      } 
      break; 
     } 

    } 

    if(PAYPAL_IPN_DEBUG && !empty($_POST)) { 
     $fname = 'ipn_' . date('Y.m.d-h.i.s', time()) . '.txt'; 
     file_put_contents('log/' . $fname, serialize($_POST)); 
    } 
} 

ответ

0

Это был хитрый. Magic Quotes был отключен, и этот скрипт предполагает, что включены магические кавычки. Поэтому нет необходимости называть stripslashes. Это вызывало ошибку