
正直に書きます。EC-CUBE版のJPYC決済を「本番ドメインで動かす」だけのはずが、まる一日かかりました。しかも最後のオチは、自分の完全なドジでした。同じところでハマる人が減るように、格好つけずに記録しておきます。
そもそも「ECCUBE JPYC決済」なのに何を作っているか
私たちが作っているのは、ネットショップに「JPYC(Polygon)で支払う」ボタンを足すための、サーバー設置型の決済プログラムです。JPYCはガス代(送金手数料)がかからないので、お客様はウォレットから“1円ぶん”を送るだけ。今回はその4カート目、EC-CUBE 4.2版を本番の独自ドメインで動かすところが舞台です。
つまずき①:サイトが開かない「Untrusted Host」
独自ドメインでトップページを開くと、いきなり Untrusted Host。DNSもSSLも問題ないのに、です。原因はEC-CUBEの許可ホスト設定(.env の TRUSTED_HOSTS)に、昔使っていた別ドメインだけが残っていたこと。今のドメインが入っていないので弾かれていました。ここは正しいドメインに直して解決。
…ちなみにこの時、値を "..." でクォート囲みしたら、今度はサイト全体が落ちました。EC-CUBEの.envは正規表現の $ の都合で「クォートで囲むと壊れる」んですね。囲まない書式に戻して復旧。地味に30分溶けました。
つまずき②:カートに入らない
表示は直った。でも「カートに入れる」で失敗。GETは全部200なのに、フォーム送信(POST)だけEC-CUBEが404を返す…という気味の悪い症状でした。切り分けていくと、セッションのCookieがページ間で保持できていない。犯人は .env の ECCUBE_COOKIE_PATH=/eccube。サブフォルダで動かしていた頃の名残で、ルートで動く本番ドメインだとCookieが送られず、毎回セッションが切れてCSRFに失敗していました。/ に直して解決。
ここ、実は一度直したつもりで「保存できていなかった」オチもありました。保存後に必ず読み直して確認、大事。
つまずき③:メールが1通も届かない
会員登録しても確認メールが来ない。管理画面からの送信もダメ。原因は MAILER_DSN=smtp://localhost:25。さくらのサーバーにはそんなSMTPは無いので、全メールが送信できていませんでした。さくら標準の sendmail://default に変更。送信元も、Gmail差出人はなりすまし判定で弾かれやすいので、独自ドメインのアドレスに変更しました(SPFはさくら側で設定済みでした)。
そして本題のドジ:E102
いよいよ決済。ログインして、カートに入れて、注文する。CIHPAY(ゲートウェイ)に飛ぶ。…E102。ここで小一時間、ゲートウェイのコードまで読み込んで「HMACか?パラメータか?WAFか?」と大真面目に犯人探しをしていました。結論を言うと、E102は「その店舗、まだ登録されてないよ」というエラーでした。そう、EC-CUBE用のショップ情報(shops.json)をゲートウェイに登録するのを、まるっと忘れていたんです。プラグインは完璧に正しいリクエストを送っていて、受け取る側の名簿に名前が載っていないだけ。人間で言えば「予約した気になってお店に行って、予約入ってませんと言われる」やつです。登録という“最後の一歩”を飛ばして、半日ぶんの体力で原因を探していたわけで…われながら見事なドジでした。ちなみにこの登録、決済の最重要ファイル(全店舗の秘密鍵が入る)に書き込む作業なので、安全設計としてAIには直接いじらせないようになっています。ここは人間が正式な登録フローで実行する。これはこれで、正しい設計だと再確認しました。
そして…成功
ショップを登録し、鍵を同期して、もう一度。CIHPAYの金額画面 → SafePalウォレットを接続 → 1 JPYC を送金 → 完了。オンチェーンにちゃんと記録が残りました。長い一日の、気持ちのいい瞬間でした。
今日の教訓
- 設定ファイルは「囲む・囲まない」で挙動が変わる。保存後は必ず読み直す。
- 「動くURL」と「動かないURL」を並べて比べると、原因が一気に絞れる。
- そして——登録は、忘れる。 派手なエラーほど、地味な“やり忘れ”が原因だったりします。
次は、決済完了を受注に自動反映するWebhookの仕上げ。また泥臭くやります。読んでいただきありがとうございました。
次回の開発は。パソコンでHashPort Wallet(ハシュポートウォレット)のQRコードが開いてスムーズに決済できるよう研究します。WalletConnectで呼び出されるQRコードはメタマスクなんですが、これをHashPort Walletへ変えることが出来るかやりたいです。または「HashPort Walletで支払う」専用ボタンを作ることによって実現するのか?また実験と研究します。