<ChatGPT>Salesforceと決済システムとの連携方法

### 要件
　・Salesforceと外部の決済システムを連携したい。
　・クレカの番号をSalesforceカスタム画面に入力すると、決済システムと連携し、決済を実行する。
　・クレカ番号は、SalesofrceのDBに保存したくない。
　・しかしカスタム画面を開いた際に、過去に決済したことがあるなら、クレカ番号をプリセットしたい。

### 対応方針：
　・Salesforceにカスタム画面を用意。
　・カスタム画面上にクレカ番号を入力し、決済ボタンを押下すると、クレカ番号を渡し外部の決済システムのAPIをCall。（パラメータとして使うのみのため、DataBaseに保存はしない。）
　・プリセットに関しては、カスタム画面を開いた時にinitで、外部の決済システムにパラメータを渡し、クレカ番号を取得
※決まった決済システムがない場合、AppExchangeなども奨励
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/be8567ea-9c04-2cc5-dc39-2fbfdda814f3.png)

### ChatGPT-4との会話：
★User
Salesforceと、サードパーティの決済システムとで連携をしたいと考えています。
セキュリティの懸念から、Salesforceにはステータス、サードパーティーにはクレカなどの決済情報の保持、決済の実行などを機能分担と考えています。
各データやパラメータの連携など、どのように行うのでしょうか？流れが理解できず、質問しています。

★ChatGPT
Salesforceとサードパーティの決済システムとの連携を考える場合、以下のステップや考慮点があります。

連携方法の選択: 通常、API (Application Programming Interface) を使用して連携します。サードパーティの決済システムが提供するAPIの仕様書を取得し、SalesforceからどのようにそのAPIを呼び出すかを検討します。

セキュリティ: 金融情報を扱うため、APIの呼び出しは常にセキュアなプロトコル、たとえばHTTPSを使って行います。また、APIの認証も重要で、OAuthやAPIキーなどの方法が考えられます。

データのマッピング: Salesforceのオブジェクトやフィールドと、サードパーティのデータ構造とをどのように対応させるかを決定します。

連携の実装: Salesforce側では、Apexクラスや外部サービスの呼び出しを利用してAPIのリクエストを作成・送信します。

エラーハンドリング: APIの呼び出し中にエラーが発生した場合の対応策を設計します。例えば、リトライのロジックやエラーメッセージの通知方法など。

テスト: 実際にテストデータを使用して連携をテストします。特に、決済の処理は実際の金額でのテストを避け、テスト用のAPIエンドポイントやテストカードを使用することが推奨されます。

監視と通知: 連携が正常に動作しているかを監視し、問題が発生した場合には適切な通知が行われるようにします。

このように、連携を実現するには複数のステップや考慮点が存在します。具体的なAPIの仕様やSalesforceの設定などは、具体的なサードパーティの決済システムに依存するため、詳細な仕様書やドキュメントを参照する必要があります。

★User
この頂いた例は、Salesforce画面上でコールアウトしてサードパーティーのAPIを呼び、決済するイメージでしょうか？

★ChatGPT
はい、ご理解いただいた通りです。

提供した例では、Salesforceの画面（VisualforceページやLightningコンポーネントなど）からユーザーが何らかのアクション（例: 決済ボタンのクリック）を行った際に、Salesforceのバックエンド（Apexクラス）でサードパーティの決済APIをコールアウトして呼び出すイメージを想定しています。

この方式では、ユーザーのクレジットカード情報などの決済情報をSalesforceが直接扱うことなく、サードパーティの決済システムに情報を渡して決済処理を代行させることができます。これにより、Salesforceにクレジットカード情報を保存するリスクを回避することができるとともに、サードパーティの決済システムのセキュリティ機能や標準機能を活用することができます。

★User
Salesforceのカスタム画面上にクレカ情報は保持せず、しかしサードパーティーのAPIを呼ぶ際にパラメータとして受け渡すイメージですか？
パラメータとして渡す際にhttspにするなどセキュアな通信にしないとですね。

★ChatGPT
はい、正確にそのイメージです。

Salesforceのカスタム画面でクレジットカード情報を入力させる場合でも、その情報はSalesforceのデータベースに保存されず、ユーザーがアクションを実行したとき（例: 決済ボタンをクリックするなど）にサードパーティの決済APIへとパラメータとして直接渡されます。

そして、その通信は以下の点を考慮してセキュアに行われる必要があります：

HTTPS: 必ずHTTPSを使用してセキュアな通信を行います。これにより、通信中のデータが暗号化されるため、第三者に情報が漏れるリスクを低減できます。

認証: API呼び出し時には適切な認証手段（例: APIキーやOAuthトークンなど）を用いて、正当なリクエストであることを確認します。

PCI DSSの遵守: クレジットカード情報を扱う場合、PCI DSS（Payment Card Industry Data Security Standard）というクレジットカード業界のセキュリティ標準を遵守する必要があります。サードパーティの決済システムはこの標準を遵守していることが一般的ですが、Salesforce側でもこの情報を一時的に扱うため、関連するセキュリティ要件を理解し、適切な対策をとる必要があります。

このような手法を採用することで、セキュリティのリスクを最小限に抑えつつ、ユーザーにスムーズな決済体験を提供することができます。

