PayPalの返却URLを設定して、自動で返却する


127

これは次の質問です:PHP:PayPalチェックアウトを開始する簡単な方法?

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

お支払いが完了しました。XXXX、お支払いが完了しました。このお支払いの取引IDはXXXXXXXXXXXXXです。

XX@XXXX.comに確認メールを送信します。このトランザクションは、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="onlinestore@thegreekmerchant.com" 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>

自動的に元に戻す方法はありますか?または、支払いの結果をウェブサイトに返してデータベースを更新するにはどうすればよいですか?IPNとは何ですか?


カスタムリターンパラメータのEnteresホストは、PayPalアカウントで設定されたものと同じでなければならないことに注意してください。
アンドレアス

回答:


199

PayPalアカウントで自動返品を有効にする必要があります。そうしないと、 returnます。フィールドます。

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

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

  1. https://www.paypal.comまたはhttps://www.sandbox.paypal.comでPayPalアカウントにログインします [マイアカウントの概要]ページが表示されます。
  2. 右上の歯車アイコンをクリックします。プロファイルの概要ページが表示されます。
  3. 左側の列にある「私の販売設定」リンクをクリックします。
  4. [オンライン販売]セクションで、[ウェブサイトの設定]の行にある[更新]リンクをクリックします。[ウェブサイトの支払い設定]ページが表示されます
  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ハンドラーページは、注文を支払い済みとしてマークするようにデータベースを更新するための正しい場所になります。



5
Paypalの新しいWebサイトレイアウトでは、これは正確ではなくなりました。ステップ3)クリックMy Selling Tools ステップ4)Website Preferences下をクリックSelling Online
Webnet

2
注文がPayPalによって正しく処理されたことを確認するためにIPNを使用する必要がありますが、成功したことをユーザーに示すために返品URLが必要です。多くの場合、ユーザーは送信された電子メールを受信しません。そのため、製品(ダウンロードなど)にすぐにアクセスできると便利です。
pcunite 2013年

1
@Kevin Stricker 2つの異なるサイトに戻りURLを設定するにはどうすればよいですか?2つのウェブサイトに1つのpaypalアカウントを使用するような場合ですが、手順を使用してリターンURLとして追加できるURLは1つだけです。2つのサイトでどのように使用できますか?
Gaurav、2015

4
これは、ことを非常に正確ではありません「あなたはそれ以外の場合は無視されます、あなたのPayPalアカウントに自動復帰を有効にする必要がreturnフィールドを。」returnチェックアウトに渡すURLパラメータはすべて、販売者のPayPalアカウントプロファイルで設定されている自動リターンURL(またはその欠如)を上書きしますが、自動リターンが有効になっていない場合、購入者は手動でクリックして、自動的にリダイレクトされるのではなく、そのURLにリダイレクトされるためのチェックアウトの終了。
SubGothius

42

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="you@youremail.com">

    <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の作成の詳細については、このリンクを参照しください。

<?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("you@youremail.com", "IPN interaction not verified", "$req", "From: you@youremail.com");
    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 != "you@youremail.com") {
//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("you@youremail.com", "NORMAL IPN RESULT YAY MONEY!", $req, "From: you@youremail.com");
?>

以下の画像は、ペイパルのプロセスを理解するのに役立ちます。 Paypalプロセスフロー

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

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


1
これが今日のpaypal APIでまだ有効かどうか誰でも知っていますか?質問は2歳です。
Matt Welander 2014

1
「return」および「cancel_return」URLは、購入者に即時のトランザクションフィードバックを提供するために使用され、そのためにPDT変数を使用できます。ただし、PPはそれらを1回だけ試行するため、重要な注文の履行に依存することはできません(購入者が支払い後にブラウザを閉じると言いますが、PPのままです)。そのため、「notify_url」を介して信頼性の高いIPNプロセスでバックアップし、少なくとも「完了」ステータスを処理することをお勧めします(他に何かが失敗し、おそらく手動のネゴシエーションが必要であると想定します)。PDTおよびIPNサーバーの処理では、注文が1度だけ行われるようにする必要があります。
Patanjali 2016年

私は物事が変更され、Paypal success.phpがGET変数でのみ機能するようになったと思います。ここを参照してください:stackoverflow.com/questions/45671366/...
ソル

23

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

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

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

rmreturnメソッドを意味します。

2(ポスト)を意味します

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

PS var_dump($_POST);PHP を使用している場合は、戻りURL(スクリプト)に挿入してから、テスト購入を行ってください。サイトに戻ると、URLにどの変数が設定されているかがわかります。


実際に使用しましたか?
Simon Gibbs

これは素晴らしかった。paypalで支払いデータ転送がオフになっている限り、すべての投稿設定が戻りURLに送信されます。
JulianJ 2017

4

最近このスレッドと同様の問題が発生したため、これを共有します

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

notify_urlは引き続き正しいIPNデータを受信して​​DBを更新できますが、戻りURL(success.php)ページに成功メッセージを表示できませんでした。

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

これですべて正常に機能しますが、唯一の問題は戻りURLにすべてのPDT変数が含まれていることです。

これ役に立つかもしれません


3

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

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

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

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

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

コメントしてください?


3
リターンパラメータは、ペイパル設定の自動リターンURLセットアップをオーバーライドする各フォームに渡すことができます
DropHit

1
そうそう、DropHitが言ったことは、それがパラメーターとして渡すことを忘れた場合に備えて、単なるデフォルトの自動戻り値です。パラメータとして渡すと、各WebサイトのリターンURLが使用されます。
2015年

これは役に立ちますか?codeseekah.com/2012/02/11/...
ハミッシュ

@DropHit PDTはまだボタンごとのオーバーライドされたreturn値で動作しますか?それでも、すべてがPDTデータを受信する別の戻りページを持つことができますか?
2016

申し訳ありませんが返事が遅れのために-私はそれが動作することを確信はないですが、それは私がするように、あなたのユースケースが動作することを保証するものではありませんが、期待通りに私の現在の統合がまだ動作している
DropHit

1

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

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


実際、「キャンセルリターン」は、トランザクションが失敗した場合にのみ使用されます。また、正常に完了したトランザクションを処理するために「リターン」URLを提供する必要があります。そうしないと、デフォルトのURLが使用されます。
Patanjali 2016年

トランザクションが失敗したときではなく、購入者がチェックアウト中に[キャンセルして[販売者名]に戻る]リンクをクリックして注文の完了を中止したとき。
SubGothius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.