HTTPのメッセージボディの解析方法

このQ&Aのポイント
  • HTTPのメッセージボディには、決済結果や重要な情報が含まれることがあります。
  • メッセージボディ内の特定の情報を抽出するためには、検索文字列を使用することができます。
  • また、mb_で始まる関数を使用することで、HTTPのメッセージボディの解析が容易になります。
回答を見る
  • ベストアンサー

HTTPのメッセージボディについて質問です。

HTTPのメッセージボディについて質問です。 決済代行会社との接続で悩んでいます。 要求した決済の結果を、 「ヘッダに「content-type : text/plain;charset=Shift_JIS」、メッセージボディの1、2行目に以下の文字列を返します。」 とあり、 CHECK:OK SID=xxxxxx GOUKEI=nnnnnn や CHECK:NG SID=xxxxxxx (2行目もある場合あり) と仕様書に書いてあります。 どのようにしたら、この中から、CHECK: の結果がNGかOKか、や、SIDの番号や、GOUKEIの額を取り出すことが出来るのでしょうか? mb_・・・・ と色々な関数があるかと思いますが、どのようにしたら、HTTPのメッセージボディの1行目を検索文字列「str」に代入することができるのでしょうか? 自分がHTTPについてあまり理解していなく、知識不足だと思いますが、どなたかご教授お願いします。

  • PHP
  • 回答数3
  • ありがとう数10

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

  • ベストアンサー
回答No.3

投げる部分も作っていないように感じたので、file_get_contentsを使ってサンプル作ってみました。 手順としては ・決済代行会社に投げる値を作る ・投げる ・受け取る ・分解する という感じですね。 parseResponse()は適当に作ったので仕様書に従って書き換えてください。 >どのようにしたら、この中から、CHECK: の結果がNGかOKか、や、SIDの番号や、GOUKEIの額を取り出すことが出来るのでしょうか? $responseから取り出せます。 <?php /** * 返り値の分解用 */ function parseResponse($response) { $response = explode(' ', $response); $newResponse = array (); foreach ($response as $value) { $tempValue = explode('=', $value); if (preg_match('/^CHECK:(OK|NG)$/', $value, $maches)) { $newResponse['CHECK'] = $maches[1]; } elseif (count($tempValue) === 2) { $newResponse[$tempValue[0]] = $tempValue[1]; } else { $newResponse[] = $tempValue; } } return $newResponse; } //test //決済会社に投げるパラメーターです。 $contents = array ( 'dummy_id' => '001', 'dummy_total_price' => '105', ); //組み立てます。 $contents = http_build_query($contents, '', '&'); //ヘッダーを作ります。 $header = array ( 'Content-Type: application/x-www-form-urlencoded', 'Content-Length: '.strlen($contents) ); //リクエストを作ります。 $context = array ( 'http' => array ( 'method' => 'POST', 'header' => implode("\r\n", $header), 'content' => $contents ) ); //投げて受けます。 $response = file_get_contents('http://localhost/EC/2.php', false, stream_context_create($context)); //返り値のヘッダーは予約変数[$http_response_header]に入ってます。 $header = $http_response_header; //戻りを見てみます。 var_dump($response); //分解してみます。 $parsedResponse = parseResponse($response); //見てみます。 var_dump($parsedResponse); ?>

mitan3354
質問者

お礼

ソースを書いてくださり、本当にありがとうございます! 実際に実行してみて、完全には理解出来てはいないですが、こんな感じでデータを入れたり出したりするものなのだと、分かってきました。 記述の仕方も、普段私がソースコードを書くときよりずっとスマートでかっこいいです! ちゃんと全て理解しようと思っていますが、まったく訳が分からないでいたので、本当にありがとうございます<(_ _)>

その他の回答 (2)

回答No.2

決済の要求はどのように出されていますか?fsockopenやfile_get_contentsをお使いでしょうか

mitan3354
質問者

補足

