0

私は現在、管理している PHP/MySQL ベースの e コマース Web サイトを RBS Worldpay 支払いゲートウェイと統合する作業を行っています。これが私の問題です:

顧客がショッピング バスケットをいっぱいにすると、コンテンツが$_SESSIONグローバル配列に保存されるだけでなく、Cookie にも保存されます。顧客がチェックアウトすると、支払いの詳細を入力するために Worldpay ページに送られます。「支払い応答」/コールバック機能を使用して、成功した支払いを自分のページ「confirmation.php」にリダイレクトします。これは、すべてが順調であることを顧客に伝え、バックグラウンドでいくつかのデータベースクエリを実行します.

大丈夫だ!

ただし、この時点で、$_SESSION配列からショッピング カートのデータを空にし、Cookie を削除したいと考えています。とてもいいので、私はただ使用します:

$_SESSION['cart'] = array();
setcookie('cart', '', 0, '/');

しかし、これはうまくいきません。そして、このリダイレクトされたページの URL が実際にhttps://secure-test.wp3.rbsworldpay.com/wcc/purchasewww.mysite.co.uk/confirmation.php. テストとして、確認ページに phpinfo() をエコーさせ、$_SERVER vars から、すべて問題ないようです。

_SERVER["DOCUMENT_ROOT"]    /var/www/vhosts/mysite.co.uk/httpdocs
_SERVER["SCRIPT_FILENAME"]  /var/www/vhosts/mysite.co.uk/httpdocs/confirmation.php
_SERVER["SERVER_PROTOCOL"]  HTTP/1.0
_SERVER["REQUEST_METHOD"]   POST
_SERVER["QUERY_STRING"] installation=[xxxxxx]&msgType=authResult
_SERVER["REQUEST_URI"]  /confirmation.php?installation=xxxxxx&msgType=authResult
_SERVER["SCRIPT_NAME"]  /confirmation.php
_SERVER["PHP_SELF"] /confirmation.php
_SERVER["HTTP_USER_AGENT"]  WJHRO/1.0 (WorldPay Java HTTP Request Object)

URL が別のドメインを指しているという事実のために、私のスクリプトは $_SESSION および $_COOKIE データにアクセスすることも、操作することもできないようです。この Worldpay システムがどのようにそれを行っているかはわかりません。iframe などではありませんが、ユーザー エージェント「WJHRO/1.0 (WorldPay Java HTTP Request Object)」に関係していると思われます。

誰もこれに精通していますか?どうすればこれを回避できますか?

読んでくれてありがとう!

マイケル

4

1 に答える 1

2

WorldPay が支払いの処理を完了すると (覚えておいてください: カードの詳細に関するすべての操作は WorldPay のサイトで実行されたため、顧客がそこで何をしたかはわかりません) 、トランザクションの結果 (承認、拒否、顧客によるキャンセルなど) を通知するPOSTリクエストが送信されます。 . これは、顧客のコンピューター/ブラウザーからではなく、サーバーから直接行われるため、この要求を顧客に属する既存のチェックアウト セッション (ここで e コマース サイトを実行していると仮定します) と一致させることはできません。

顧客を WorldPay にリダイレクトするときは、必須フィールドとともに追加情報を渡す必要があります。そのようなフィールドにはMC_接頭辞があり、それらのかなりの数を渡すことができます (2 年以上前にこれを行ったので、すべての詳細を覚えていません)。

これらのフィールドに十分な情報を送信する必要があります (ただし、できるだけ少なくして暗号化する必要があります)。そのため、WorldPay からの POST リクエストが届いたときに、confirmation.phpそれらの追加フィールドを抽出し、セッションを復元します ( session_id()および関連する関数に注目します) または何か同様に(セッション処理の実装方法によって異なります。セッション データが DB に保存されている場合はさらに簡単です。セッション ID を知っていれば、セッションを簡単に偽装できます)、チェックアウトを続行します。

あなたの出力はconfirmation.php、顧客ではなく WorldPay に送り返されることに注意してください。WorldPay はまずそのページを処理してから、顧客に表示します。したがって、このページは非常にシンプルにする必要があり (非常に基本的なインターフェースでなければ、一部のタグは WorldPay によって削除できます)、顧客を Web サイト (たとえば、real_confirmation.php) にリダイレクトするだけで、顧客セッションなどに完全にアクセスできます。適切な確認ページが表示されます。このようなリダイレクトは、単純な JavaScript またはメタタグ (例: <meta http-equiv="refresh" content="2;url=http://www.example.com/real_confirmation.php">) で実現できます。

私がこれをコーディングしてから 2 年以上経過しているため、これを再確認する必要があります。現在、すべてのコードを持っているわけではなく、状況/ルールはその後変更される可能性があります (追記: WorldPay を使用していないため、私のコードは今では 100% 機能します。それ以降、プロセス全体に変更が加えられている可能性があります)。

于 2011-06-10T21:08:18.757 に答える