見出し画像

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を利用する場合紹介予定です。😆


執筆者プロフィール:張 艶艶
経歴:
・システム開発経験13年
・前職でSE、SLとして大手SIerに常駐
取得資格:
・Salesforce Administrator
・Salesforce Platform Developer 1
・MuleSoft 認定デベロッパー - レベル 1
・Tableau Desktop Specialist
・Microsoft Certified: Azure Fundamentals
・Anaplan レベル1 モデル構築
趣味
・スキー、キャンプ、中華料理を作る
特技
・課題の調査
・家事をやりながら仕事の難問の解決策を見つける😂

お問合せはお気軽に
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/

PHOTO:UnsplashKari Shea