2013-07-03 1 views
0

필자는 하루 종일 PayPal IPN 리스너를 샌드 박스 모드로 실험 해본 결과 내 용도로 샘플 코드를 수정하려고했습니다. 내가 얻는 결과 - 리스너 스크립트에 전송 된 각 IPN에 대해 6 줄의 데이터를 삽입하면 맨 아래에서 실행되는 MySQL 쿼리와 혼동됩니다. 필자는 쿼리를 변경했으며 데이터베이스에 삽입 된 내용을 재현하여 내 요점을 설명했습니다. 코드 아래의 표를 참조하십시오. 어떤 아이디어? 다른 API를 사용하기 전에 이런 일이 일어 났음을 기억하지만 확실한 원인이 될 수 있습니다. 양식이 제대로 작동하는지 확인할 수 있으면 데이터를 올바르게 탈출 할 수 있습니다.Paypal IPN 리스너 페이지에서 MySQL 데이터를 여러 번 삽입하는 중

+----+-------------------+---------------------+ 
| id | email    | password   | 
+----+-------------------+---------------------+ 
| 25 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 26 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 27 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 28 | [email protected] | 2013-07-03 17:15:58 | 
+----+-------------------+---------------------+ 
| 29 | [email protected] | 2013-07-03 17:15:59 | 
+----+-------------------+---------------------+ 
| 30 | [email protected] | 2013-07-03 17:15:59 | 
+----+-------------------+---------------------+ 

왜 데이터가 삽입되는 여러 번이 IPN에 대해 다음과 같이

<?php 
$dbc = mysqli_connect ('host', 'user', 'pass', 'db'); 

// read the post from PayPal system and add 'cmd' 
$req = 'cmd=_notify-validate'; 
foreach ($_POST as $key => $value) { 
$value = urlencode(stripslashes($value)); 
$req .= "&$key=$value"; 
} 
// post back to PayPal system to validate 
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; 
$header .= "Content-Type: application/x-www-form-urlencoded\r\n"; 
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; 

$fp = fsockopen ('www.sandbox.paypal.com', 80, $errno, $errstr, 30); 


if (!$fp) { 
// HTTP ERROR 
} else { 
fputs ($fp, $header . $req); 
while (!feof($fp)) { 
$res = fgets ($fp, 1024); 
if ((stristr ($res, "VERIFIED") == 0) && 
($_POST['payment_status'] == 'Completed')) 
{ 

// PAYMENT VALIDATED & VERIFIED! 
$email = $_POST['payer_email']; 

$next = mysqli_query($dbc, "INSERT INTO users (email, password) VALUES('$email', NOW()) "); 

$to  = $email; 
$subject = 'Download Area | Login credentials'; 
$message = ' 

Thank you for your purchase 

Your account information 
------------------------- 
Email: '.$email.' 
Password: 
------------------------- 

You can now login at http://yourwebsite.com/PayPal/'; 
$headers = 'From:[email protected]' . "\r\n"; 

mail($to, $subject, $message, $headers); 

} 

내가 한 IPN에서 가져온 데이터는 무엇입니까?

답변

2

스크립트가 200 OK 응답을 PayPal로 돌려 보내지 않으면 시스템은 스크립트가 동일한 데이터를 얻을 때까지 스크립트에 동일한 데이터를 계속 게시합니다. 스크립트가 끝내 약간의 오류를 제외하고는 성공적으로 실행되면 데이터가 실제로 올바르게 삽입 된 곳을 볼 수 있지만 PayPal은 알림을 계속 보내고 계속해서 추가합니다.

스크립트가 200 OK를 반환하는지 확인해야합니다. 샌드 박스 계정의 IPN 기록을 확인하여 거기에 표시된 내용을 확인하십시오.

나는 브라우저에서 테스트를하고 있으므로 결과를 화면에 표시하고 문제를 제거 할 수 있습니다. 이렇게하려면 IPN에서 다시 가져올 필드와 일치하는 숨겨진 필드가있는 기본 HTML 양식을 만드십시오. 양식의 동작을 IPN 스크립트로 설정하면 브라우저에서 결과를 볼 수 있도록로드하고 제출할 수 있습니다. 실패없이이 작업을 수행하고 데이터베이스에 단일 항목 만 삽입하면 PayPal에서 동일한 방식으로 작동한다는 것을 확신 할 수 있습니다.

실제적으로 PayPal에서 온 것이 아니기 때문에 데이터가 확인되지 않을 것임을 테스트 할 때, 확인되지 않은 IPN을 어떻게 처리하는지에 따라 코드를 조정해야합니다. 테스트 목적.

+0

감사합니다. @ 앤드류 앤젤 나는 그것을 시도하고 여기에 다시보고 할 것입니다. – Welly

+0

그리고 200을 돌려 주더라도 겹칠 수는 있습니다. 자신이 중복되었는지 확인해야합니다. – EJP