web-dev-qa-db-ja.com

PaypalのリターンURLを設定し、自動リターンにしますか?

これは、次の質問です: PHP:Paypal checkoutを開始する簡単な方法?

したがって、私の問題は、戻りURLを指定していることです。ただし、Paypalで支払いを行った後、次のような画面が表示されます。

支払いが完了しました。 XXXX、お支払いが完了しました。この支払いのトランザクションIDはXXXXXXXXXXXXXです。

確認メールを[email protected]に送信します。この取引は、Paypalとして明細書に表示されます。

Go to Paypal account overview

この画面を表示せず、直接リターンURLにアクセスするために必要です。私は持っています:

  • 「return」変数を設定します
  • 「rm」変数を次のように設定します:2(ガイド= "によれば、購入者のブラウザはPOSTメソッドとすべての支払いを使用して、リターンURLにリダイレクトされます。変数が含まれています ")

実際、ここに私のフォーム全体があります:

<form method="post" action="https://www.sandbox.Paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="[email protected]" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order at The Greek Merchant:&lt;Br /&gt;Goldfish Flock BLG&lt;br /&gt;" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/Paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

どうすれば自動的に戻ることができますか?または、データベースを更新できるように、支払いの結果を自分のWebサイトに戻すにはどうすればよいですか? IPNとは何ですか?

122
coderama

Paypalアカウントで自動復帰を有効にする必要があります。有効にしないと、returnフィールドが無視されます。

ドキュメントから(2019年1月の新しいレイアウトを反映するように更新):

自動復帰はデフォルトでオフになっています。自動復帰をオンにするには:

  1. https://www.Paypal.com または https://www.sandbox.Paypal.com でPaypalアカウントにログインします。MyAccount Overviewページが表示されます。
  2. 右上の歯車アイコンをクリックします。 [プロファイルの概要]ページが表示されます。
  3. 左の列の[マイセリング設定]リンクをクリックします。
  4. 「オンライン販売」セクションで、「Webサイト設定」の行にある「更新」リンクをクリックします。ウェブサイトの支払い設定ページが表示されます
  5. [ウェブペイメントの自動復帰]で、[オン]ラジオボタンをクリックして自動復帰を有効にします。
  6. [リターンURL]フィールドに、支払人が支払いを完了した後にリダイレクトするURLを入力します。注:Paypalは、入力したリターンURLを確認します。 URLが正しくフォーマットされていないか検証できない場合、Paypalは自動復帰を有効にしません。
  7. ページの一番下までスクロールし、[保存]ボタンをクリックします。

IPNは、即時支払い通知用です。自動復帰から得られる情報よりも信頼性の高い/有用な情報が得られます。

IPNのドキュメントはこちら: https://www.x.com/sites/default/files/ipnguide.pdf

IPNのオンラインドキュメント: https://developer.Paypal.com/docs/classic/ipn/gs_IPN/

一般的な手順は、リクエストでnotify_urlパラメータを渡し、IPN通知を処理および検証するページを設定することです。Paypalはそのページにリクエストを送信して、支払い/払い戻しなどを通知します。通過します。そのIPNハンドラーページは、注文を支払済みとしてマークするためにデータベースを更新する正しい場所になります。

188
Kevin Stricker

直接支払いにPHPを使用したサンプルフォーム。

<form action="https://www.Paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="upload" value="1">
    <input type="hidden" name="business" value="[email protected]">

    <input type="hidden" name="item_name_' . $x . '" value="' . $product_name . '">
    <input type="hidden" name="amount_' . $x . '" value="' . $price . '">
    <input type="hidden" name="quantity_' . $x . '" value="' . $each_item['quantity'] . '"> 
    <input type="hidden" name="custom" value="' . $product_id_array . '">
    <input type="hidden" name="notify_url" value="https://www.yoursite.com/my_ipn.php">
    <input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php">
    <input type="hidden" name="rm" value="2">
    <input type="hidden" name="cbt" value="Return to The Store">
    <input type="hidden" name="cancel_return" value="https://www.yoursite.com/Paypal_cancel.php">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="currency_code" value="USD">
    <input type="image" src="http://www.Paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with Paypal - its fast, free and secure!">
</form>

親切に、notify_url、return、cancel_returnの各フィールドを調べてください。

支払いが行われた後にPaypalによって要求されるipn(my_ipn.php)を処理するためのサンプルコード。

IPNの作成の詳細については、 this リンクを参照してください。

<?php
// Check to see there are posted variables coming into the script
if ($_SERVER['REQUEST_METHOD'] != "POST")
    die("No Post Variables");
// Initialize the $req variable and add CMD key value pair
$req = 'cmd=_notify-validate';
// Read the post from Paypal
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
// Now Post all of that back to Paypal's server using curl, and validate everything with Paypal
// We will use CURL instead of PHP for this for a more universally operable script (fsockopen has issues on some environments)
//$url = "https://www.sandbox.Paypal.com/cgi-bin/webscr";
$url = "https://www.Paypal.com/cgi-bin/webscr";
$curl_result = $curl_err = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

