Salesforce B2B/D2C Commerce のチェックアウトインテグレーションを利用する

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回は B2B/D2C Commerce (LWR) でのチェックアウト内の処理の実装方法を紹介したいと思います。
B2B/D2C Commerce (LWR) ではチェックアウト時にストアフロントから REST API が呼ばれ、その際にサービスとして登録された Apex で書いた処理が行われます。アーキテクチャの詳細は[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.b2b_b2c_comm_dev.meta/b2b_b2c_comm_dev/b2c_comm_integration_arch.htm)をご覧ください。
サービスで処理される内容は下記の通りです。

* 在庫チェック
* 配送料計算
* 税金計算
* 価格チェック
* 決済

ここでは、どのようにサービスを作成するかのサンプルとどのように登録をするを紹介したいと思います。
決済以外のサービスと決済サービスでは方法が違うので分けて紹介したいと思います。設定方法は[ヘルプ](https://help.salesforce.com/s/articleView?id=sf.comm_checkout_container.htm&type=5)をご覧ください。


## 決済以外のサービス

#### 実装サンプル

在庫チェック、配送料計算、税金計算、価格チェックのサンプルは Github に公開されています。それぞれの処理が書かれた Apex は[これらのインターフェース](https://developer.salesforce.com/docs/atlas.en-us.b2b_b2c_comm_dev.meta/b2b_b2c_comm_dev/b2b_b2c_comm_integration_apex_apis.htm)を実装する必要があります。

* [B2B のサンプル](https://github.com/forcedotcom/commerce-on-lightning/tree/main/examples/b2b/checkout/integrations/classes)
* [D2C のサンプル](https://github.com/forcedotcom/commerce-on-lightning/tree/main/examples/b2c/checkout/integrations/classes)

#### サービス登録方法

サービスを登録するためには RegisteredExternalService オブジェクトのレコードを作成します。作成する際に必要となるフィールドは下記の通りです。

|ExternalServiceProviderId	|ExternalServiceProviderType	|DeveloperName	|
|---	|---	|---	|
| 在庫チェックのための処理が書かれた Apex の ID	|Inventory	|管理画面で表示される任意のAPI名（アンダースコアと英数字のみ）	|
| 配送料計算処理が書かれた Apex の ID	|Shipment	|同上|
| 税金計算処理が書かれた Apex の ID	|Tax	|同上|
| 価格チェック処理が書かれた Apex の ID	|Price	|同上|

レコードは [Workbench](https://workbench.developerforce.com/login.php) や開発者コンソールで作成してもいいですし、[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.b2b_b2c_comm_dev.meta/b2b_b2c_comm_dev/b2b_b2c_comm_integration_setup.htm)内の Apex のスクリプトを真似してもいいかと思います。もし `sfdx` と`jq` コマンドが入っていれば[こちらのシェル](https://gist.github.com/syunyama/887fe69004015fdd10ababfcfbdc5b48)を参照していただいても構いません。



## 決済サービス

決済サービスでは大きくわけて２つの実装方法があります。仮にここでは「サーバ型」「クライアント型」とさせてください

1. **カード情報を Salesforce のサーバーを介して決済会社へ渡す方法（サーバー型）**
    1. [このヘルプ](https://developer.salesforce.com/docs/atlas.en-us.246.0.apexcode.meta/apexcode/apex_commercepayments_sync_adapter_concept.htm)にあるように「commercepayments.PaymentGatewayAdapter」を Apex に実装している必要がある
2. **カード情報を Salesforce のサーバーを介さずに決済会社へ渡す方法（クライアント型）**
    1. [このヘルプ](https://developer.salesforce.com/docs/atlas.en-us.b2b_b2c_comm_dev.meta/b2b_b2c_comm_dev/b2b_b2c_comm_integrate_payment_lwc.htm)にあるように「commercepayments.PaymentGatewayAdapter」と「commerce.ClientSidePaymentAdapter」が Apex に実装されている必要があり、さらにクライアントに表示するための LWC を作成する必要がある 



#### 実装サンプル

Stripe の実装の２つの型のサンプルを紹介します。

* [サーバー型の Stripe のサンプル](https://github.com/forcedotcom/commerce-on-lightning/tree/main/examples/b2c/checkout/payment-gateway-integration/Stripe)
* [クライアント側の Stripe のサンプル](https://github.com/forcedotcom/commerce-on-lightning/tree/main/examples/b2c/checkout/payment-gateway-integration/StripeClientSide)



#### サービス登録方法

サービスを登録するためには、決済会社のAPI を呼ぶ際に利用する[指定ログイン情報](https://help.salesforce.com/s/articleView?id=sf.nc_create_edit_named_credential.htm&type=5)を作成した後、PaymentGatewayProvider と PaymentGateway オブジェクトのレコードを作成します。（[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.246.0.apexcode.meta/apexcode/apex_commercepayments_sync_adapter_setup.htm)）
作成する際に必要となるフィールドは下記の通りです。

**PaymentGatewayProvider**

|DeveloperName	|ApexAdapterId	|MasterLabel	|IdempotencySupported	|
|---	|---	|---	|---	|
|このレコードの名前	|支払い処理が書かれた Apex の ID	|管理画面に表示されるラベル名	|Yes or No	|

**PaymentGateway**

|MerchantCredentialId	|PaymentGatewayName	|paymentGatewayProviderId	|Status	|
|---	|---	|---	|---	|
|作成した指定ログイン情報（Named Credential レコード）のID	|このゲートウェイの名前	|作成した PaymentGatewayProvider レコードの ID	|Active	|

レコードは [Workbench](https://workbench.developerforce.com/login.php) や開発者コンソールで作成してもいいですし、もし `sfdx` と`jq` コマンドが入っていれば[こちらのシェル](https://gist.github.com/syunyama/89591590281bdc26f6d0493284d70bf0)を参照していただいても構いません。
PaymentGateway（支払いゲートウェイ）に関しては画面上からレコードを新規作成することもできます。



## サービスをストアに紐付ける

サービスを登録するためには StoreIntegratedService オブジェクトのレコードを作成します。

|Integration	|ServiceProviderType	|StoreId	|
|---	|---	|---	|
|Inventory__{在庫チェックのために作成した RegisteredExternalService の DeveloperName}	|Inventory	|紐付けたいストア(WebStore)レコードの ID	|
|Shipment__{配送料計算のために作成した RegisteredExternalService の DeveloperName}	|Shipment	|紐付けたいストア(WebStore)レコードの ID	|
|Tax__{税金計算のために作成した RegisteredExternalService の DeveloperName}	|Tax	|紐付けたいストア(WebStore)レコードの ID	|
|Price__{価格チェックのために作成した RegisteredExternalService の DeveloperName}	|Price	|紐付けたいストア(WebStore)レコードの ID	|
|作成した PaymentGateway レコードの ID	|Payment	|紐付けたいストア(WebStore)レコードの ID	|

レコードは [Workbench](https://workbench.developerforce.com/login.php) や開発者コンソールで作成してもいいですし、[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.b2b_b2c_comm_dev.meta/b2b_b2c_comm_dev/b2b_b2c_comm_integration_setup.htm)内の「Map to Your Store」内の Apex を真似てもいいかと思います。

#### 画面からの紐付け

画面からも可能ですので、下に方法を紹介します。

ストアの詳細画面から [管理]　タイルとクリックします。
![スクリーンショット 2023-10-18 13.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/f2723f27-450c-c27f-52b1-35260a282534.png)

管理画面で在庫チェック、配送料計算、税金計算、価格チェック、決済はそれぞれ「ストア在庫」「送料の計算」「税金の計算」「価格チェック」「支払」タブに対応しており、クリックすると紐づけるためのボタンが表示されています。
![スクリーンショット 2023-10-18 13.46.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/2c6ccd66-590b-b2f3-e4ef-9ebd84fcba7e.png)


ボタンを押すと作成したサービスを選択できるようになっています。
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/8619320f-31fa-ebb5-cfb6-28dcc705ba3a.png)