チャット内の顧客データ(注文、配送、請求書)
ログイン済みの顧客の注文に関する質問に、AIアシスタントが回答します。署名付きの本人情報で保護し、指定したフィールドだけをショップから取得、またはインポートします。
顧客データを使うと、AIアシスタントは「荷物はどこですか?」「請求書は支払い済みですか?」「前回の注文には何が入っていましたか?」などに回答できます。対象はログイン済みの顧客で、本人のデータだけです。有料プランで利用できます。
データの保護
- ブラウザーの情報は証明になりません。 注文番号、請求書番号、メールアドレス、ページの表示内容、チャットへの入力は、いずれもアクセス権を与えません。誰がどのデータを見られるかは、運営側のサーバーが署名した本人情報だけで決まります。
- 番号は絞り込み条件にすぎません。 顧客が注文番号を伝えても、その顧客自身の注文の中だけで検索します。他人の番号では何も返しません。
- 各フィールドを運営側が選びます。 アシスタントが受け取るのは、有効にしたフィールドだけです。それ以外は、ショップが送信しても受信時に破棄します。
- 当社側にデータを保存しません(取得方式)。 取得方式では、reactive.chatは質問ごとにショップへ問い合わせ、応答を保存しません。インポート方式では、当社側で暗号化して保存し、遅くとも90日後に削除します。
- 当社独自のサーバーのみを使用します。 データを送るのは当社独自のAIサーバー(または運営側の独自AIノード)だけで、第三者のAIサービスには送りません。
前提:本人確認
アシスタントが顧客データを使うのは、運営側のサーバーで本人確認した訪問者だけです。アカウントのプロジェクト → 本人確認でシークレットを設定します。シークレットはサーバーに保持し、ブラウザーやスニペットに含めてはいけません。
ログイン済みの顧客ごとに、サーバーで有効期限(最大24時間先)付きのハッシュを計算し、ウィジェットに渡します。
$userId = (string) $customer->id;
$exp = time() + 3600;
$hash = hash_hmac('sha256', $userId . '.' . $exp, getenv('RC_IDENT_SECRET'));
echo "<script>ReactiveChat('identify', { userId: " . json_encode($userId)
. ", userHash: " . json_encode($hash) . ", exp: " . $exp . " });</script>";
const crypto = require('crypto');
const exp = Math.floor(Date.now() / 1000) + 3600;
const hash = crypto.createHmac('sha256', process.env.RC_IDENT_SECRET)
.update(String(user.id) + '.' + exp).digest('hex');
// in the template: ReactiveChat('identify', { userId: '<id>', userHash: '<hash>', exp: <exp> });
expのないハッシュでも、会話履歴などのために訪問者を確認できますが、顧客データには不十分です。シークレットを更新すると、古いものは24時間有効です。
メールアドレスも署名する(予約やメールアドレスを使う連携向け)。 ハッシュに添えたemailが確認済みとして扱われるのは、署名に含めた場合だけです。userHash = HMAC-SHA256(secret, userId + "." + exp + "." + email)で、アドレスはidentifyに渡すものと完全に同じにします。署名しなくても訪問者はログイン済みのままですが、アシスタントはそのアドレスで予約せず、連携先もそのアドレスを検索しません。既存のuserId + "." + exp形式は、そのまま動作します。
取得、インポート、または両方
プロジェクト → 顧客データで、アシスタントのデータ取得元を選びます。
- ショップから取得 – 該当する質問のたびにreactive.chatがエンドポイントを呼び出します。データは運営側に残ります。推奨方式です。
- APIでインポート – ショップからreactive.chatへ顧客の注文を送信します。エンドポイントを用意できないショップに適しています。
- 両方 – 最初にインポート済みデータを使い、見つからなければ取得します。
アシスタントに渡せるデータ
各フィールドを個別に有効にします。既定の設定は、一般的な質問に対応します。
bestellung.nummer– 注文番号。既定:常に有効。用途:必須。番号のない注文は扱いません。bestellung.datum– 注文日(YYYY-MM-DD)。既定:有効。用途:「いつ注文しましたか?」bestellung.status– テキストの注文状況。既定:有効。用途:「注文は発送済みですか?」bestellung.summe– 合計金額。既定:有効。用途:「いくら支払いましたか?」bestellung.waehrung– 通貨(ISO、EURなど)。既定:有効。用途:合計金額と一緒にのみ使用。positionen.name– 商品名。既定:有効。用途:「注文に何が入っていましたか?」positionen.menge– 商品ごとの数量。既定:有効。用途:「いくつ注文しましたか?」versand.dienst– 配送業者。既定:有効。用途:「どの業者が配達しますか?」versand.sendungsnummer– 追跡番号。既定:有効。用途:「荷物はどこですか?」versand.status– テキストの配送状況。既定:有効。用途:「配送中ですか?」versand.ort– 配送先の市区町村。既定:無効。用途:「荷物はどこに届きますか?」versand.plz– 配送先の郵便番号。既定:無効。用途:上記と同じ。rechnung.nummer– 請求書番号。既定:有効。用途:「対応する請求書はどれですか?」rechnung.status– テキストの支払い状況。既定:有効。用途:「請求書は支払い済みですか?」rechnung.faellig_am– 支払期限。既定:有効。用途:「いつまでに支払いますか?」
無効なフィールドは、アシスタントに一切届きません。取得時は破棄し、インポート時は保存しません。市区町村と郵便番号は、明示的に有効にした場合だけ使えます。通りの住所と名前は常に除外します。
決して渡さない情報
次の情報は有効にできません。ショップが送信しても破棄します。
- 通りの住所、番地、その他の住所行
- 受取人や顧客の名前
- メールアドレスと電話番号
- IBAN、BIC、口座番号、カード情報
- 生年月日
- パスワード、トークン、アクセスキー
- 税番号と身分証番号
上限
1応答最大10注文、1注文最大20商品、テキスト最大200文字、応答全体で最大16 kBです。不明なフィールドはエラーなしで破棄します。
取得用エンドポイント
reactive.chatはPOSTでエンドポイントを呼び出します。
POST https://shop.your-domain.com/rc-customer-data
Content-Type: application/json
X-RC-Zeit: 1791196400
X-RC-Signatur: <hex(HMAC_SHA256(endpoint secret, X-RC-Zeit + "." + body))>
{"user_id":"4711","anliegen":"bestellung","referenz":"2026-0815","sprache":"en","nonce":"..."}
user_idは、本人確認済みの顧客IDです。チャットの入力内容を使うことはありません。anliegenは、bestellung(注文)、lieferung(配送)、rechnung(請求書)、retoure(返品)、テストボタン用のtestのいずれかです。referenzは、顧客が伝えた番号、または空です。必ず、このuser_idの注文の中だけで検索してください。
エンドポイントは、次を満たす必要があります。
- 署名を定時間比較で検証し、
X-RC-Zeitが5分を超えてずれているリクエストを拒否する。 - 指定した
user_idのデータだけを返す。 - 公開アドレスのポート443で
https経由で到達でき、リダイレクトしない。 - 3秒以内に応答する。
応答:
{
"bestellungen": [
{
"nummer": "2026-0815", "datum": "2026-09-28", "status": "shipped",
"summe": "49.90", "waehrung": "EUR",
"positionen": [ { "name": "Balance bike blue", "menge": 1 } ],
"versand": { "dienst": "DHL", "sendungsnummer": "00340434...", "status": "out for delivery" },
"rechnung": { "nummer": "R-2026-1201", "status": "paid", "faellig_am": "2026-10-12" }
}
]
}
開発者向けドキュメントに、完全なPHPの例(kundendaten-referenz-endpunkt.php)があります。
接続をテストでは、reactive.chatがuser_idをrc-test、依頼の種類をtestとしてエンドポイントを呼び出し、結果を表示します。空の一覧か、サンプルの注文を返してください。
APIでインポートする
kundendaten:schreiben権限を持つAPIキーを使用します。
PUT https://reactive.chat/v1/kundendaten/4711?project_id=123
Authorization: Bearer <API key>
Content-Type: application/json
{"bestellungen":[ ... as above ... ]}
project_idはプロジェクトの番号です。ワークスペースにプロジェクトが1つしかなければ省略できます。PUTは、この顧客IDのすべての注文(最大50件)を置き換えます。DELETE /v1/kundendaten/4711?project_id=123で削除します。インポートしたデータは当社側で暗号化して保存し、最終インポートから90日後に削除します。そのため、状態の変更ごとなど、継続的に更新を送ってください。
ログインしていない訪問者
本人確認されていない人が注文について尋ねても、アシスタントは何も取得しません。代わりに、プロジェクト → 顧客データで設定した言語別の案内文と、任意のログインリンクを表示します。または、チームに引き継ぎます。
保存する内容
- 取得方式: ショップの応答は、その1回のアシスタントの回答のためだけに使い、会話にもナレッジベースにも保存しません。
- インポート方式: 暗号化して最大90日保存し、プロジェクトとともに削除します。
- アシスタントの回答は、他のメッセージと同じように会話履歴に残ります。チームはダッシュボードで確認できます。
トラブルシューティング
- ログイン済みなのに、アシスタントがログインを求める:
expがない、期限切れ、またはハッシュが一致しない場合、訪問者は確認済みと見なされません。シークレット、userId + "." + expの順序、サーバーの時計を確認してください。 - テストボタンが「許可されていないアドレス」と表示する: エンドポイントは、公開アドレスに
httpsで到達できる必要があります。内部アドレスや他のポートは拒否します。 - 運営側で署名エラーになる: 署名対象は、エンドポイント用シークレットによる
X-RC-Zeit + "." + bodyです。受信した本文をそのまま使い、再エンコードしないでください。 - 回答にフィールドがない: 「アシスタントに渡せるデータ」で有効になっていますか。
ドキュメントの関連項目
詳しくは、顧客データエンドポイントをご覧ください。すべての章はドキュメントにあります。
最終更新: