You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
日本郵便「郵便番号・デジタルアドレス for Biz」API に対応し、住所自動補完を API 経由でも行えるようにする。ただし OSS 配布の性質上、本体に共通の認証キーを同梱することは規約違反(第8条(8)(9)、第5条4項)となるため、各店舗が管理画面から自店のクライアントID/シークレットを登録する方式とする。未登録の店舗は従来どおり mtb_zip(KEN_ALL.CSV 由来)での DB 検索にフォールバックし、既存挙動を完全に維持する。
規約上の前提・制約(設計の制約条件)
「郵便番号・デジタルアドレス API 個別利用規約」+「第三者提供のための特約」より、以下を設計不変条件とする:
flowchart TD
Browser["ブラウザ<br/>eccube.getAddress(JS/テンプレート変更なし)"]
Endpoint["html/input_zip.php<br/>→ LC_Page_InputZip::process()"]
Helper["SC_Helper_Zip(新規)<br/>分岐を一元化"]
ApiClient["日本郵便 API クライアント<br/>SC_Helper_JpAddressApi"]
Db["SC_Utils_Ex::sfGetAddress()<br/>mtb_zip DB 検索(従来)"]
Result["戻り値は従来と同一形式<br/>[['state'=>都道府県ID,'city'=>...,'town'=>...], ...]<br/>→ パイプ区切り応答も JSON API 応答も無改修で成立"]
Browser -->|"$.get input_zip.php?zip1=&zip2="| Endpoint
Endpoint -->|"SC_Helper_Zip_Ex::getAddress($zipcode)"| Helper
Helper -->|"認証情報あり"| ApiClient
Helper -->|"認証情報なし"| Db
ApiClient -.->|"失敗/タイムアウト時はフォールバック(ログ記録)"| Db
ApiClient --> Result
Db --> Result
背景・目的
日本郵便「郵便番号・デジタルアドレス for Biz」API に対応し、住所自動補完を API 経由でも行えるようにする。ただし OSS 配布の性質上、本体に共通の認証キーを同梱することは規約違反(第8条(8)(9)、第5条4項)となるため、各店舗が管理画面から自店のクライアントID/シークレットを登録する方式とする。未登録の店舗は従来どおり
mtb_zip(KEN_ALL.CSV 由来)での DB 検索にフォールバックし、既存挙動を完全に維持する。規約上の前提・制約(設計の制約条件)
「郵便番号・デジタルアドレス API 個別利用規約」+「第三者提供のための特約」より、以下を設計不変条件とする:
mtb_zipへキャッシュ保存しない。トークン等のキャッシュは可。現状の実装(調査済み)
html/input_zip.php→LC_Page_InputZip::process()(data/class/pages/LC_Page_InputZip.php:50)SC_Utils_Ex::sfGetAddress($zipcode)(data/class/util/SC_Utils.php:1616)→SELECT state,city,town FROM mtb_zip WHERE zipcode=?API_AddrFromZip::doAction()(data/class/api/operations/AddrFromZip.php:40)も同じsfGetAddressを使用input_zip.phpはstate|city|townのパイプ区切りテキスト(state はmtb_prefで都道府県ID化)eccube.getAddress()(data/eccube.js:111)が$.get→data.split("|")→eccube.putAddress()LC_Page_Admin_Basis_ZipInstall(mtb_zipへ登録)dtb_baseinfo(1行)+SC_Helper_DB::registerBasisData/getBasisDataFromDB(SHOPマスターLC_Page_Admin_Basisが代表例)設計方針
全体アーキテクチャ
flowchart TD Browser["ブラウザ<br/>eccube.getAddress(JS/テンプレート変更なし)"] Endpoint["html/input_zip.php<br/>→ LC_Page_InputZip::process()"] Helper["SC_Helper_Zip(新規)<br/>分岐を一元化"] ApiClient["日本郵便 API クライアント<br/>SC_Helper_JpAddressApi"] Db["SC_Utils_Ex::sfGetAddress()<br/>mtb_zip DB 検索(従来)"] Result["戻り値は従来と同一形式<br/>[['state'=>都道府県ID,'city'=>...,'town'=>...], ...]<br/>→ パイプ区切り応答も JSON API 応答も無改修で成立"] Browser -->|"$.get input_zip.php?zip1=&zip2="| Endpoint Endpoint -->|"SC_Helper_Zip_Ex::getAddress($zipcode)"| Helper Helper -->|"認証情報あり"| ApiClient Helper -->|"認証情報なし"| Db ApiClient -.->|"失敗/タイムアウト時はフォールバック(ログ記録)"| Db ApiClient --> Result Db --> Result分岐を新ヘルパー
SC_Helper_Zipに一元化し、LC_Page_InputZipとAPI_AddrFromZipの両呼び出し元をこのヘルパー経由に差し替える。API 応答の都道府県名はmtb_pref反転で ID 化し、既存の戻り値契約(都道府県ID)に正規化する。これにより下流(JS・テンプレート・JSON API)は無改修。設定保存
dtb_baseinfoに新カラム追加(既存慣例に準拠、extractOnlyColsOfで自動反映)。jp_addr_api_client_id TEXT,jp_addr_api_client_secret TEXT,jp_addr_api_enabled SMALLINT(同意フラグ兼用も可)data/class/pages/admin/basis/に 専用ページLC_Page_Admin_Basis_AddressApiを新設(SHOPマスターに混ぜず、規約リンク・同意チェック・接続テストを載せられるようにする)。SC_Helper_DB_Ex::registerBasisData()を再利用。SC_Helper_DB_Ex::sfGetBasisData()。●●●●+再入力方式、値未変更時は保持)。LC_Page_Admin::init()のdoValidTokenを継承(既存パターン)。API クライアント(新規
SC_Helper_JpAddressApi等)guzzlehttp/*が composer にあり)を優先。タイムアウト短め・リトライ最小。→ 要確認: 標準化する HTTP クライアント。デジタルアドレス対応(Phase 2)
デジタルアドレス(英数字コード)→ 復号住所は
mtb_zipに相当データが無くフォールバック不可、かつ住所詳細(番地・建物)まで返るため、state|city|townの3項目では表現できない。input_zip.php?mode=digitalか新input_digital_address.php)で JSON レスポンス(addr01/addr02/建物等を含む)を返す。変更・新規ファイル一覧(想定)
新規
data/class/helper/SC_Helper_Zip.php(+_Ex拡張スタブ)— 分岐の一元化data/class/helper/SC_Helper_JpAddressApi.php(+_Ex)— APIクライアントdata/class/pages/admin/basis/LC_Page_Admin_Basis_AddressApi.php(+_Ex)html/admin/basis/address_api.phpdata/Smarty/templates/admin/basis/address_api.tpldtb_baseinfoカラム追加、html/install/sql/および更新用スクリプト)変更
data/class/pages/LC_Page_InputZip.php—sfGetAddress→SC_Helper_Zip_Ex::getAddressdata/class/api/operations/AddrFromZip.php— 同上data/eccube.js等にデジタルアドレス用関数追加フォールバック/エラー時挙動
mtb_zipDB 検索(従来通り)mtb_zipDB 検索にフォールバック(ログ)段階実装
テスト計画
SC_Helper_Zip::getAddressの分岐(認証あり/なし/API失敗時フォールバック)を HTTP モックで検証。都道府県名→ID 正規化。registerBasisData経由)、シークレットのマスク保持。未確定・要確認事項
HTTP_Requestか)受け入れ条件