2016-05-08 5 views
0

私はこのPAYPAL IPNの初心者ですpaypalを成功ページにリダイレクトせずにデータベースを更新できますか?

私はIPNファイルを持っています。
私の質問は、ユーザーが成功/ ipnページにリダイレクトされると、スクリプトはレコードを更新します。
しかし、ユーザーがリダイレクトされなかった場合、私は自分自身でpaypalをテストして、PAYPAL THANK YOU ORDERページにリダイレクトしてから、mozillaがウィンドウの警告をポップアップして「安全でないサイトに接続していますか? ) "私がイエスをクリックすると私の成功/ ipnページ、
にリダイレクトされますが、キャンセルをクリックすると私はペイパルありがとうございます。
あなたはキャンセルをクリックするかもしれないと心配しているので、リダイレクトとデータ文句を言わないので、どのように私は私の成功/ IPNページに

私をリダイレクトペイパルせずにデータベースを更新しない助言、そして下さい否決いけない、

ください

を更新します3210

$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"; 
} 


// STEP 2: Post IPN data back to paypal to validate 

$ch = curl_init('https://www.sandbox.paypal.com/cgi-bin/webscr'); // change to [...]sandbox.paypal[...] when using sandbox to test 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $req); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close')); 


// In wamp like environments that do not come bundled with root authority certificates, 
// please download 'cacert.pem' from "http://curl.haxx.se/docs/caextract.html" and set the directory path 
// of the certificate as shown below. 
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem'); 
if(!($res = curl_exec($ch))) { 
    // error_log("Got " . curl_error($ch) . " when processing IPN data"); 
    curl_close($ch); 
    exit; 
} 
curl_close($ch); 

// WRITE LOG 
$fh = fopen('result.txt', 'w'); 
fwrite($fh, $res .'--'. $req); 
fclose($fh); 


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

if (strcmp ($res, "VERIFIED") == 0) { 
    // check whether the payment_status is Completed 
    // check that txn_id has not been previously processed 
    // check that receiver_email is your Primary PayPal email 
    // check that payment_amount/payment_currency are correct 
    // process payment 

// assign posted variables to local variables 
$item_name = $_POST['item_name']; 
$item_number = $_POST['item_number']; 
$payment_status = $_POST['payment_status']; 
if ($_POST['mc_gross'] != NULL){ 
    $payment_amount = $_POST['mc_gross']; 
}else{ 
    $payment_amount = $_POST['mc_gross1']; 
} 
$payment_currency = $_POST['mc_currency']; 
$txn_id = $_POST['txn_id']; 
$receiver_email = $_POST['receiver_email']; 
$payer_email = $_POST['payer_email']; 
$custom = $_POST['custom']; 

// Insert your actions here 
if(($payment_status == 'Completed') && ($receiver_email == '[email protected]')){ 
     include('php/config.php'); //Open Database connection 

     $check = $dbo->prepare('SELECT * FROM order_bytes WHERE trans_id = ?'); 
     $check->execute(array($txn_id)); 

     if($check->rowCount() >= 1){ 
      die('ERROR FOUND SAME TXN ID IN DATABASE'); 
     }else{ 

      /*Data token = EAZZn0OkC2zo4H3CF9vrrSlU-grBGr0oQzE8NZ6jnYGRTuJkJS0howDNK48*/ 
         $stmt = $dbo->prepare("UPDATE `order_bytes` SET stat=? ,paid=?, trans_id=? WHERE `tracker`=? AND `user_id`=?"); 
         /*$stmt->bindValue(":stats", 'PAID', PDO::PARAM_STR); 
         $stmt->bindParam(":pay", $item_price, PDO::PARAM_STR); 
         $stmt->bindParam(":it", $item_transaction, PDO::PARAM_STR);        
         $stmt->bindParam(":trackers", $_SESSION['random_id'], PDO::PARAM_STR); 
         $stmt->bindParam(":uid", $_SESSION['byte_user'], PDO::PARAM_STR);*/ 
         if(!$stmt->execute(array($payment_status,$payment_amount,$txn_id,$_SESSION['tracker'],$_SESSION['byte_user']))){ 
          //print_r($stmt->errorInfo()); 
         }else { 
          if($stmt->rowCount() == 1){ 
           notify(getbyteuser($item_no),'A User Ordered your Byte<br />Tracker ID: '.$_SESSION['tracker'].'','NEW ORDER'); 
          //mail_booked($item_transaction); 

          echo "<div class=\"alert alert-success\"><h3>Thank you<br>Your payment has been successfull</h3> 
            <p>Keep track of your order in your Dashboard</p> 
           </div>"; 
          echo '<a href="index.php" class="btn btn-primary" rel="noindex" nofollow="">Done</a>'; 

          }else{ 
           print alert_danger('Error'); 
          } 

         } 

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

私は現在、次の1時間は私のコンピュータから離れています。定期的にこのトピックをチェックしてください。私が家に帰ったら何かを見つけ出したり、大まかなアドバイスをしたりします –

+0

Do not GetMagicQuotesを使用しないでください。その機能は壊れています。http://php.net/manual/en/security.magicquotes .php – Johan

+0

@Johanは言いました。そして私の質問について?何か案は。 – Jonathan

答えて

1

あなたはIPNと戻りページについて混乱しています。

これは間違っている:支払っているユーザーは、成功/ IPNページ

にリダイレクトされます一度

ので、私の質問は、IPNが成功のページではありません。これは、PayPalがバックグラウンドで呼び出して、トランザクションステータスを通知するページです。ユーザーセッションとは独立しています。 (notify_url)

PayPalが支払いを完了(またはキャンセル)した後にユーザーをリダイレクトするページは、IPNとは異なります。これはユーザーセッション(return_url)に関連しています

+0

OKページではありません。 IPNが成功ページでない場合は、ユーザーが支払いを受けたらデータベースを更新するにはどうすればよいですか?私がすべき別のことがあると思いますか? – Jonathan

+0

提示したコードでデータベースを更新することができます。それはPayPalによって呼び出されますが、あなたのユーザはそれを見ません。だから私はそれから( "あなたのダッシュボードであなたの注文を追跡する"のような)任意の出力を削除します。 通常、ユーザーがリダイレクトされる前にIPNが送信されます。ですから、ありがとうございましたページでは、データベースを簡単にチェックしてステータスを確認することができます。または、単に「注文は進行中」のようなものを印刷してください。 – CCamilo

+0

はい、私はそれをしました、元々私の成功のページはIPNのページではありませんでした。私はそれを変更しました。だからこそ私の成功ページを自分のIPNページに変更してから更新するだけです。しかし、PDTを使用することとの違いはわかりません。PDTは成功ページにリダイレクトされた後にしかデータを提供できないので、間違っていたことがわかったときです。だから、私はここで、私がすでにあなたが上記の言葉を使って試してみたということです、私はこの質問を投稿しました。 – Jonathan

関連する問題