Paypalの決済URLの簡易発行をphpで作成したらぶち当たった&currenの文字化けの謎

クライアントさんから独自のPaypal決済フォームを作成して欲しいと言われることがあります。
そう言った時はクライアントさんの希望に合わせて作成するのですが・・・
独自の決済フォームとまでは言わなくても、すぐに決済URLが作りたいときがあります。

Paypalにログインして、ごちゃごちゃと作業するのも面倒だし、APIを使って処理するほどでもないと言う時に使えるのではと思い、決済URLを簡易発行するphpのスクリプトを作成しました。

とりあえず、かなり適当に作ってみたので、情報入力フォームはこんな感じです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>paypal支払URL発行</title>
</head>
<body>
<form action="url.php" method=post>
 <input type="hidden" name="currency_code" value="JPY">
 <input type="hidden" name="cmd" value="_cart">
 <input type="hidden" name="upload" value="1">
 PayPal登録アドレス:<input type="text" name="business" value="" size="40"><br />
 商品名:<input type="text" name="item_name_1" value="" size="20"><br />
 料金(半角英数):<input type="text" name="amount_1" value="" size="10">円<br />
 <input type="hidden" name="invoice" value="20140712031635">
 <input type="submit" value="URL発行">
</form>
</body>
</html>

フォームからpostを受けて決済ULRを発行するphpはこんな感じです。
言うまでもありませんが、本当に手抜きです。

<?php
$loop = 0;
foreach($_REQUEST as $field_name => $field_value){
	if($loop == 0){
		$and = "";
	}else{
		$and = "&";
	}
	$query .= $and.$field_name."=".urlencode($field_value);
	$loop ++;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>URL発行</title>
</head>
<body>
<textarea rows="5" cols="60">
<?php
echo "https://www.paypal.com/cgi-bin/webscr?".$query;
?>
</textarea>
</body>
</html>

とりあえずの完成品がこれです。
手抜きですがちゃんと動作します。
はき出されたURLをメールなどで送って、カード支払の請求が出来ます。
ご利用はご自由にどうぞ。

phpの中身はとても簡単で、htmlのフォームからpostされた情報を決済URLのクエリとして繋げているだけです。

フォームの非表示のデータの中に「currency_code」と言うのがあります。
これは決済時の通貨を設定しているのですが、クエリとしてURLに繋げるときは「&currency_code=JPY」とする訳なのですが・・・。
作成された決済URLを何度試しても決済通貨がUSDになってしまうのです。

よくよくクエリの部分を見てみると「¤cy_code=JPY」となっているではないですか!

「¤」なんて特殊文字は見たことないと思いましたが「&curren」の部分が「¤」に化けているのは分かったので「&curren」について色々と検索してみました。
すると「&curren」ではなく「&curren;」のように最後にセミコロンが付くと、一般通貨記号と言う特殊文字として扱われる事が分かりました。

基本的な「&lt;」や「&gt;」なんて言うのは覚えていますが、さすがに「&curren;」は知りませんでした。
さらに意味が判らないのは「&curren」のようにセミコロンが無い状態で特殊文字に変換されていたことです。
これに関しても色々と調べてみましたが、現在のところ原因不明です。

最終的に、現在のように全ての要素の中で一番最初に持ってきて解決しました。
解決と言うより、問題をすり替えたのですが・・・
先頭に来ることで「&currency=JPY」から「?currency=JPY」に変わったわけです。

とりあえずは簡易的に決済URLを発行する目的は達成されました。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です