2015-02-03 1 views
-1

지불 할 때 내 데이터베이스의 테이블을 업데이트하기 위해 paypal IPN Sandbox를 사용하고 있습니다. 내 ipn 로그를 기반으로 확인하고 확인을 보여줍니다. 여기 내 ipn입니다. 또한 내 IPN에서 이메일을받을 수 없습니다.Paypal IPN이 유효하지만 데이터베이스를 업데이트하지 않았습니다.

include ('conn.php'); 
// CONFIG: Enable debug mode. This means we'll log requests into 'ipn.log' in the same directory. 
// Especially useful if you encounter network errors or other intermittent problems with IPN (validation). 
// Set this to 0 once you go live or don't require logging. 
define("DEBUG", 1); 

// Set to 0 once you're ready to go live 
define("USE_SANDBOX", 1); 


define("LOG_FILE", "./ipn.log"); 


// Read POST data 
// reading posted data directly from $_POST causes serialization 
// issues with array data in POST. Reading raw POST data from input stream instead. 
$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 post from PayPal system and add 'cmd' 
$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"; 
} 

// Post IPN data back to PayPal to validate the IPN data is genuine 
// Without this step anyone can fake IPN data 

if(USE_SANDBOX == true) { 
    $paypal_url = "https://www.sandbox.paypal.com/cgi-bin/webscr"; 
} else { 
    $paypal_url = "https://www.paypal.com/cgi-bin/webscr"; 
} 

$ch = curl_init($paypal_url); 
if ($ch == FALSE) { 
    return FALSE; 
} 

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); 

if(DEBUG == true) { 
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, 1); 
} 

// CONFIG: Optional proxy configuration 
//curl_setopt($ch, CURLOPT_PROXY, $proxy); 
//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1); 

// Set TCP timeout to 30 seconds 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); 

// CONFIG: Please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path 
// of the certificate as shown below. Ensure the file is readable by the webserver. 
// This is mandatory for some environments. 

//$cert = __DIR__ . "./cacert.pem"; 
//curl_setopt($ch, CURLOPT_CAINFO, $cert); 

$res = curl_exec($ch); 
if (curl_errno($ch) != 0) // cURL error 
    { 
    if(DEBUG == true) { 
     error_log(date('[Y-m-d H:i e] '). "Can't connect to PayPal to validate IPN message: " . curl_error($ch) . PHP_EOL, 3, LOG_FILE); 
    } 
    curl_close($ch); 
    exit; 

} else { 
     // Log the entire HTTP response if debug is switched on. 
     if(DEBUG == true) { 
      error_log(date('[Y-m-d H:i e] '). "HTTP request of validation request:". curl_getinfo($ch, CURLINFO_HEADER_OUT) ." for IPN payload: $req" . PHP_EOL, 3, LOG_FILE); 
      error_log(date('[Y-m-d H:i e] '). "HTTP response of validation request: $res" . PHP_EOL, 3, LOG_FILE); 
     } 
     curl_close($ch); 
} 

// Inspect IPN validation result and act accordingly 

// Split response headers and payload, a better way for strcmp 
$tokens = explode("\r\n\r\n", trim($res)); 
$res = trim(end($tokens)); 

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





$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']; 
    $fee = $_POST['mc_fee']; 
    $citems = $_POST['num_cart_items']; 
    $orderID = $_POST['custom']; 
    $status = "Complete"; 
    $orderstatus = "Processing"; 


     if($payment_status == "Completed"){ 




     $getinfo_sql = " SELECT * FROM orders a, users b 
    where 
    a.userID = b.userID 
    a.orderID = '$orderID'"; 



$getinfo = mysqli_query ($conn, $getinfo_sql); 


while ($getinfo = mysqli_fetch_assoc($getinfo)) 

    { 
     $custemail = $getinfo['email']; 
     $paymode = $getinfo['paymentmode']; 

    } 






    if($paymode == "Full Payment") 
    { 


//   date_default_timezone_set('Asia/Manila'); 
// 
//$currentdate = date("y-m-d"); 
//$currentTime = date("g:i:s a"); 



//$audit = "INSERT INTO tbl_audittrail( username , action, `date`, `time`) VALUES( '$sname' , '$action', '$currentdate', '$currentTime') "; 
//mysql_query($audit) or die(mysql_error());   
// 
      $checkn = mysqli_query($conn, "SELECT * FROM notifications where orderID ='$orderID'"); 
while($notifs= mysql_fetch_assoc($checkn)) 
    { 

      $notifIDs = $notifs["notificationID"]; 



    } 



$seen = 0; 
$stat= "Processing: Full Payment"; 


$updatenotif = mysqli_query($conn,"Update notifications set seen=0, details = '$stat' where notificationID ='$notifIDs'"); 







$message = " We have received the payment for your order OrderID: $orderID \n \n "; 
       $message .= "You can download the receipt at your Order History"; 
       $message .= "For more info about your Order Call us at 611-1111/622-2222/633-3333"; 
       $message .="\n \n Thanks, \n MVRAM "; 


       mail($custemail, 'Payment Received', $message, 'From:[email protected]'); 





       mysql_query($conn,"UPDATE orders SET `paymentstatus` = '".$status."', `orderstatus` = '".$status."' WHERE `orderID` = '".$orderID."'") or die(mysql_error()); 
    } 





     }else{ 





     } 















    if(DEBUG == true) { 
     error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE); 
    } 
} else if (strcmp ($res, "INVALID") == 0) { 
    // log for manual investigation 
    // Add business logic here which deals with invalid IPN messages 
    if(DEBUG == true) { 
     error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE); 
    } 
} 
+3

