• ベストアンサー

IP制限のある決済会社への接続方法

・PHPでショッピングサイトをサーバーAに設置 ・決済会社BはAのIPからしか受け付けない ・エンドユーザーCはAが提供するショッピングフォームで決済 CからBに必要なデータをポスト送信するとIPが違うのでBには接続できませんが、 これをAのIPにてデータ送信する最適な方法はどういったものがありますでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.4

>仕様書ではショップ⇒決済会社間はPOST送信 決済会社にPOSTするのはショップ(のwebサイトを置いているサーバ)からと明示されていますねww API仕様次第ですが、file_get_contentsでも第3引数(context)を適切にセットすればPOST可能です。 http://www.php.net/manual/ja/function.file-get-contents.php http://www.php.net/manual/ja/function.stream-context-create.php (例) 以下のようにして、test.phpにアクセスすればvar_dump_post.phpが返した内容($_POSTをvar_dumpしたもの)を表示できます。 【test.php】 <?php $data = http_build_query(array('aaa'=>'abc', 'bbb'=>'xyz')); $opts = array( 'http'=>array( 'method'=>"POST", 'header'=> "Content-type: application/x-www-form-urlencoded\r\nContent-Length: " . strlen($data) . "\r\n", 'content' => $data ) ); $context = stream_context_create($opts); print nl2br(htmlspecialchars(file_get_contents('http://localhost/var_dump_post.php', false, $context), ENT_QUOTES)); 【var_dump_post.php】 <?php if ($_POST) { var_dump($_POST); }

sooooochin
質問者

お礼

有難うございます。こういう方法もあるのですね。 今回作成したいものに近いように思います、一度試してみます。

その他の回答 (3)

  • coai
  • ベストアンサー率50% (152/301)
回答No.3

PHPはソケット通信ができますよ。 ソケットを開くことができるというべきか、ソケットを使える、扱えるというべきかもしれませんが、その辺はニュアンスで。 fsockopen http://www.php.net/manual/ja/function.fsockopen.php まあ、誤解を恐れずに言えばプロキシサーバを作るようなもので… ユーザーはサーバーAとのみ接続する。 裏で、どうやって決済会社Bとデータのやりとりをしているのかは、ユーザーから見ると判らないし、セキュリティ面から見ると決して判ってはいけない。 知られたからと言って即座に攻撃を受けるわけではないが、万一の事態を招かないためにお金に絡む事は慎重に慎重を期して。 サーバーAは決済会社Bと、ソケット通信を利用してデータをやり取りする。 プロキシサーバの要領なので、決済会社Bから見ると起点のIPアドレスはサーバーAのもの。 サーバーAから見ると、ユーザーのIPアドレスや端末情報などは判らないし、判る必要もない。 IP制限があるんだから基本はこの一択で、fsockopenを直接使うか、ラッパークラスを介するか、あるいはfopenなどを使って細かい動作はPHPの挙動に任せるか、実装手段には多少選択の幅がありますが。 個人的には、fsockopenを直接使うラッパークラスを自作するかな。(つーか、過去に作ったラッパークラスを拡張する) PHPとfsockopenで検索すれば、たぶん使えるサンプルコードは見つかると思いますよ。 つーか、決済会社Bは実装サンプルコードを用意してないの?頼めば貰えると思うんだけど。

sooooochin
質問者

お礼

早々にご回答いただき有難うございます。 仕様書ではPOST送信とあったので、自分の知識ではセキュリティー面では問題ありですがクライアントからのPOST送信か仰る通りソケット通信にて接続するかと思っていましたが、POST送信において何か他の手段があるのか教えて頂きたかった次第です、現時点でソケットでも上手くいっていませんが、、一度サンプルコードがあるか問い合わせてみます。

  • weakweak
  • ベストアンサー率34% (350/1003)
回答No.2

ABCはわかりにくいので普通に言うと、データの流れは以下のようになるかと思います。最初にいうと、何もデータの送信方法はPOSTだけではありません。 ユーザー > ショップ > 決済会社 一方、「CからBに必要なデータをポスト送信するとIPが違うのでBには接続できません」というデータの流れはいかのようになります。 ユーザー > 決済会社 素人の私でもこの流れが変なことがわかりますが、一応説明すれば、これがもし成立してしまった場合、ユーザーはショップの在庫状況に関わらず商品を注文できるようになってしまいます。とても問題だと思います。もし実現してしまったら、これをハッキングと呼ぶのかと思います。 ===ユーザー > ショップのデータ=== HTTPサーバーによって生成されたフォームからPOSTされたデータはPHP、そこからMySQLなどのデータベースに送信され、問題がなければ専用の仕組みを使って決済会社へ送られます。 ===ショップ > 決済会社=== いわゆる「API」というものを使って送信されるんじゃないでしょうか。サーバー対サーバーのやりとりなので、色々な方法を使ってデータがやりとりされるのかと思いますが、「POST」ではないことは確かです。(私はそこまで詳しくないので具体的にはわかりません)。

sooooochin
質問者

お礼

早々にご回答いただき有難うございます。 概略だけの説明ですみません、回答NO3で先に記載していますが、仕様書ではショップ⇒決済会社間はPOST送信とあったのでどのような方法があるのか教えて頂きたかった次第です、ひとまずソケット通信にてやってみたいと思います

回答No.1

CがAのIPで接続する方法としてはVPNがあればできるが、ショッピングサイトでしょ? VPNなんてあり得ない…。 そもそもCからBにデータをポストするということ自体がおかしい訳です。 Cから送信するのはあくまでAに大してであって、値を受け取ったAからBに送信するものではないですか? 決済会社のAPI仕様書とかチュートリアルがあるはずですよね…。

sooooochin
質問者

お礼

早々にご回答いただき有難うございます。 決済会社が用意している仕様書で十分に判断できなかったたもので、サンプルコード等含めて再度確認してみます。

関連するQ&A