ご回答、ありがとうございます。 仕様書には 「加盟店様サーバから以下のクレジット決済要求をPOSTまたはGET形式にてパラメータを付与して、弊社決済サーバにソケット通信で送信します。」 そして、その次に結果データの返りについて 「ヘッダに「content-type : text/plain;charset=Shift_JIS」、メッセージボディの1、2行目に以下の文字列を返します。」 POST.GETは理解出来るので要求については大丈夫なのですが、データの返りが分からないでいます。 よろしくお願いいたします。

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.1

どこの代行システムか、わかりませんが、 サンプルというのがついてきたか、オーダーすればもらえるはずですので、 それを使った方が早いと思いますよ。 最初は。 動かせるようになったら、そこから発展させてみてくださいね

mitan3354
質問者

補足

ご回答ありがとうございます。 先日、担当の営業の方が丁寧に説明してくれたのですが、サンプルがあるとは言われず、「そんなに難しいことではないのですが。。。動かしてみて貰えればわかると思います。」とのことでした。ですが、その動かし方が分からず。。。もう一度、サンプル等があるのか聞いてみようと思います。

関連するQ&A

  • HTTP POST によるレスポンスCGIについて

    HTTP POST によるレスポンスCGIについて いつも大変お世話になっております。 タイトルのシステムの組み方についてご質問がございます。 「内容」 決済システム会社からのリクエストに対するレスポンスを返すCGIを作成します。 「仕様」 通信方法:HTTP POST キャラクタセット:Shift-JIS text/csv(←ここの意味もわかりません) 仕様書には 「Httpリクエストに対するレスポンスとしてHTTPボディ部に記述してください」 例) 処理OKの場合:OK,    処理NGの場合:NG,既に完売済み CSV形式(カンマ区切り) とあります。 私のスキルとしては、「html」「PHP」が書ける程度です。 javaやPerlは全然分かりません。 仕様は単純かと思いますが、リクエストに対して自動でレスポンス(OKかNG)を返す仕組みが分かりません。 ご教授願いますでしょうか。

    • 締切済み
    • CGI
  • エクセルで特定の文字を見つけて、メッセージで知らせるようにしたいのですが・・・

    よろしくお願いします。 VBAの話になるのですが、 たとえば、A列から“NG”という単語がひとつでもあれば、メッセージで、「NGがあります」と表するにはどのようにコードを書いたらいいでしょうか。A列の最終行端はいつも同じではありません。よろしくお願いします。

  • HTTPリクエストにおいて送信できるHTTPヘッダ

    HTTPに明るいかたに質問です。 下記URLにHTTPヘッダーに含めることのできる文字はASCIIを拡張した8bitASCIIだと 記載があります。 参考URL http://www.studyinghttp.net/header#Utf8InParam このURLにはHTTPヘッダ、特にPOSTメソッドでリクエストを投げる際は、 パーセントエンコーディング(URLエンコードとは言わないのですね・・・。💦) をおこなって、拡張ASCIIの8bitで対応できる文字として符号化して送信するような記述があります。 たしかに、IEなどの特定のブラウザだとアンカータグのhref属性に日本語のパラメータをいれたリンク先をつくると 正しく送信できないときがあったような気もします。 もちろんHTTPの仕様がパーセントエンコーディングとなっている以上、それが正しいやりかたなのでしょうが、 考えればUTF-8なども8bit単位で符号されて 結果【あ】という文字は[¥xe3¥x81¥x82]という16進数のバイト列で表現できていますよね。 ということは、文字列を正しく符号化していえれば拡張ASCIIつまり8bitの範囲でおさめる事ができているのではとおもったのです。 パーセントエンコーディングも必要ないのではと思うのですが・・・。 上記に造詣の深い方、是非ご教授ください。 よろしくお願いします。

  • Access のメッセージボックスで

    Access でメッセージボックスに文字列を表示する時、文字列が長くなるので2行に表示したいのですが方法はありますか?

  • PerlでのHTTPヘッダのStatus変更

    内部処理の結果に応じて、成功の場合は「200 OK」、失敗の場合は「503 Service Unavailable」をHTTPヘッダのStatusに指定して返したいと思っています。 ヘッダを "Content-Type: text/html\n\n" だけにして返す場合は問題ないのですが、その前に "Status: HTTP/1.1 200 OK\n" や "Status: HTTP/1.0 503 Service Unavailable\n" を追加するとInternal Server Errorになってしまいます。 [現状] -------------------------------------------- $ret=system("コマンド"); $header = "Status: HTTP/1.1 200 OK\n"; $cmt = "OK"; if ($ret == 256) { $header = "Status: HTTP/1.0 503 Service Unavailable\n"; $cmt = "NG"; } $header .= "Content-Type: text/html\n\n"; print "$header"; print "$cmt"; exit; -------------------------------------------- なにか、Statusを変更する良い手段はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • エクセル 3つの文字列と空白以外の場合に隣のセルが空白ではない時カウントする

    下記のような状況で、A列には"AAA","BBB","CCC"と空白の他に 未知の文字列(A??やB??)があります。 この未知の文字列の時に、Bに文字列が入っている数をカウントする方法はありますでしょうか。 下記ではB4とB6をカウントします。    A   B 1  AAA  xxxxxx 2  BBB 3  CCC  xxxxxx 4  A??  xxxxxx 5  A?? 6  B??  xxxxxx 7 元データが1000行以上あるのでなんとか算出する方法が知りたいです。 よろしくお願いします。

  • RubyのHTTP POSTについて

    HTTP POSTについてお聞きしたいです。 http://ligin.weizmann.ac.il/~lpgerzon/mbs4/mbs.cgi のページに、自動で入力を投げて答えを返してもらうスクリプトを書きたいです。 dataに、Inputする文字列を&でつないで、 Net::HTTP.start('ligin.weizmann.ac.il', 80) {|http| response = http.post('/~lpgerzon/mbs4/mbs.cgi',data) puts response.body } という方法で実行してみたのですが、 帰ってくる出力が、上記のURIのソースのままになってしまいます。 GUIでクリックして入力した場合は、末尾がmbs3.cgiのページに移動するはずなのですが、 なぜか上手く入力を与えることができません。 説明が曖昧で申し訳ありません。 アドバイスなどだけでも構いませんので、 よろしくお願い致します。

    • ベストアンサー
    • Ruby
  • Excelでフィルタをかけると警告メッセージが頻発する

    Excel2003を使用しています。 あるシートでフィルタを適用しているのですが、どの列からも フィルタリングすると「オブジェクトの位置またはサイズが変更されます。」 というメッセージが出て、OKを押しても何度も同じものが出て OKを連打しないとフィルタリングされません。5.6回位同じのが出ます。 どのようにすればメッセージがでなくなるのでしょうか? ファイルのサイズは3MB位で、S列まで、8000行位あります。 よろしくお願いします。

  • 「エクセルで文字入力されている右側の列を表示」について教えてください

    エクセルで文字入力されている右側の列を表示させたい。 例えば    A列  B列  C列    表示結果 1行 はい いいえ OK・・・→OK 2行 いいえ はい・・・・・・→はい 3行 はい FALSE FALSE・・・→はい という具合に表示される計算式を教えてください。

  • HTTP 200 OKの後のリダイレクト?

    OS:Windows Vista Business IEやFirefoxであるフォーム(Host:xxx.example.com/test)にPOSTしました。 そのレスポンスのHttpヘッダに「HTTP/1.1 200 OK」とありました。 続いてブラウザは別のページの取得を行いました(Host:yyy.exmaple.com/other)。 私のつたない知識では、リダイレクトを行うのは、HTTPステータスコードが301~303などの場合だと思っていたのですが、 実際は上記のようにPOST後に200が返ってきたのに、別のURLへGETを投げていました。 (IE・Firefoxとも) POST後のHTTPヘッダを見たところ、ヘッダにはLocationはなく、「yyy.example.com/other」のURLの文字列も見当たりません。 ブラウザはどうやってPOST後のリダイレクトを検知し、さらに移動先のURLを知っているのでしょうか?

専門家に質問してみよう