Salesforce B2C Commerce API の Context API について

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

今回はB2C Commerce API の機能の一部である [Context API](https://developer.salesforce.com/docs/commerce/commerce-api/guide/shopper-context-api.html) を利用してみたいと思います。エンドポイントなどの仕様は[こちら](https://developer.salesforce.com/docs/commerce/commerce-api/references/shopper-context?meta=Summary)を確認してください。



## Context API とは

顧客のコンテキストを変更することができる API でコンテキストに合わせた様々な体験を提供することができます。
現状、下記のようなコンテキストが利用できます。
#### ・ 時間

時間のコンテキストを変更することで、将来に適用されるであろうプロモーションを現在時間でも利用することができます。開発時にプレビューしたい時などに使えます。（[ヘルプ](https://developer.salesforce.com/docs/commerce/commerce-api/guide/shopper-context-api-future.html)）


#### ・ ソースコード

ソースコード（大抵URLのパラメータとして与えられる）のコンテキストを追加/変更することで、プロモーションや価格表の適用を行います。（[ヘルプ](https://developer.salesforce.com/docs/commerce/commerce-api/guide/shopper-context-api-source-code.html)）ソースコードに関して知りたい場合は[サクセスナビ](https://salesforce.vidyard.com/watch/JJ2JfUHrB4otM9HLAsujqj?_ga=2.139925491.1172786287.1618150269-1121256232.1607939127)や [Info Center](https://documentation.b2c.commercecloud.salesforce.com/DOC1/index.jsp?topic=%2Fcom.demandware.dochelp%2Fcontent%2Fb2c_commerce%2Ftopics%2Fsource_codes%2Fb2c_defining_source_code_groups.html) をご覧ください。


#### ・ 店舗

顧客の利用する店舗のコンテキストを追加/変更することで、プロモーションや価格表の適用を行います。（[ヘルプ](https://developer.salesforce.com/docs/commerce/commerce-api/guide/shopper-context-api-store-specific.html)）


#### ・ セッションカスタム属性

セッション内で取得できるような情報をコンテキストとして利用して顧客グループを作成することができます。その顧客グループを利用してプロモーション・配送方法・支払方法の適用が可能になります。（[ヘルプ](https://developer.salesforce.com/docs/commerce/commerce-api/guide/shopper-context-api-personalized.html)）




## 実際に使ってみる

今回はセッションカスタム属性を利用したユースケースを行なってみたいと思います。

#### 試してみるユースケース

ユーザが利用している OS が Andoroid だったら 「contextapitestpromo」 という ID を持つプロモーションを商品に適用させます。

:::note warn
使用時の注意点：
この API を利用してアプリケーションを作成する場合はブラウザなどのデバイスから直接叩かれないようにすることが推奨されています。そのため、このAPIをコールする API クライアントはデバイスから呼ぶクライアントと分けてパーミッションを別に分けて作成する方がいいかと思います。例えば、デバイスから叩けれるような API はパブリッククライアントで、デバイスから叩かれないような API をプライベートクライアントを利用するといった具合です。 また、その際はトークンをデバイスやブラウザに保存しないようにしましょう。
API のクライアントの違いについては過去に紹介した Qiita 記事の「[クライアントタイプ](https://qiita.com/syunyama/items/34bd2a11dabb93bb1dc1#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97)」をご参照ください。
:::

### 手順

#### 1. 顧客グループの作成

**マーチャントツール > 顧客 > 顧客グループ** に遷移して「ContextAPITest」という動的顧客グループを作成します。

条件の属性として「セッションカスタム属性」を選択します。

![スクリーンショット 2022-12-29 15.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/a842cf37-34f3-069b-2f2d-adfff6e25404.png)




さらに、属性として「sampleOS」と入力します。

![スクリーンショット 2022-12-29 15.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/582709c0-77af-8065-bf3a-419b53ab3f30.png)




そして、その属性の値が「Android」と一致した顧客のグループを作成します。

![スクリーンショット 2022-12-29 15.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/cb932973-d760-aef5-c59c-f4654f6cbcd0.png)





#### 2. プロモーションの作成

プロモーション・キャンペーンを作成します。詳しい作成方法は割愛します。詳しく知りたい場合は、 Trailhead の「[ B2C Commerce のキャンペーンとプロモーションの概要](https://trailhead.salesforce.com/ja/content/learn/modules/cc-digital-merchandising/digital-campaigns-and-promotions)」やサクセスナビの「[B2C Commerce Cloud Adoption Webinar〜プロモーション](https://salesforce.vidyard.com/watch/u3oE3YwHeK5tw9DT9kQkg5?_ga=2.77406037.1172786287.1618150269-1121256232.1607939127)」や「[B2C Commerce Cloud Adoption Webinar〜キャンペーンと限定子](https://salesforce.vidyard.com/watch/JJ2JfUHrB4otM9HLAsujqj?_ga=2.139925491.1172786287.1618150269-1121256232.1607939127)」、Info Centerの「[Campaigns and Promotions](https://documentation.b2c.commercecloud.salesforce.com/DOC1/topic/com.demandware.dochelp/content/b2c_commerce/topics/promotions/b2c_campaigns_and_promotions.html?resultof=%22%43%61%6d%70%61%69%67%6e%22%20%22%63%61%6d%70%61%69%67%6e%22%20)」をご覧ください。

今回は「ContextAPITest」顧客グループにという商品に対して適用されるプロモーション（contextapitestpromo）をキャンペーンに設定しました。

![スクリーンショット 2022-12-29 15.37.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/73769205-cb69-20f6-52da-8b48d63649e9.png)




#### 3. アクセストークンの取得

顧客のアクセストークンの取得方法については以前書いた Qiita 記事の「[登録済みユーザ（B2C Login）](https://qiita.com/syunyama/items/34bd2a11dabb93bb1dc1#%E7%99%BB%E9%8C%B2%E6%B8%88%E3%81%BF%E3%83%A6%E3%83%BC%E3%82%B6b2c-login)」をご覧ください。
このアクセストークン取得時にレスポンスとして返される `usid` も後ほど使います。
![スクリーンショット 2022-12-29 15.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/50e5a39a-525d-27ea-8f34-b31f23e07f06.png)




#### 4. コンテキストの作成

下記のようにリクエストし、セッションカスタム属性の「sampleOS」に「Android」という値を顧客のコンテキストとして設定しました。

```sh
REQUEST:
PUT /shopper/shopper-context/v1/organizations/{orgID}/shopper-context/{usid}
Host: {shortCode}.api.commercecloud.salesforce.com
Authorization: Bearer {AccessToken}
Content-Type: application/json

BODY:
{
  "customQualifiers": {
    "sampleOS": "Android"
  }
}
```




#### 5. 商品情報の取得

最後に同じ顧客のアクセストークンを利用して商品情報を取得するとレスポンスに「contextapitestpromo」というプロモーションがあることが確認できます。

![スクリーンショット 2022-12-29 15.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/3bad17f7-5811-0b38-ebaa-b5957f0fe6af.png)