* 2 시간 안에 프로젝트 마감일 *이 있습니까? 정말 ... – imtheman

+1

예 학교 프로젝트에 대한 – Bladesss

+0

질문을 수정하여 원하는 출력을 독자에게 분명히하는 것이 좋습니다, 당신이 무엇을 요구하는지 명확하지 않습니다. – lfender6445

답변

2

코드를 디버그하고 더 쉽게 수정할 수있는 부분으로 나누는 것이 좋습니다.

PayPal IPN을 사용 중이므로 먼저 IPN 응답을 올바르게 수신했는지 확인해야합니다.

로거가 작동하는 경우 먼저 로그 파일을 사용하여 해당 부분을 디버깅하십시오.

문제를 발견하면 IPN 데이터를 받고 확인하는 부분을 수정하십시오.

1) 다시 IPN을 테스트하고 로그에 $ _POST의 내용을 쓰기 : 당신은 IPN의 첫 번째 부분은이 기술을 사용하여 빠르게 나머지 코드 디버깅을 계속 작동하는지 확인 들어가면

var_export($_POST, true)
2) 로그 파일을 열고 IPN이 보낸 $ _POST의 전체 배열이 있는지 확인하십시오
3) 해당 배열을 복사하고 원본 $ _POST 데이터를 스크립트에 가짜 만듭니다. $ _POST = array (.. 로그의 필드 ..);
4) IPN 확인을 수행하는 스크립트의 모든 부분을 주석으로 처리하고 위조 된 $ _POST 만 남겨 두십시오.
5) 예제를 열어 PayPal의 IPN 로봇처럼 수동으로 스크립트에 액세스 할 수 있습니다 .com/paypal_ipn_script.php

이제 스크립트의 나머지 SQL 쿼리를 디버깅하고 F5를 누르고 print_r(), var_dump(), die() 등을 사용하여 실패한 부분을 계속 디버깅 할 수 있습니다. 모든 테스트마다 새로운 페이팔 결제를해야하므로 디버깅 프로세스가 빨라집니다.

+0

당신은 내 생명을 구 해주셔서 감사합니다. 마지막 2 분 롤 정말 고마워요! – Bladesss

0

결제가 완료되면 내 데이터베이스의 테이블을 업데이트하기 위해 paypal IPN Sandbox를 사용하고 있습니다.이 코드를 전체 시작일부터 시작하십시오.

$data = $_POST; 
    $url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'; 
    $data['cmd'] = '_notify-validate'; 

    $curl = curl_init(); 
    curl_setopt_array(
     $curl, 
     array(
      CURLOPT_RETURNTRANSFER => 1, 
      CURLOPT_FOLLOWLOCATION => 1, 
      CURLOPT_POST   => 1, 
      CURLOPT_SSL_VERIFYPEER => false, 
      CURLOPT_URL   => $url, 
      CURLOPT_POSTFIELDS  => $data 
     ) 
    ); 
    if(!($result = curl_exec($curl))){ 
     die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); 
    } 
    curl_close($curl); 
    if ($result != 'VERIFIED') { 

     die('Fraud IPN on Varification.'); 
    } 
     $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']; 
      $ctIdcustom  = $_POST['custom']; 

      //your action here