Upgrade to Pro — share decks privately, control downloads, hide ads and more …

cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話

phigasui
October 25, 2024

cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話

Kaigi on Rails 2024 での発表資料です

https://kaigionrails.org/2024/talks/phigasui/

phigasui

October 25, 2024
Tweet

Other Decks in Programming

Transcript

  1. 3 cXML とは cXML とは • 電子商取引(EC)に関するシステム間で 一貫したドキュメントでの通信を目的としたプロトコル ◦ 例「注文ではこのフォーマットでリクエストしてください」

    というのが定義されている ここで知っておいてほしいこと • システム間連携開発をやるよ • 共通化されたプロトコルがあるよ
  2. 7 なぜ cXML と向きあっているのか A社 EC B社 EC C社 EC

    A社 EC B社 EC C社 EC 購買システム: 多様な取引先からの購買業務を一元管理 それぞれの EC サイトで 登録・ログインが必要 購買システムにだけ 登録・ログイン
  3. 8 なぜ cXML と向きあっているのか • 複数の EC サイトと連携する必要がある • 各接続先の

    API で連携しシステムを構築 ↓ 電子商取引(EC)では cXML という プロトコルが使われている A社 EC B社 EC C社 EC
  4. 10 cXML とパンチアウト連携 cXML とは commerce eXtensible Markup Language の略

    通信のモデルとデータ構造を定義している 連携を楽にするため、パンチアウト連携という 仕組みが用意されている
  5. 11 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 ECサイト ③商品をカートに追加 購買システム

    ⑤購買の次ステップ (購買承認依頼など) リーニャー商品ページ チェックアウト 購買申請する ①アクセス ②チェックイン (ECサイトに自動ログイン) ④チェックアウト (カート情報を購買システムへ持ち帰る) 購買システム リーナーECで商品を探す
  6. 12 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 ECサイト ③商品をカートに追加 購買システム

    ⑤購買の次ステップ (購買承認依頼など) リーニャー商品ページ チェックアウト 購買申請する ①アクセス ②チェックイン (購買システムに自動ログイン) ④チェックアウト (カート情報を購買システムへ持ち帰る) 購買システム リーナーECで商品を探す
  7. 13 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 購買システム ⑤購買の次ステップ (購買承認依頼など)

    購買申請する ①アクセス ④チェックアウト (カート情報を購買システムへ持ち帰る) 購買システム リーナーECで商品を探す ECサイト ③商品をカートに追加 リーニャー商品ページ チェックアウト ②チェックイン (ECサイトに自動ログイン)
  8. 14 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 購買システム ⑤購買の次ステップ (購買承認依頼など)

    購買申請する ①アクセス 購買システム リーナーECで商品を探す ECサイト ③商品をカートに追加 リーニャー商品ページ チェックアウト ②チェックイン (ECサイトに自動ログイン) ④チェックアウト (カート情報を購買システムへ持ち帰る)
  9. 15 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 ECサイト ③商品をカートに追加 購買システム

    ⑤購買の次ステップ (購買承認依頼など) リーニャー商品ページ チェックアウト 購買申請する ①アクセス ②チェックイン (ECサイトに自動ログイン) ④チェックアウト (カート情報を購買システムへ持ち帰る) 購買システム リーナーECで商品を探す ? ?
  10. 16 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 購買システム ⑤購買の次ステップ (購買承認依頼など)

    購買申請する ①アクセス ④チェックアウト (カート情報を購買システムへ持ち帰る) 購買システム リーナーECで商品を探す ECサイト ③商品をカートに追加 リーニャー商品ページ チェックアウト ②チェックイン (ECサイトに自動ログイン)
  11. 18 cXML とパンチアウト連携 パンチアウト連携 • EC の機能を使いながら購買の情報を連携 購買システム ⑤購買の次ステップ (購買承認依頼など)

    購買申請する ①アクセス 購買システム リーナーECで商品を探す ECサイト ③商品をカートに追加 リーニャー商品ページ チェックアウト ②チェックイン (ECサイトに自動ログイン) ④チェックアウト (カート情報を購買システムへ持ち帰る)
  12. 25 実際に発生した問題 • 各接続先で異なる cXML の仕様がある • いろいろな制約がある ◦ 物理的な制限や各

    EC での特殊な仕様 • そもそも、cXML の仕様すべて対応できているわけではない ◦ 我々のプロダクトも、連携先も...
  13. 26 実際に発生した問題 • 各接続先で異なる cXML の仕様がある • いろいろな制約がある ◦ 物理的な制限や各

    EC での特殊な仕様 • そもそも、cXML の仕様すべて対応できているわけではない ◦ 我々のプロダクトも、連携先も...
  14. 27 実際に発生した問題 - cXML の仕様のちがいの例 cXML では Extrinsic という要素が定義されている 引用:「cXML

    Reference Guide」 https://xml.cxml.org/current/cXMLReferenceGuide_ja.pdf 日本語訳: 「非本質的な、付帯的な」
  15. 30 実際に発生した問題 • 各接続先で異なる cXML の仕様がある • いろいろな制約がある ◦ 物理的な制限や各

    EC での特殊な仕様 • そもそも、cXML の仕様すべて対応できているわけではない ◦ 我々のプロダクトも、連携先も...
  16. 31 実際に発生した問題 - 物理的な制約の例 • cXML 各要素、属性の文字数までは決められない ◦ 各 EC

    サイトで文字数の上限が異なるため注意が必要 • とくに厄介なのが配送先の文字数 ◦ 最終的には伝票に印字されるため物理的な限界がある
  17. 33 実際に発生した問題 - 物理的な制約の例 仕様外の制約をのりこえていくために • 連携のシナリオテスト ◦ 連携先とそれぞれ確認が必要なケースを洗い出す ▪

    例) 各税率の商品、情報が連携されるタイミング 動的情報の最大文字数パターン、などなど ◦ これで事前に文字数制限をキャッチできたこともあった テストケースのドキュメント
  18. 34 実際に発生した問題 • 各接続先で異なる cXML の仕様がある • いろいろな制約がある ◦ 物理的な制限や各

    EC での特殊な仕様 • そもそも、cXML の仕様すべて対応できているわけではない ◦ 我々のプロダクトも、連携先も...
  19. 36 実際に発生した問題 - 対応できていなかった cXML 仕様の例 • EC サイトから購買システムへ送信される注文の結果 例.

    キャンセルされた時の cXML 意図しない type の場合 処理方法が不明なため Error を 通知
  20. 37 実際に発生した問題 - 対応できていなかった cXML 仕様の例 • 通知されたエラーでは type が

    nil になっていた ◦ 幸いイベントログを取得している 😌 ◦ cXML のログを見てみると... ConfirmationStatus はいつも 1つ ConfirmationStatus が 2つ?
  21. 38 実際に発生した問題 - 対応できていなかった cXML 仕様の例 • ConfirmationStatus が2つある時の cxml-ruby

    (gem) のパース結果 ◦ たしかに type が nil ◦ そもそも confirmation_status 複数のため Array になりそうだが?
  22. 39 実際に発生した問題 - 対応できていなかった cXML 仕様の例 • cxml-ruby の ConfirmationStatus

    の親要素の定義を確認 ◦ 複数受け取られる定義ではない 🙂 複数要素OKな時は別の定義の 仕方が必要
  23. 40 実際に発生した問題 - 対応できていなかった cXML 仕様の例 • cXML のリファレンスを見ると 購買システム側でも想定して実装してなかったが

    そもそも cxml-ruby の gem でも想定されていなかった 😂 引用:「cXML Reference Guide」 https://xml.cxml.org/current/cXMLReferenceGuide_ja.pdf
  24. 41 実際に発生した問題 - 対応できていなかった cXML 仕様の例 これらのことからの学び • 外部イベントのロギングにより再現と原因の究明ができた ◦

    連携先からなにが送られてきたか分からなくなってしまうためイベントログ大事 • 連携先との仕様調整でイレギュラーケースをいかに把握するか ◦ 今やっていること ▪ 定期的な同期コミュニケーションをとる ▪ これまでに発見したイレギュラーケースを仕様にまとめる
  25. 44 まとめ • cXML はおもしろい ◦ イレギュラーケースにどう向きあうかは腕の見せどころ • システム間連携ではエラーの再現ができるようにする ◦

    外部の情報はログがないと再現や復旧が難しい • 連携先との密なコミュニケーションが大事 ◦ 全てを仕様書に表わすことは難しい ◦ 細かい仕様のキャッチアップができる状態をつくる必要がある
  26. 46 自己紹介 • がーしー / @phigasui ◦ Kaigi on Rails

    2024 中は「がーしーえっくすえむえる」 • 株式会社Leaner Technologies • プロダクトエンジニア
  27. 49 cXML とパンチアウト連携 パンチアウトトランザクションの流れ パンチアウト開始 リクエスト パンチアウト開始 リクエスト パンチアウト 開始URL

    パンチアウト 開始URL パンチアウト開始URL へアクセス 商品 カート 追加 チェック アウト 注文 情報 注文 情報 購買 システム EC サイト
  28. 50 cXML とパンチアウト連携 パンチアウトトランザクションの流れ パンチアウト開始 リクエスト パンチアウト開始 リクエスト パンチアウト 開始URL

    パンチアウト 開始URL パンチアウト開始URL へアクセス 商品 カート 追加 チェック アウト 注文 情報 注文 情報 購買 システム EC サイト
  29. 51 cXML とパンチアウト連携 パンチアウトトランザクションの流れ パンチアウト開始 リクエスト パンチアウト開始 リクエスト パンチアウト 開始URL

    パンチアウト 開始URL パンチアウト開始URL へアクセス 商品 カート 追加 チェック アウト 注文 情報 注文 情報 購買 システム EC サイト
  30. 57 Rails アプリケーションでの実装 Controller ServiceClass ParserClass GatewayClass Rails は API

    モード • Gateway で EC サイトへのリクエスト ◦ 各 EC 向けのサブクラスで仕様の差分を実装 • Parser で必要な情報にアクセスしやすく • cxml-ruby という Gem で cXML の 操作やバリデーション cxml-ruby
  31. 58 Rails アプリケーションでの実装 cxml-ruby • cXML のバリデーション • cXML のパース

    • Hash から cXML への変換 各要素のクラスがあり 存在する属性と子要素が定義されている