PHP で文字コードが異なるサイトへ POST 送信する方法


[初回公開] 2011年10月21日

EC サイトのオープンソース「EC-CUBE」で可能なさまざまなカスタマイズの中には外部のサービス(API)とデータ連携することで利用者と運用者に向けてさらに利便性を上げることができるが、仕様が異なる外部サービスと連携すると文字化けが発生する事象もあるため原因と対応方法について紹介する。

PHP で Namespace declaration statement 関連のエラーが出た場合の対応方法

1.EC-CUBE とは

EC-CUBE とは、株式会社イーシーキューブが開発しているプログラム言語「PHP」で動作する EC サイトのプログラムである。
配送業者と支払い先の登録など店舗運営する上で必要な機能が一通り揃っているため、プログラムができない担当者でも EC サイトを簡単に開設することが特徴で、自身でカスタマイズしたり、有料のオプションを購入することでクレジット決済への対応や、納品書も EC-CUBE 上から直接印刷させるなど業務効率化にも利用できるツールである。



EC-CUBE はオープンソースで提供されているため、利用規約に沿えば無償で利用することができる。
また、サーバにインストールすることでパソコンやスマートフォンのブラウザから利用者は商品を購入し、EC サイトの運営者は商品を登録したり、発送待ちや過去の受注内容の管理を行うことが可能なため、小規模店舗でもホスティングを利用することで低コストで導入することができる。

2.EC-CUBE から外部サービス(API)で文字化けが発生する様子

EC-CUBE から外部サービス(API)で文字化けが発生する様子としては、自身が運営する EC サイトから外部サービスにデータを送信した後、相手側で受け取った情報を見ると文字化けして表示される。

例えば EC-CUBE でクレジットカード決済を外部のサービスを利用している場合は、購入者情報やクレジットカード番号、購入額を決済業者にデータ送信しなければならない。
その時、データの通信は成功していても、実際に渡した情報が文字化けして決済が完了しない事象が発生する。

3.EC-CUBE から外部サービス(API)で文字化けが発生する原因

EC-CUBE から外部サービス(API)で文字化けが発生する原因としては、自身の EC サイトから送信したデータとデータを受け取る相手先の API の文字コードの仕様が異なる点が挙げられる。

EC-CUBE の文字コードは UTF-8 となっているため送信時は UTF-8 で送り出されるが、外部サービスによってはデータの受け取り時は Shift-JIS (SJIS)となっていることがあり、この文字コードの違いにより文字化けが発生する。



文字化けは日常的によく発生し、システムから出力した CSV を Excel で開くと文字化けすることがある。
この事象も、同様で Excel は Shift-JIS で開くのが一般的なため、元のファイルが Shift-JIS 以外の文字コードの場合は文字化けする。

4.PHP で文字コードが異なるサイトへ POST 送信する方法

PHP で文字コードが異なるサイトへ POST 送信する方法としては、PHP でコーディングされたプログラムであれば文字コード変換の関数を利用して送信する手段と、データ送信のところだけ JavaScript を利用する手段の 2 通りがある。

特に EC-CUBE のようにブラウザで動作するウェブアプリケーションの場合は利用者が操作した情報を一度サーバに受けて文字コードを変換して外部サービスに渡さずに、JavaScript でブラウザから直接送信させることで処理を簡略化することができる。

4-1.JavaScript で送信する場合

文字コードが異なる外部サービスに POST 送信する場合に JavaScript を用いるサンプルが次のコードなる。
外部サービスへのデータ送信は Form タグを利用しており、document.charset で Shift-JIS を指定している。

<form action="外部サービスの送信先" method="post" target="_blank" accept-charset="Shift_JIS">
<input type="button" value="支払い手続きへ" onClick="org=document.charset; document.charset='Shift-JIS'; document.UserForm.submit(); document.charset=org;">
</form>


4-2.PHP コード内で送信する場合

文字コードが異なる外部サービスに POST 送信する場合に PHP のコードを用いるサンプルが次のコードなる。
下記は文字コード UTF-8 から Shift-JIS に変換して POST 送信する例である。

<php
// POSTデータを定義
$postData = array(
    'key1' => 'value1',
    'key2' => 'value2'
);

// 文字コードを変換
foreach ( $postData as $key => $value ) {
    $postData[$key] = mb_convert_encoding( $value, 'Shift-JIS', 'UTF-8' );
}

// POST リクエストを送信する URL を指定
$url = '{外部サービスの URL}';

// HTTP コンテキストを作成
$contextOptions = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded',
        'content' => http_build_query( $postData )
    )
);

$context = stream_context_create( $contextOptions );

// file_get_contentsを使用してPOSTリクエストを送信
$res = file_get_contents( $url, false, $context );

if ($res === false) {
    // エラーハンドリング
    die(' POST 送信に失敗しました' );
}

// レスポンスを表示
echo $res;
?>


文字コードの変換は関数「mb_convert_encoding」を利用し、変換後のデータを関数「file_get_contents」で送信している。
関数「stream_context_create」はストリームコンテキスト(実際にファイルやネット通信で、どのように扱うのかを指定する)を指定するもので、POST ではなく GET で送りたい場合など使い分けが可能になる。

関連記事

コメントを残す