Salesforceと外部システムの連携について(上)
ご挨拶
こんにちは!SHIFTのSalesforceチームの張です。
デジタル化の進展に伴い、各システム間のデータ連携の設計と開発がますます重要になっています。今回はSalesforceと外部システムの連携について、ご紹介させていただきます。
その前に、簡単に自分の経歴を紹介します。
Java開発経験8年
Salesforceの開発&運用4年
(そのうち2.5年インターフェースの設計&開発)RPA、VB.NETなど開発経験1年
なぜSalesforceと外部システムの連携を紹介しようと思ったの
①Salesforceは顧客関係管理(CRM)の分野で世界的に有名であり、顧客情報を中心にビジネスプロセスを管理します。企業が複数のシステムを利用している場合、それぞれのシステムが持つデータが分散してしまい、情報の一元化が困難になることがあります。Salesforceと外部システムを連携させることで、顧客データや販売データ、サービス履歴などの情報を統合し、全社的な視点でのデータ管理が可能となります。例えば、オンラインストアの購買データがSalesforceに反映されることで、カスタマーサポートが効果的に提供され、顧客満足度の向上につながります。
②Salesforce従事者の中で、インターフェースに関する知識を持っている方は少ないです。周りの人たちも専門知識を持っている人が少ないです。開発中に悩んでいる方が少しでも助けてもらえたら、嬉しいです。
今回ご紹介したい内容
Salesforceと外部システムの連携パターンは以下二つがあります。
①アウトバウンド連携(Salesforceから外部システムへの連携)
②インバウンド連携(外部システムからSalesforceへの連携)
今回は①の連携パターンについて紹介します。 Salesforceが外部システムのSOAP/REST APIをCallOutする場合、主に基幹システムからマスターデータを取得し、それをSalesforceのオブジェクトに更新します。
このプロセスのイメージを以下の図で表現します。
この場合、Salesforce側では以下の手順によって、外部システムのSOAP/REST APIをCallOutすることができます。
(1)リモートサイトの登録 設定手順については、Salesforceの以下のドキュメントを参照してください。
Configure Remote Site Settings
Salesforceの設定画面キャプチャ:
(2)CallOutの開発
APIを実行するためのCallout ClassをApex TriggerやFlowから呼び出すことができます。
Callout Classは非同期にする必要があるため、@futureアノテーションを付けるか、Queueableインターフェースを実装する必要があります。
今回はFlowからCallout Classを呼び出す場合のサンプルコードを紹介します。
ア: まず、フローにApexアクション要素を使用してCallout Classを呼び出します。フローの実装については以下の図を参照してください。
フローとAPEXのパラメータの渡す方法と注意事項は以下ヘルパードキュメントを参照してください。
Let Flows Execute Apex Actions
イ: サンプルコードを読みながらインターフェースの開発に理解しやすいと思います。以下サンプルコードを用意しました。ご参照ください。
public class ExternalAPIService {
public class input{
@InvocableVariable
public String queryZipCode;
}
//リクエストURLの設定(カスタマイズラベルを利用)
String reqURL = System.Label.ZipSearchRequestURL;
// 外部APIを呼び出すメソッド
@InvocableMethod(label = '郵便番号検索')
public static List<List < Account > >
callExternalAPIGetInfo(List<input> inputs) {
// 外部APIのエンドポイントURL
String reqURL = 'https://map.yahooapis.jp/search/zip/V1/zipCodeSearch';
String prefecture = ''; //都道府県格納用変数
String city = ''; //市区町村格納用変数
String oaza = ''; //大字格納用変数
/* リクエストを作成 */
HttpRequest req = new HttpRequest();
// リクエストURLにパラメータを入れます(複雑な場合、リクエスト条件もJSON形で作成必要)
req.setEndpoint(reqURL + '?query=' + inputs[0].queryZipCode +'&output=json&detail=full' );
// GET、POST、PUTなどのHTTPメソッドを選択
req.setMethod('GET');
// 必要に応じて、リクエストヘッダーやボディを設定することもできます(実装とき設定必要と思います)
//リクエスト送信
Http http = new Http();
HTTPResponse res = http.send(req);
//レスポンス受信JSONをMap<String, Object>に並列化
Map<String, Object> resBody = (Map<String, Object>)JSON.deserializeUntyped(res.getBody());
// レスポンス受信内容をデバックログに出力する
system.debug(resBody);
// Featureがない場合、郵便番号が存在しないためエラー(Feature配下に検索結果1件分のデータ群が入っている)
if((List<Object>)resBody.get('Feature') == null){
return null;
}
List<List<Account>> addressListAll = new List<List<Account>>();
// Jsonを解析していく
List<Account> addressList = new List<Account>();
for (Object result : (List<Object>)resBody.get('Feature')) {
Map<String, Object> featureMap = (Map<String, Object>)result;
Map<String, Object> propertyMap = (Map<String, Object>)featureMap.get('Property');
for(Object address: (List<Object>)propertyMap.get('AddressElement')){
Map<String, Object> nameMap = (Map<String, Object>)address;
// AddressElementの配下のNameに都道府県、市区町村、大字・・・などの階層で情報が格納されている
addressList.add((Account)(nameMap.get('Name')));
}
addressListAll.add(addressList);
//上記で格納した順番に取り出し、住所(都道府県から大字まで)を作成していく
//prefecture = addressList[0];
//city = addressList[1];
//oaza = addressList[2].substringBefore('(');
}
/* (後続処理については省略) */
return addressListAll;
}
※これは最低限のサンプルコードですので、細かい部分が完全に正しいとは限りません。ご了承ください。
②外部システムからSalesforceのAPIを利用する場合、①の場合よりもさらに複雑になります。次回で紹介させていただきます。😔😔😔😔😔😔
おわりに
最後までお読みいただきありがとうございました。 次回は外部システムからSalesforceのAPIを利用する場合紹介予定です。😆
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/