★User
ちなみに、要件として、クレカ情報など保存したうという要件がありますが、Salesforceには持ちたくありません。その場合はブラウザのキャッシュやindexDBとかに値を持つのでしょうか？セキュリティとしてイマイチですか？

★ChatGPT
クレジットカード情報などの重要な情報をブラウザのキャッシュやIndexedDBに保存するのは、セキュリティリスクが高いと考えられます。以下の理由から、そのような方法は推奨されません：

端末のセキュリティ: ブラウザのストレージやキャッシュに保存された情報は、端末がマルウェアや不正アクセスに感染した場合、リスクにさらされる可能性があります。

データの持続性: ブラウザのキャッシュやIndexedDBは、ユーザーがデータをクリアする、またはブラウザの設定により自動的にデータがクリアされる可能性があります。これにより、データの持続性が保証されません。

PCI DSS遵守: クレジットカード情報を安全に保存するためには、PCI DSSというセキュリティ標準に適合する必要があります。ブラウザのローカルストレージやキャッシュにクレジットカード情報を保存することは、この標準に適合していない可能性が高いです。

もしクレジットカード情報を保存する必要がある場合、以下のような方法を検討することができます：

トークン化: サードパーティの決済プロバイダーは、クレジットカード情報をトークン化するサービスを提供している場合が多いです。このトークンは、実際のクレジットカード情報とは異なる一意の識別子で、トークンを利用して決済を行うことができます。トークン自体はセンシティブな情報ではないため、Salesforceに保存することができます。

専用のセキュアストレージ: セキュアなストレージソリューションを使用して、センシティブな情報を安全に保存することができます。これは、専用のハードウェアやクラウドベースの暗号化されたストレージサービスなどを使用して実現できます。

結論として、クレジットカード情報などのセンシティブな情報をブラウザのキャッシュやローカルストレージに保存することは、セキュリティ上のリスクが高いため、推奨されません。安全な方法で情報を保存するための適切なソリューションを選択することが重要です。


★User
なるほど、そうなると、Salesforceと決済サービスの連携でクレカ情報を保存する場合、トークン化がよさそうですね。トークン化のデータの流れが理解しきなかったのですが、Salesforceのカスタム画面上にクレカ情報を入力して、データベースには保存せず決済サービスのAPIコール時の引数として使いますが、その際にトークン化も行い、トークン自体はSalesforceに保持するのでしょうか？

★ChatGPT
はい、おっしゃる通りです。クレジットカード情報のトークン化の一般的なフローは以下のようになります：

入力: Salesforceのカスタム画面上でユーザーがクレジットカード情報を入力します。

トークン化のリクエスト: Salesforceからサードパーティの決済サービスへ、クレジットカード情報を使ってトークンを生成するAPIリクエストを送ります。この際、クレジットカード情報はデータベースに保存されず、APIコールの引数としてのみ使用されます。

トークンのレスポンス: サードパーティの決済サービスは、トークンを生成し、そのトークンをレスポンスとしてSalesforceに返します。

トークンの保存: Salesforceは、返されたトークンをデータベースに保存します。このトークンは、クレジットカード情報の代わりとして後の決済処理などに使用されることが想定されます。

決済処理: トークンを使用して決済を行う場合、Salesforceはこのトークンを引数としてサードパーティの決済サービスのAPIを呼び出します。サービスはトークンを元のクレジットカード情報にマッピングし、決済を行います。

このトークン化のプロセスにより、クレジットカード情報をSalesforce内で保持することなく、決済や再度の課金などの操作を安全に行うことができます。

★User
利用者が再度決済を使用とした際に、Salesforce画面に、過去に入力したクレカ情報がでてきたほうがユーザビリティとしていいのですが、その場合はSalesforceにトークン化した情報を持つため、初期画面描画字に、決済サービスにトークンを渡し、クレカ情報を表示される流れになりますか？

★ChatGPT
実際にクレジットカードの詳細情報（カード番号、有効期限、CVVなど）を再表示することは、セキュリティの観点から非推奨とされます。ただし、ユーザビリティを考慮して、何らかの方法でユーザーに以前に使用したカードを再利用するオプションを示すことは一般的です。

一般的な実装方法としては以下のようなフローになります：

部分的な情報表示: トークンに関連付けられたカード情報の一部（例: カードの最後の4桁やカードの種類（VISA, Mastercardなど））だけを表示します。これにより、ユーザーはどのカードを以前に使用したのかを識別できますが、完全なカード情報は露出しません。

再利用の選択: ユーザーが部分的に表示されたカード情報を選択することで、再度そのカードを使用して決済を行うことができます。この際、実際の決済処理にはSalesforce内に保存されたトークンが利用されます。

トークンを用いた決済: 保存されているトークンを利用して、サードパーティの決済サービスのAPIを呼び出し、決済を実行します。

もし、どうしても完全なカード情報を再表示する必要がある場合は、サードパーティの決済サービスがトークンを使って元のカード情報を復元する機能を提供しているかどうか確認する必要があります。ただし、そのような機能は一般的に提供されていないことが多いですし、セキュリティ上のリスクを考慮すると、部分的な情報表示のアプローチが推奨されます。