$req = str_replace("&", "\n", $req);  // Make it a Nice list in case we want to email it to ourselves for reporting
// Check that the result verifies
if (strpos($curl_result, "VERIFIED") !== false) {
    $req .= "\n\nPaypal Verified OK";
} else {
    $req .= "\n\nData NOT verified from Paypal!";
    mail("[email protected]", "IPN interaction not verified", "$req", "From: [email protected]");
    exit();
}

/* CHECK THESE 4 THINGS BEFORE PROCESSING THE TRANSACTION, HANDLE THEM AS YOU WISH
  1. Make sure that business email returned is your business email
  2. Make sure that the transaction�s payment status is �completed�
  3. Make sure there are no duplicate txn_id
  4. Make sure the payment amount matches what you charge for items. (Defeat Price-Jacking) */

// Check Number 1 ------------------------------------------------------------------------------------------------------------
$receiver_email = $_POST['receiver_email'];
if ($receiver_email != "[email protected]") {
//handle the wrong business url
    exit(); // exit script
}
// Check number 2 ------------------------------------------------------------------------------------------------------------
if ($_POST['payment_status'] != "Completed") {
    // Handle how you think you should if a payment is not complete yet, a few scenarios can cause a transaction to be incomplete
}

// Check number 3 ------------------------------------------------------------------------------------------------------------
$this_txn = $_POST['txn_id'];
//check for duplicate txn_ids in the database
// Check number 4 ------------------------------------------------------------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode the string, make it an array, then query all the prices out, add them up, and make sure they match the payment_gross amount
// END ALL SECURITY CHECKS NOW IN THE DATABASE IT GOES ------------------------------------
////////////////////////////////////////////////////
// Homework - Examples of assigning local variables from the POST variables
$txn_id = $_POST['txn_id'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];
// Place the transaction into the database
// Mail yourself the details
mail("[email protected]", "NORMAL IPN RESULT YAY MONEY!", $req, "From: [email protected]");
?>

下の画像は、Paypalのプロセスを理解するのに役立ちます。 Paypal process flow

詳細については、次のリンクを参照してください。

これがあなたを助けることを願っています.. :)

41

私が見つけた1つの方法:

生成されたフォームコードにこのフィールドを挿入してみてください。

<input type='hidden' name='rm' value='2'>

rmreturn methodを意味します;

2(post)を意味します

ユーザーが購入してサイトのURLに戻った後、そのURLはPOSTパラメーターも取得します

追伸phpを使用している場合は、var_dump($_POST);をreturn url(script)に挿入してから、テスト購入を行い、サイトに戻ったときに、urlで取得されている変数を確認します。

22
T.Todua

私が最近問題に遭遇したのでこれを共有する このスレッドに似ている

長い間、私のスクリプトはうまく機能し(基本的な支払いフォーム)、POST変数を私のsuccess.phpページに返し、IPNデータもPOST変数として返しました。しかし、最近、戻りページ(success.php)がPOST変数を受け取らないことに気付きました。私はSandboxでテストしてライブを行い、Paypalが何かを変えたと確信しています!

Notify_urlは依然として正しいIPNデータを受け取り、DBを更新できますが、戻りURL(success.php)ページに成功メッセージを表示できませんでした。

Paypal Webサイトの支払い設定とIPNでオプションのオンとオフを切り替えるために多くの組み合わせを試してみましたが、メッセージを処理できるようにするには、スクリプトにいくつかの変更を加える必要がありました。 PDTと自動復帰をオンにすることでこれを達成しました この優れたガイドに従って

これですべて正常に動作するようになりましたが、唯一の問題は戻りURLにすべてのPDT変数が含まれていることです。

これは役に立ちます

4
Sol

Kevinが上記のように自動復帰値を設定するという考えは少し奇妙だと思います!

たとえば、同じPaypalアカウントを使用して支払いを処理するWebサイトが多数ある、または1つのWebサイトにさまざまな購入タスクを実行するセクションがいくつかあり、支払い時にさまざまな返信先が必要だとします完成されました。上記の「直接支払いにPHPを使用したサンプルフォーム」セクションで説明したように、ページにボタンを配置すると、そこに行があることがわかります。

input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"

個々の戻り値を設定します。プロファイルセクションでも同様に一般的に設定する必要があるのはなぜですか?!?!

また、プロファイルセクションで設定できる値は1つだけであるため、複数のアクションがあるサイトで自動復帰を使用できないことを(AFAIK)意味します。

コメントください?

3
Tim Makins

チェックアウトページで、非表示フォーム要素 'cancel_return'を探します。

cancel_returnフォーム要素の値を、戻りたいURLに設定します。

1
Rahul Shinde