查看 Application Integration 支援的連接器。
電子商務範例整合
這個範例整合功能可執行電子商務後端情境的使用案例。
深入探索
如需包含此程式碼範例的詳細說明文件,請參閱以下文件:
程式碼範例
{
"description": "The integration mimics the back office e-commerce order processing. The request is expected to contain order with one or more line items as json object with sku, quantity, price, vendor etc. If the total price of the order goes beyond $100 then there will be an email sent to approve the order else the order will be processed successfully. For all the items which have vendor as external, there will be an external order created by making a rest call to the external server. The response of the integration will be total order value, filtered list of external items and list of http response status received for each rest call made per external line_item.",
"triggerConfigs": [{
"label": "OrderProcessApiTrigger",
"startTasks": [{
"taskId": "1"
}],
"properties": {
"Trigger name": "ecom-order-processing_API_1"
},
"triggerType": "API",
"triggerNumber": "1",
"triggerId": "api_trigger/ecom-order-processing_API_1",
"position": {
"x": -294,
"y": -252
}
}, {
"label": "ReportExternalOrders",
"startTasks": [{
"taskId": "6"
}],
"properties": {
"Trigger name": "ecom-order-processing_API_2"
},
"triggerType": "API",
"triggerNumber": "2",
"triggerId": "api_trigger/ecom-order-processing_API_2",
"position": {
"x": 210,
"y": -84
}
}],
"taskConfigs": [{
"task": "SuspensionTask",
"taskId": "2",
"parameters": {
"customMessage": {
"key": "customMessage",
"value": {
"stringValue": "Hello user, approval request from EcomOrderProcessing integration."
}
},
"isApproved": {
"key": "isApproved",
"value": {
"stringArray": {
"stringValues": ["$`Task_2_isApproved`$"]
}
}
},
"suspensionExpiration": {
"key": "suspensionExpiration",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.SuspensionExpiration\",\n \"remindAfterMs\": 86400000,\n \"expireAfterMs\": 172800000\n}"
}
},
"notifications": {
"key": "notifications",
"value": {
"jsonValue": "{\n \"protoValues\": [{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.Notification\",\n \"emailAddress\": {\n \"email\": \"\\u003cchange-this-to-email-id\\u003e\"\n }\n }]\n}"
}
}
},
"nextTasks": [{
"taskId": "3",
"condition": "$`Task_2_isApproved`$ \u003d true",
"displayName": "Proceed if approved"
}],
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Approval",
"successPolicy": {
"finalState": "SUSPENDED"
},
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -42
}
}, {
"task": "FieldMappingTask",
"taskId": "1",
"parameters": {
"FieldMappingConfigTaskParameterKey": {
"key": "FieldMappingConfigTaskParameterKey",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.FieldMappingConfig\",\n \"mappedFields\": [{\n \"inputField\": {\n \"fieldType\": \"DOUBLE_VALUE\",\n \"transformExpression\": {\n \"initialValue\": {\n \"referenceValue\": \"$orders_request$\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"line_items\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"FOR_EACH\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"protoValue\": {\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.TransformExpression\",\n \"initialValue\": {\n \"referenceValue\": \"~x\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"quantity\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_DOUBLE\"\n }\n }\n }, {\n \"functionType\": {\n \"doubleFunction\": {\n \"functionName\": \"MULTIPLY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"referenceValue\": \"~x\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"price_per_unit\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_DOUBLE\"\n }\n }\n }]\n }]\n }]\n }\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_DOUBLE_ARRAY\"\n }\n }\n }, {\n \"functionType\": {\n \"doubleArrayFunction\": {\n \"functionName\": \"SUM\"\n }\n }\n }]\n }\n },\n \"outputField\": {\n \"referenceKey\": \"$total_order_value$\",\n \"fieldType\": \"DOUBLE_VALUE\",\n \"cardinality\": \"OPTIONAL\"\n }\n }]\n}"
}
}
},
"nextTasks": [{
"taskId": "2",
"condition": "$total_order_value$ \u003e\u003d $threshold_order_value$",
"displayName": "TotalOrderValue Above Threshold ",
"description": "Checks if the total order value is greater than or equal to $100"
}, {
"taskId": "3",
"condition": "$total_order_value$ \u003c $threshold_order_value$",
"displayName": "TotalOrderValue Below Threshold",
"description": "Checks if the total order value is less than $100"
}],
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Find Total Order Price",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": -126
}
}, {
"task": "FieldMappingTask",
"taskId": "5",
"parameters": {
"FieldMappingConfigTaskParameterKey": {
"key": "FieldMappingConfigTaskParameterKey",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.FieldMappingConfig\",\n \"mappedFields\": [{\n \"inputField\": {\n \"fieldType\": \"JSON_VALUE\",\n \"transformExpression\": {\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"{\\\"STATUS\\\" : \\\"PROCESSING_COMPLETE\\\"}\"\n }\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"stringFunction\": {\n \"functionName\": \"TO_JSON\"\n }\n }\n }]\n }\n },\n \"outputField\": {\n \"referenceKey\": \"$orders_response$\",\n \"fieldType\": \"JSON_VALUE\",\n \"cardinality\": \"OPTIONAL\"\n }\n }]\n}"
}
}
},
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Build Response",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": 378
}
}, {
"task": "SubWorkflowForEachLoopV2Task",
"taskId": "4",
"parameters": {
"iterationElementMapping": {
"key": "iterationElementMapping",
"value": {
"stringValue": "sub_integration_input"
}
},
"aggregatorParameterMapping": {
"key": "aggregatorParameterMapping",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.ParameterMap\",\n \"entries\": [{\n \"key\": {\n \"literalValue\": {\n \"stringValue\": \"`Task_6_responseStatus`\"\n }\n },\n \"value\": {\n \"literalValue\": {\n \"stringValue\": \"rest_call_response_status\"\n }\n }\n }]\n}"
}
},
"triggerId": {
"key": "triggerId",
"value": {
"stringValue": "api_trigger/ecom-order-processing_API_2"
}
},
"loopMetadata": {
"key": "loopMetadata",
"value": {
"stringArray": {
"stringValues": ["$`Task_4_loopMetadata`$"]
}
}
},
"disableEucPropagation": {
"key": "disableEucPropagation",
"value": {
"booleanValue": false
}
},
"listToIterate": {
"key": "listToIterate",
"value": {
"stringValue": "$filtered_external_items$"
}
},
"workflowName": {
"key": "workflowName",
"value": {
"stringValue": "ExampleIntegration-EcomOrderProcessing"
}
},
"requestParameterMapping": {
"key": "requestParameterMapping"
},
"overrideParameterMapping": {
"key": "overrideParameterMapping"
}
},
"nextTasks": [{
"taskId": "5"
}],
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "For Each Loop",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": 252
}
}, {
"task": "FieldMappingTask",
"taskId": "3",
"parameters": {
"FieldMappingConfigTaskParameterKey": {
"key": "FieldMappingConfigTaskParameterKey",
"value": {
"jsonValue": "{\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.FieldMappingConfig\",\n \"mappedFields\": [{\n \"inputField\": {\n \"fieldType\": \"JSON_VALUE\",\n \"transformExpression\": {\n \"initialValue\": {\n \"referenceValue\": \"$orders_request$\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"line_items\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"FILTER_ELEMENTS\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"protoValue\": {\n \"@type\": \"type.googleapis.com/enterprise.crm.eventbus.proto.TransformExpression\",\n \"initialValue\": {\n \"referenceValue\": \"~x\"\n },\n \"transformationFunctions\": [{\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"GET_PROPERTY\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"vendor\"\n }\n }\n }]\n }, {\n \"functionType\": {\n \"jsonFunction\": {\n \"functionName\": \"TO_STRING\"\n }\n }\n }, {\n \"functionType\": {\n \"stringFunction\": {\n \"functionName\": \"EQUALS\"\n }\n },\n \"parameters\": [{\n \"initialValue\": {\n \"literalValue\": {\n \"stringValue\": \"External\"\n }\n }\n }]\n }]\n }\n }\n }\n }]\n }]\n }\n },\n \"outputField\": {\n \"referenceKey\": \"$filtered_external_items$\",\n \"fieldType\": \"JSON_VALUE\",\n \"cardinality\": \"OPTIONAL\"\n }\n }]\n}"
}
}
},
"nextTasks": [{
"taskId": "4"
}],
"taskExecutionStrategy": "WHEN_ANY_SUCCEED",
"displayName": "Filter External Items",
"description": "Filtering out line_items which have vendor as \"External\" so that we can place order request to the vendor",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": -294,
"y": 126
}
}, {
"task": "GenericRestV2Task",
"taskId": "6",
"parameters": {
"throwError": {
"key": "throwError",
"value": {
"booleanValue": false
}
},
"responseBody": {
"key": "responseBody",
"value": {
"stringArray": {
"stringValues": ["$`Task_6_responseBody`$"]
}
}
},
"disableSSLValidation": {
"key": "disableSSLValidation",
"value": {
"booleanValue": false
}
},
"httpParams": {
"key": "httpParams"
},
"responseHeader": {
"key": "responseHeader",
"value": {
"stringArray": {
"stringValues": ["$`Task_6_responseHeader`$"]
}
}
},
"userAgent": {
"key": "userAgent",
"value": {
"stringValue": ""
}
},
"httpMethod": {
"key": "httpMethod",
"value": {
"stringValue": "POST"
}
},
"responseStatus": {
"key": "responseStatus",
"value": {
"stringArray": {
"stringValues": ["$`Task_6_responseStatus`$"]
}
}
},
"url": {
"key": "url",
"value": {
"stringValue": "https://mocktarget.apigee.net/echo"
}
},
"urlFetchingService": {
"key": "urlFetchingService",
"value": {
"stringValue": "HARPOON"
}
},
"useSSL": {
"key": "useSSL",
"value": {
"booleanValue": false
}
},
"requestorId": {
"key": "requestorId",
"value": {
"stringValue": ""
}
},
"urlQueryStrings": {
"key": "urlQueryStrings"
},
"requestBody": {
"key": "requestBody",
"value": {
"stringValue": "$sub_integration_input$"
}
},
"followRedirects": {
"key": "followRedirects",
"value": {
"booleanValue": true
}
},
"additionalHeaders": {
"key": "additionalHeaders"
}
},
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"displayName": "Call REST Endpoint",
"externalTaskType": "NORMAL_TASK",
"position": {
"x": 210,
"y": 42
}
}],
"integrationParameters": [{
"key": "total_order_value",
"dataType": "DOUBLE_VALUE",
"displayName": "total_order_value",
"inputOutputType": "OUT"
}, {
"key": "`Task_4_loopMetadata`",
"dataType": "JSON_VALUE",
"displayName": "`Task_4_loopMetadata`",
"isTransient": true,
"producer": "1_4"
}, {
"key": "threshold_order_value",
"dataType": "DOUBLE_VALUE",
"defaultValue": {
"doubleValue": 100.0
},
"displayName": "threshold_order_value"
}, {
"key": "filtered_external_items",
"dataType": "JSON_VALUE",
"displayName": "filtered_external_items",
"inputOutputType": "OUT"
}, {
"key": "orders_request",
"dataType": "JSON_VALUE",
"defaultValue": {
"jsonValue": "{\n \"order_no\": \"12345\",\n \"buyer_id\": \"raambo\",\n \"line_items\": [{\n \"line\": 1.0,\n \"sku\": \"tr100\",\n \"vendor\": \"Internal\",\n \"quantity\": 1.0,\n \"price_per_unit\": 10.0\n }, {\n \"line\": 2.0,\n \"sku\": \"tbz\",\n \"vendor\": \"External\",\n \"quantity\": 24.0,\n \"price_per_unit\": 1.0\n }]\n}"
},
"displayName": "orders_request",
"inputOutputType": "IN",
"jsonSchema": "{\n \"properties\": {\n \"buyer_id\": {\n \"type\": \"string\"\n },\n \"line_items\": {\n \"items\": {\n \"properties\": {\n \"price_per_unit\": {\n \"type\": \"number\"\n },\n \"sku\": {\n \"type\": \"string\"\n },\n \"vendor\": {\n \"type\": \"string\"\n },\n \"line\": {\n \"type\": \"number\"\n },\n \"quantity\": {\n \"type\": \"number\"\n }\n },\n \"type\": \"object\"\n },\n \"type\": \"array\"\n },\n \"order_no\": {\n \"type\": \"string\"\n }\n },\n \"type\": \"object\",\n \"$schema\": \"http://json-schema.org/draft-04/schema#\"\n}"
}, {
"key": "rest_call_response_status",
"dataType": "STRING_ARRAY",
"displayName": "rest_call_response_status",
"inputOutputType": "OUT"
}, {
"key": "`Task_2_isApproved`",
"dataType": "BOOLEAN_VALUE",
"displayName": "`Task_2_isApproved`",
"isTransient": true,
"producer": "1_2"
}, {
"key": "`Task_6_responseHeader`",
"dataType": "STRING_VALUE",
"displayName": "`Task_6_responseHeader`",
"isTransient": true,
"producer": "1_6"
}, {
"key": "`Task_6_responseBody`",
"dataType": "STRING_VALUE",
"displayName": "`Task_6_responseBody`",
"isTransient": true,
"producer": "1_6"
}, {
"key": "`Task_6_responseStatus`",
"dataType": "STRING_VALUE",
"defaultValue": {
"stringValue": ""
},
"displayName": "`Task_6_responseStatus`",
"inputOutputType": "OUT",
"isTransient": true,
"producer": "1_6"
}, {
"key": "orders_response",
"dataType": "JSON_VALUE",
"displayName": "orders_response",
"inputOutputType": "OUT"
}, {
"key": "sub_integration_input",
"dataType": "JSON_VALUE",
"defaultValue": {
"jsonValue": "{\n}"
},
"displayName": "sub_integration_input",
"inputOutputType": "IN"
}]
}
整合流程範例
下圖為此整合程式碼範例的整合編輯器範例版面配置。
上傳並執行範例整合
如要上傳及執行範例整合,請按照下列步驟操作:
- 將整合範例儲存為系統上的 .json 檔案。
- 前往 Google Cloud 控制台的「Application Integration」頁面。
- 按一下左側導覽選單中的「整合」,開啟「整合」頁面。
- 選取現有的整合,或按一下「建立整合」來建立新的整合。
如果您要建立新的整合功能:
- 在「Create Integration」對話方塊中輸入名稱和說明。
- 選取整合作業的區域。
- 選取要用於整合的服務帳戶。您隨時可以透過整合工具列的 info「整合摘要」窗格,變更或更新整合作業的服務帳戶詳細資料。
- 按一下 [建立]。
這會在整合編輯器中開啟整合。
- 在整合服務編輯器中,按一下 publish「上傳/下載」選單,然後選取「上傳整合服務」。
- 在檔案瀏覽器對話方塊中,選取您在步驟 1 中儲存的檔案,然後按一下「Open」。
系統會使用上傳的檔案建立新的整合版本。
- 在整合服務編輯器中,按一下「測試」。
- 按一下「測試整合」。這會執行整合作業,並在「Test Integration」窗格中顯示執行結果。