otago / crm
CRM SilverStripe集成
Requires
- silverstripe/framework: ^4.0 || ^5.0
README
在CRM集成中使用sendBatchRequest
sendBatchRequest
是一个强大的函数,用于与CRM交互,允许您在单个HTTP请求中执行多个操作。此方法对于需要高效地在CRM系统中执行多个CRUD(创建、读取、更新、删除)操作的应用程序特别有用。以下是一些使用sendBatchRequest
的示例、用例和优点。
如何使用sendBatchRequest
要使用sendBatchRequest
,您需要准备一个包含您要执行的操作的数组。数组中的每个操作应指定HTTP方法(POST
、GET
、DELETE
等)、目标URL(相对于CRM基本URL),以及如果适用,数据有效载荷。
示例
use OP\CRM; // Step 1: Define the operations $operations = [ [ 'method' => 'DELETE', 'url' => "/Lead(LeadID=3)", ], [ 'method' => 'POST', 'url' => "/Lead", 'data' => [ "FirstName" => "John", "LastName" => "Doe", "Email" => "john.doe@example.com", "Phone" => "123-456-7890", ], ], ]; // Step 2: Send the batch request $response = CRM::sendBatchRequest($operations); // Step 3: Optionally Handle the Fibre. If you want to check the fibre result, this will cause it to block echo $response;
您可以在sendBatchRequest
在后台执行时处理其他操作
sendBatchRequest
使用Fiber异步执行cURL发送请求。它设置HTTP头,包括Content-Length和带有Bearer令牌的Authorization,并执行cURL会话发送请求。它检查cURL错误和200-299范围之外的HTTP状态码,使用LoggerInterface记录遇到的任何问题。在执行请求并处理错误后,它关闭cURL会话并返回响应。该操作包装在Fiber中,允许它与其他任务并发运行,在返回Fiber对象之前启动Fiber。这种方法通过启用非阻塞I/O操作来提高性能。
何时使用sendBatchRequest
- 批量数据操作:当您需要同时对CRM数据进行多个操作时,例如一次创建、更新或删除多个记录。
- 效率:通过减少对CRM服务器的HTTP请求次数,从而最小化网络延迟并提高应用程序的整体性能。
- 事务性操作:如果您的用例要求将多个操作视为单个事务(即,要么全部成功,要么全部失败)。
sendBatchRequest
为何如此出色
- 性能优化:通过将多个操作捆绑成一个请求,
sendBatchRequest
显著减少了由HTTP请求/响应周期引起的开销。 - 简化错误处理:处理错误变得简单,因为即使执行多个操作,也只需要解析单个响应。
- 增强的可扩展性:频繁与CRM数据交互的应用程序可以更有效地扩展,因为减少的HTTP请求数量降低了客户端和服务器资源的压力。
- 事务完整性:对于支持事务批次的CRM,
sendBatchRequest
可以确保一组操作要么全部成功,要么全部失败,保持数据完整性。
注册您的Azure应用程序以与CRM通信
- 在您的Microsoft 365环境中创建一个用户帐户,用作Web应用程序的令牌生成器(例如 webtoken@your_organisation.onmicrosoft.com)。
- 将用户帐户添加到Dynamics 365,最好具有完全权限。
- 在Microsoft Azure Active Directory中,在应用注册区域创建原生应用程序。
- 在您的本地应用中,转到“所有者”并添加用户账户
- 在您的本地应用中,转到“必需权限”并添加“Dynamics CRM Online”。接着,您需要转到 Dynamics 的授权权限并勾选“以组织用户访问 CRM Online”。
- 在您的本地应用中,转到“密钥”并生成一个新的密钥。请确保将生成的值保存在某个地方以供以后使用。
- 现在您应该已经拥有使用 CRM 模块所需的一切。
如果您将文件存储在 assets 文件夹中,不要忘记使用 .htaccess 来阻止缓存
RedirectMatch 404 ^/assets/jsoncache/.*$
使用环境版本
==================
将应用程序详细信息添加到 .env 文件中
创建一个 .env 文件并添加以下内容
AZUREAPPLICATIONCLIENT="XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX"
AZUREAPPLICATIONSECRET="my secret key that came from azure portal"
AZUREAPPLICATIONENDPOINT="https://login.microsoftonline.com/XXXXXXXXXXXXX/oauth2/token"
AZUREAPPLICATIONRESOURCELOCATION="https://<myorganisationcrmname>.dynamics.com"
==================
使用 Microsoft Dynamics 365 Web API
https://msdn.microsoft.com/en-us/library/mt593051.aspx
==================
示例
将数据发送到 CRM
try { CRM::request( 'https://your_organisation.crm5.dynamics.com/api/data/v8.2/leads', 'POST', array( "subject" => "Website Enquiry", "emailaddress1" => $do->YourEmail, "firstname" => $do->YourName, "jobtitle" => $do->Message ) ); } catch ( Exception $e) { throw new SS_HTTPResponse_Exception('failure to connect to crm: '.$e->getMessage()); }
从 CRM 获取数据 - 只返回姓名和姓氏 - 只返回前 3 页
try { CRM::request( 'https://your_organisation.crm5.dynamics.com/api/data/v8.2/leads?$select=firstname,leadid', 'GET', array(), array('Prefer: odata.maxpagesize=3') ); } catch ( Exception $e) { throw new SS_HTTPResponse_Exception('failure to connect to crm: '.$e->getMessage()); }
通过 ID 更新对象的字段
try { CRM::request( 'https://your_organisation.crm5.dynamics.com/api/data/v8.2/leads(bf830ffd-2047-e711-8105-70106fa91921)', 'PATCH', array( "subject" => "123 Website Enquiry", "email address1" => $do->YourEmail, "firstname" => $do->YourName, "jobtitle" => $do->Message ) ); } catch ( Exception $e) { throw new SS_HTTPResponse_Exception('failure to connect to crm: '.$e->getMessage()); }
通过 ID 更新对象的单个字段
try { CRM::request( 'https://your_organisation.crm5.dynamics.com/api/data/v8.2/leads(bf830ffd-2047-e711-8105-70106fa91921)/subject', 'PUT', array( "value" => "321 Website Enquiry" ) ); } catch ( Exception $e) { throw new SS_HTTPResponse_Exception('failure to connect to crm: '.$e->getMessage()); }
通过 ID 删除对象
try { CRM::request( 'https://your_organisation.crm5.dynamics.com/api/data/v8.2/leads(bf830ffd-2047-e711-8105-70106fa91921)', 'DELETE' ); } catch ( Exception $e) { throw new SS_HTTPResponse_Exception('failure to connect to crm: '.$e->getMessage()); }