Microsoft Dynamics CRM Connector 3.2 - Mule 4

Microsoft Dynamics CRM 用 Anypoint Connector を使用して、Mule アプリケーションは Microsoft Dynamics CRM の SOAP 組織サービスとやりとりすることができます。

互換性と解決された問題に関する情報は、リリースノートを参照してください。

始める前に

このコネクタを使用するには、以下に精通している必要があります。

  • Microsoft Dynamics CRM API

  • Anypoint Connector

  • Mule Runtime Engine (Mule)

  • Mule フローの要素とグローバル要素

  • Anypoint Studio (Studio) を使用した Mule アプリケーションの作成方法

アプリケーションを作成する前に、対象リソースへの接続をテストするには、Microsoft Dynamics CRM の SOAP 組織サービスのログイン情報が必要です。

Microsoft CRM インスタンスで作成された Web サービスヘッダーの作成日または期限切れ日は、Web サービスの基本セキュリティプロファイル検証 (​http://www.ws-i.org/Profiles/BasicSecurityProfile-1.0.html​) で規定された制約に準拠する必要があります。その概要を次に示します。

  • 作成日または期限切れ日には、小数点以下が 3 桁 (ミリ秒) を超える秒値を含めることはできません。

  • 秒値を含む作成日または期限切れ日では、60 未満の秒値を指定する必要があります。

  • 作成日または期限切れ日に ValueType 属性を含めることはできません。

  • 作成日または期限切れ日には、XML スキーマ種別 (dateTime) で指定された UTC 形式の時間値を含める必要があります。

POM ファイルの連動関係の追加

<dependency>
  <groupId>com.mulesoft.connectors</groupId>
  <artifactId>mule-microsoft-dynamics-crm-connector</artifactId>
  <version>x.x.x</version>
  <classifier>mule-plugin</classifier>
</dependency>

x.x.x​ を使用しているコネクタに対応するバージョンに置き換えます。

最新の ​pom.xml​ ファイル情報を取得する手順は、次のとおりです。

  1. Anypoint Exchange​ に移動します。

  2. Exchange で、​[Login (ログイン)]​ をクリックし、Anypoint Platform のユーザー名とパスワードを指定します。

  3. Exchange で、「​<connector-name>​」を検索します。

  4. コネクタを選択します。

  5. 画面の右上付近にある ​[Dependency Snippets (連動関係スニペット)]​ をクリックします。

Studio プロジェクトへのコネクタの追加

Anypoint Studio には、Studio プロジェクトにコネクタを追加する 2 つの方法があります。Studio タスクバーの Exchange ボタンから追加するか、[Mule Palette (Mule パレット)] ビューから追加します。

  1. Studio で Mule プロジェクトを作成します。

  2. [Mule Palette (Mule パレット)]​ ビューで、​[(X) Search in Exchange ((X) Exchange 内を検索)]​ をクリックします。

  3. [Add Modules to Project (モジュールをプロジェクトに追加)]​ で、検索項目に「​crm​」と入力します。

  4. [Available modules (使用可能なモジュール)]​ で、このコネクタの名前をクリックします。

  5. [Add (追加)]​ をクリックします。

  6. [Finish (完了)]​ をクリックします。

Studio でコネクタを設定する

  1. コネクタを Studio キャンバスにドラッグします。

  2. コネクタのグローバル要素を作成するには、次の項目を設定します。

    Online Authentication (Default) (オンライン認証 (デフォルト)):

    • Username (ユーザー名): Dynamics CRM のユーザー名を入力します。

    • Password (パスワード): 対応するパスワードを入力します。

    • Organization Service URL (組織サービスの URL): 対応する組織サービスの URL を入力します。

    • Authentication retries (認証の再試行): 認証を再試行する回数を入力します。

    • Disable cn check (CN チェックを無効化): SSL 証明書をスキップするかどうかを選択します。

      ログイン情報の設定

ユースケース - Microsoft Dynamics CRM の操作のデモ

このデモには、次のオプションが含まれています。

  • すべての取引先を返す: http://localhost:8081/accounts

  • サブ文字列が含まれる名前で取引先を照会する: http://localhost:8081/query-accounts?name=li

  • 指定した名前で新規取引先を作成する: http://localhost:8081/create-account?name=your-account-name

  • ID で取引先を取得する: http://localhost:8081/retrieve-account?accountid={account-guid}

  • 取引先を削除する: http://localhost:8081/delete-account?accountid={account-guid}

  • すべての取引先責任者を返す: http://localhost:8081/contacts

  • 取引先のすべての取引先責任者を返す: http://localhost:8081/contacts-by-account?accountid={account-guid}

  • 取引先責任者を取引先に関連付ける: http://localhost:8081/associate?accountid={account-guid}&contactid={contact-guid}

  • 取引先から取引先責任者の関連付けを解除する: http://localhost:8081/disassociate?accountid={account-guid}&contactid={contact-guid}

  • 商談を作成する: http://localhost:8081/create-opportunity?accountid={account-guid}&contactid={contact-guid}

  • 親取引先で商談を照会する: http://localhost:8081/opportunities-by-account?accountid={account-guid}

  • SetState​ 操作を実行して取引先をアクティブ化する: http://localhost:8081/activate-account?accountid={account-guid}

  • SetState​ 操作を実行して取引先を非アクティブ化する: http://localhost:8081/deactivate-account?accountid={account-guid}

  • 1 回の要求で複数のエンティティを作成する: http://localhost:8081/create-multiple

  • 1 回の要求で複数の取引先責任者の [Description (説明)] プロパティを更新する: http://localhost:8081/update-multiple

  • 更新された取引先責任者を取得する: http://localhost:8081/updated-contacts

  • 1 回の要求で複数の取引先責任者を削除する: http://localhost:8081/delete-multiple

ユースケースの Studio ビジュアルフロー

すべての取引先、名前による取引先の照会、および取引先の作成用の Studio アプリケーションフロー
取引先の削除、取引先の取得、すべての取引先責任者、および関連付けられた取引先責任者の取得用の Studio アプリケーションフロー
取引先への取引先責任者の関連付け、取引先への取引先責任者の関連付けの解除、商談の取得、および商談の作成用の Studio アプリケーションフロー
実行と取引先のアクティブ化、実行と取引先の非アクティブ化、複数の取引先責任者の作成、および複数の取引先責任者の削除用の Studio アプリケーションフロー
複数の取引先責任者の更新、および取引先責任者の取得と更新用の Studio アプリケーションフロー

ユースケースの XML フロー

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
    xmlns:microsoft-dynamics-crm="http://www.mulesoft.org/schema/mule/microsoft-dynamics-crm"
    xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core
    http://www.mulesoft.org/schema/mule/core/current/mule.xsd
    http://www.mulesoft.org/schema/mule/http
    http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
    http://www.mulesoft.org/schema/mule/microsoft-dynamics-crm
    http://www.mulesoft.org/schema/mule/microsoft-dynamics-crm/current/mule-microsoft-dynamics-crm.xsd
    http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
    <configuration-properties file="mule-app.properties"/>

    <http:listener-config
        name="HTTP_Listener_config"
        doc:name="HTTP Listener config" >
        <http:listener-connection
        host="localhost"
        port="8081" />
    </http:listener-config>
    <microsoft-dynamics-crm:dynamics-crm-config
        name="Microsoft_Dynamics_CRM_Dynamics_CRM"
        doc:name="Microsoft Dynamics CRM Dynamics CRM" >
        <microsoft-dynamics-crm:online-connection
            username="${username}"
            password="${password}"
            organizationServiceUrl="${organizationServiceUrl}"
            authenticationRetries="${authenticationRetries}" />
    </microsoft-dynamics-crm:dynamics-crm-config>
    <flow name="crm-all-accounts"  >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/accounts"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT accountid,name,statecode,statuscode FROM account]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-query-account-by-name"  >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/query-accounts"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "query" : "dsql:SELECT accountid,name,statecode,statuscode FROM account WHERE name LIKE '%" ++ attributes.queryParams.name ++ "%'"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[#[payload.query]]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-create-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/create-account"/>
        <ee:transform doc:name="Transform Message"  >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "name": attributes.queryParams.name
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:create
            logicalName="account"
            doc:name="Create"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-delete-account"
        config-ref="HTTP_Listener_config"
        path="/delete-account"/>
        <microsoft-dynamics-crm:delete
            logicalName="account"
            id="#[attributes.queryParams.accountid]"
            doc:name="Delete"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM" />
    </flow>
    <flow name="crm-retrieve-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/retrieve-account"/>
        <microsoft-dynamics-crm:retrieve
            logicalName="account"
            id="#[attributes.queryParams.accountid]"
            doc:name="Retrieve"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM" />
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-all-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/contacts"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT accountid,contactid,firstname,lastname FROM contact]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-get-associated-contacts" >
        <http:listener doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/contacts-by-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "query" : "dsql:SELECT contactid, accountidname, parentcustomerid_referenceto_account FROM contact WHERE parentcustomerid_referenceto_account = '" ++ attributes.queryParams.accountid ++ "'"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[#[payload.query]]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-associate-contact-to-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/associate"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
    attributes.queryParams.contactid
]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:associate
            logicalName="account"
            relatedEntitiesIds="#[payload]"
            doc:name="Associate"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"
            relationshipSchemaName="contact_customer_accounts"
            id="#[attributes.queryParams.accountid]"
            relationshipEntityRoleIsReferenced="true"/>
    </flow>
    <flow name="crm-disassociate-contact-to-account" >
        <http:listener doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/disassociate"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
[
    attributes.queryParams.contactid
]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:disassociate
            doc:name="Disassociate"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"
            logicalName="account"
            id="#[attributes.queryParams.accountid]"
            relationshipEntityRoleIsReferenced="true"
            relationshipSchemaName="contact_customer_accounts"
            relatedEntitiesIds="#[payload]"/>
    </flow>
    <flow name="crm-get-opportunities" >
        <http:listener doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/opportunities-by-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "query" : "dsql:SELECT accountid_referenceto_account,accountidname,customerid_referenceto_contact,name,parentaccountid_referenceto_account FROM opportunity WHERE parentaccountid_referenceto_account = '" ++ attributes.queryParams.accountid ++ "'"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[#[payload.query]]]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-create-opportunity" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/create-opportunity"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    "parentaccountid_referenceto_account": attributes.queryParams.accountid,
    "contactid_referenceto_contact": attributes.queryParams.contactid,
    "name": "unique opportunity",
    "timeline": 2
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:create
            logicalName="opportunity"
            doc:name="Create"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-execute-activate-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/activate-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
{
    "entityMoniker": {
        "id": {
            "value": attributes.queryParams.accountid,
        },
        "logicalName": "account"
    },
    "state": {
        "value": 0
    },
    "status": {
        "value": 1
    }
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:execute
            requestName="SetState" doc:name="Execute"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-execute-deactivate-account" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/deactivate-account"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
{
    "entityMoniker": {
        "id": {
            "value": attributes.queryParams.accountid,
        },
        "logicalName": "account"
    },
    "state": {
        "value": 1
    },
    "status": {
        "value": 2
    }
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:execute
            doc:name="Execute"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"
            requestName="SetState"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-create-multiple-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/create-multiple"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
[
    {
      "fullname":"Contact1",
      "address1_city":"DemoCity",
      "description":"Demo contact 1"
    },
    {
      "fullname":"Contact2",
      "address1_city":"DemoCity",
      "description":"Demo contact 2"
    },
    {
      "fullname":"Contact3",
      "address1_city":"DemoCity",
      "description":"Demo contact 3"
    }
]]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:create-multiple
            logicalName="contact"
            doc:name="Create multiple"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-delete-multiple" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/delete-multiple"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT contactid FROM contact WHERE address1_city = 'DemoCity']]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
payload.*contactid
]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:delete-multiple
            logicalName="contact"
            ids="#[payload]"
            doc:name="Delete multiple"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM"/>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-update-multiple-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/update-multiple"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT contactid,description FROM contact WHERE address1_city = 'DemoCity']]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/java
---
updates: payload map (item, index) -> {
      "contactid" : item.contactid,
      "description" : "Updated Description"
}]]></ee:set-payload>
            </ee:message>
        </ee:transform>
        <microsoft-dynamics-crm:update-multiple
            logicalName="contact"
            doc:name="Update multiple"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:list-of-attributes ><![CDATA[#[payload.updates]]]></microsoft-dynamics-crm:list-of-attributes>
        </microsoft-dynamics-crm:update-multiple>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
    <flow name="crm-retrieve-update-contacts" >
        <http:listener
            doc:name="Listener"
            config-ref="HTTP_Listener_config"
            path="/updated-contacts"/>
        <microsoft-dynamics-crm:retrieve-multiple-by-query
            doc:name="Retrieve multiple by query"
            config-ref="Microsoft_Dynamics_CRM_Dynamics_CRM">
            <microsoft-dynamics-crm:query ><![CDATA[dsql:SELECT contactid,description FROM contact WHERE address1_city = 'DemoCity']]></microsoft-dynamics-crm:query>
        </microsoft-dynamics-crm:retrieve-multiple-by-query>
        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
</mule>