2013-12-17 2 views
0

По какой-то причине у меня больше проблем с этим, тогда я должен ... У меня есть список IPN для Paypal, и симулятор IPN говорит об успешности каждый раз и разными способами, но я могу не получить его, чтобы затем манипулировать базой данных на основе успешного ответа.Инициатор IPN Успешно, но не запускает манипуляции с базой данных

Любые идеи кто-нибудь?

<?php 

//INCLUDE CONNECTION STRING 
include('connect.php'); 

// STEP 1: read POST data 

// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST. 
// Instead, read raw POST data from the input stream. 
$raw_post_data = file_get_contents('php://input'); 
$raw_post_array = explode('&', $raw_post_data); 
$myPost = array(); 
foreach ($raw_post_array as $keyval) { 
$keyval = explode ('=', $keyval); 
if (count($keyval) == 2) 
$myPost[$keyval[0]] = urldecode($keyval[1]); 
} 
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate' 
$req = 'cmd=_notify-validate'; 
if(function_exists('get_magic_quotes_gpc')) { 
$get_magic_quotes_exists = true; 
} 
foreach ($myPost as $key => $value) {   
if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) { 
    $value = urlencode(stripslashes($value)); 
} else { 
    $value = urlencode($value); 
} 
$req .= "&$key=$value"; 
} 


// STEP 2: POST IPN data back to PayPal to validate 

$ch = curl_init('https://www.paypal.com/cgi-bin/webscr'); 
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')); 

if(!($res = curl_exec($ch))) { 

error_log("Got " . curl_error($ch) . " when processing IPN data"); 
curl_close($ch); 
exit; 
} 
curl_close($ch); 


// STEP 3: Inspect IPN validation result and act accordingly 

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

// assign posted variables to local variables 
$item_name = $_POST['item_name']; 
$item_number = $_POST['item_number']; 
$payment_status = $_POST['payment_status']; 
$payment_amount = $_POST['mc_gross']; 
$payment_currency = $_POST['mc_currency']; 
$txn_id = $_POST['txn_id']; 
$receiver_email = $_POST['receiver_email']; 
$payer_email = $_POST['payer_email']; 

if($payment_status=="Completed"){ 

    $selectuser = mssql_query("select statsmemberid from statsmembers where email='$payer_email'"); 

      if(mssql_num_rows($selectuser) != 0){ 
      $row = mssql_fetch_row($selectuser); 
      $statsmemberid = $row[0]; 

      $getCredits = mssql_query("select creditsbought from statsmuplayers where statsmemberid='$statsmemberid'"); 

      $row = mssql_fetch_row($getCredits); 
      $totalCredits = $row[0]+11;    

      $updatemu = mssql_query("update statsmuplayers set creditsbought='$totalCredits' where statsmemberid='$statsmemberid'"); 
      echo "Credits Applyed"; 
      }else{ 
       echo "Invalid Email"; 
      } 




} 


} else if (strcmp ($res, "INVALID") == 0) { 
// IPN invalid, log for manual investigation 
echo "The response from IPN was: <b>" .$res ."</b>"; 
} 
?> 
+0

Поскольку здесь довольно сложно прочитать эхо, поскольку PayPal вызывает сценарий в фоновом режиме, вы должны перенаправить любой вывод в файл. Например $ f = fopen ("log.txt", "a"); - затем fwrite ($ f, "то, что я хочу написать/log ..."); - Это должно помочь вам отладить его. Также проверьте журналы Apache/NGINX для возможных ошибок/предупреждений. –

ответ

0

Я предлагаю вам инкапсулировать весь этот код на несколько объектов. Это действительно поможет вам понять, где все идет не так.

Вы хотите объект, который обрабатывает сообщение IPN с PayPal (вам не нужно писать, что с нуля вот первая реализация PHP я нашел в поиске Google https://github.com/dodev34/paypal-ipn-response-client)

Затем вы хотите базовый объект, обрабатывает ваши подключения к базе данных. И, наконец, вам нужен объект statsmembers, который расширяет ваш объект подключения к базе данных и применяет вашу бизнес-логику. Вы можете просто поднять код PHP ORM, например, то, что вы видите здесь http://www.phpactiverecord.org/projects/main/wiki/Quick_Start

Это позволит вам протестировать функциональность обновления отдельно от фактической связи IPN в PayPal. Хорошая новость заключается в том, что вам не нужно полагаться на запись в системные файлы для отладки, как это было предложено в комментарии выше.

Я не вижу конкретной ошибки в вашем коде только с первого взгляда, извините, вы уверены, что правильно пропустили payer_email через paypal?

Смежные вопросы