ECサイトの価格関連を一ヶ所の変更で完結させる
私が運用保守しているECサイトで、商品の販売価格が変更されるたびに、以下の箇所を変更する作業が発生していた。
決済代行会社に送信される値(決済金額とハッシュ関数に使用される)
ページ内の金額表示(二ヶ所)
購入後に自動送信されるメール本文内の金額
index.phpやプラグインの設定の中で、該当箇所を探し出して手で数字を書き換えていたのだ。
変更の誤りや漏れが無いよう毎回気合を入れて確認していたのだが、この精神的負担のせいで作業が億劫になっていた。そこで、精神的負担とミスのリスクを軽減するために、なんとか一ヶ所の変更で済むように出来ないか考えてみた。
理想は、サーバ上に金額が記述されたファイルがあって、そこを書き換えれば全てがそれに従う。という運用になる事だ。となると、サーバに金額を記述するテキストファイルを置いて、金額関連の全てがそこを参照しに行く。という仕組みが良さそうだ。
実際、決済代行会社に飛ぶページでは、PHPで定義した変数をechoでhtmlに組み込んでいるので、「PHPでサーバ上のファイルに記述された値を読みに行く」という事さえクリアすれば実現出来そうだ。
chatgptに聞いてみた。
<?php
// 'price.txt'から価格を読み込む
$price = file_get_contents('path/to/your/directory/price.txt');
?>
<p>価格: <?php echo $price; ?>円</p>
price.txt というテキストファイルに半角数字で金額を記述する。
PHPでそのファイルのパスを指定する。
予想通りシンプルだった。
chatgptの提案通り記述した所、問題なくテキストファイルの中身の値を読み取れた。
決済代行会社に送信する金額の値は、従来このように記述していた。
$id = "10000";
// 金額はフェイク
今回以下の様に変更した事で、手書きの運用を脱する事が出来た。
$id = $price;
次に、ページ内の金額表記だが、全角でこのように表示されている。
「10,000円」
price.txt には半角で「10000」としか記述されていないので、そのままでは転用する事が出来ない。何とかならないものかと、これもchatgptに聞いてみた。
<?php
// 'price.txt'から価格を読み込む
$price = trim(file_get_contents('path/to/your/directory/price.txt'));
// 数字にカンマを挿入
$price_formatted = number_format((int)$price);
// 半角数字とカンマを全角に変換
$price_fullwidth = mb_convert_kana($price_formatted, 'N');
?>
<p>価格: <?php echo $price_fullwidth; ?>円</p>
問題なく「10,000円」と表示された。
chatgpt凄い。
最後に、自動送信メールの本文内に記載される金額だ。
ECサイト→決済代行会社→リダイレクトで戻る→フォームに購入者情報を入力する→メールが自動送信される
という流れだ。
リダイレクトによってECサイトドメインのContact Form 7に戻ってくるのだが、Contact Form 7の中でPHPを使う事は出来ない。出来るのかもしれないが、難易度の高そうなややこしい内容が書かれた記事を何度か見た程度で、あまり手を出さない方が良さそうだったので私の中では「出来ない」に分類している。
そこで、リダイレクトのURLにパラメータを仕込んで、Contact Form 7でそれを読み込む事にした。
決済代行会社に飛ぶバナーにリダイレクト先のURLを記述するのだが、末尾にパラメータとして変数を追記した。
<input type="hidden" name="return_url" value="https://example/index.php?id=<?php echo $id; ?>" />
リダイレクトで戻ってきた際に、Contact Form 7でパラメータを読み込めるよう、[フォーム]タブで次のような記述を追加した。
[hidden id default:get readonly]
さらに、読み込んだパラメータの値を返信文の本文に表示するよう、[メール]タブで設定した。
お支払金額:[id]円
一連の動作を検証した結果、問題なく動作する事が確認できた。
PHPで一度定義した変数をechoで何度も使いまわせる事や、htmlのインクルード等、そういう技術が存在している事は知っていたのになぜ今まで実装しなかったのか不思議でならない。
多分、ただ単にひらめかなかったのだ。
エンジニアリングにとって、ひらめきがかくも重要である事を思い知らされた。
長時間ぶっ通しの作業であまりにも腹が減ったため、家系ラーメンとライスを食べに行く事とする。
2023/9/19追記
最終のContact Form 7で自動送信されるメールで少々問題が発生した。
その問題も解消したので、追記しておく。
path/to/your/directory/price.txt に「10000」とだけ書いた状態で、その値をあれこれと使いまわすのだが、Contact Form 7の[メール]タブにはこのように記述している
お支払金額:[id]円
すると送信されるメール本文はこのようになる。
お支払金額:10000円
カンマが付かない金額表示になってしまうのだ。問題というと大げさだが不格好だ。
そこで方法を考えてみた。
新たに車輪を再発明してしまわないためにも、既存の何かを活用する事は出来ないか?と考えた。ページ内での表示用にphpで作成した$price_fullwidthを使うのはどうだろうか?
<?php
// 'price.txt'から価格を読み込む
$price = trim(file_get_contents('path/to/your/directory/price.txt'));
// 数字にカンマを挿入
$price_formatted = number_format((int)$price);
// 半角数字とカンマを全角に変換
$price_fullwidth = mb_convert_kana($price_formatted, 'N');
?>
<p>価格: <?php echo $price_fullwidth; ?>円</p>
これであれば既に「10,000」という文字列が出来上がっているので、これをパラメータで受け渡す事で解決しそうだ。しかし、逆にカンマが気になる。「-(ハイフン)」や「_(アンダースコア)」ならともかく、カンマはURLのパラメータとして使えるのだろうか?注意深く観察した事はないが見た事ない気がする。
ネットで調べた所、非推奨という記事がチラっと見えた。やめておこう。何より全角の値をパラメータとしてやり取りする事も気になる。
通信の過程でカンマが使えないとなると、分割して送った上で、最終的に合体させるのはどうだろう?
つまりこういう事だ。
■path/to/your/directory/price.txt
テキストファイルに「10000」とだけ入力
↓
■index.php
<?php
// 'price.txt'から価格を読み込む
$price = file_get_contents('path/to/your/directory/price.txt');
$id = $price;
// ペイジェントにはidとして「10000」という値が送られる
?>
↓
<?php
// 「10000」という数字を前2桁と後ろ3桁に分ける
$id2 = substr($price, 0, 2);
$id3 = substr($price, -3);
// 結果、id2 = 10、id3 = 000となる
?>
↓
<html>
<!– リダイレクトURLの指定にid2・id3を分けて仕込む –>
<input type="hidden" name="return_url" value="https://example/index.php?id2=<?php echo $id2; ?>&id3=<?php echo $id3; ?>" />
</html>
↓
■Contact Form 7>[メール]タブ
お支払金額:[id2],[id3]円
↓
■メール本文
お支払金額:10,000円
price.txtの部分は、実際には(商品名).txtという形式になっていて、index.phpもそれに応じて読み込むファイルを指定している。しかし、読み込んだ後は$priceや$idといった変数に置き換えているので、それ以降の細工の部分は全商品共通の処理を行う事が出来る。今後商品が増えた際もindex.phpを複製すれば少ない負荷でページを複製する事が出来るという訳だ。
随分回りくどい処理を書いてしまったような気がするが、結果としてやりたい事が実現出来ているのでこれで良しとしよう。