drillcoder/amocrm_wrap

AmoCRM API 简单交互包装

7.0.5 2019-03-03 16:31 UTC

This package is auto-updated.

Last update: 2024-09-29 05:08:17 UTC


README

Build Status Latest Stable Version Total Downloads License

连接

在使用包装器之前,需要连接 'autoload.php' 自动加载类文件。文件的路径可能与下面的示例不同。或者,您可以将此组件包含在自己的自动加载器中。

<?php require_once 'AmoCRM_Wrap/autoload.php'; ?>

使用

首先需要授权。为此,需要创建一个 AmoCRM 类的实例,并将以下内容传递给构造函数

  1. CRM 子域名
  2. 用户名(邮箱)
  3. 用户 API 密钥。您可以在 CRM 界面中找到它 https://test.amocrm.ru/settings/profile/
  • 'test' 需要替换为您自己的子域名

由于包装器中预定义了异常(Exception),它们在发生各种错误时会被触发,因此需要捕获它们,即应将包装器的工作代码放在 try catch 块中。

授权示例

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', 'test@test.ru', '011c2d7f862c688286b43ef552fb17f4');
    // ...
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage());
}
?>

功能

  • 创建完整的 CRM 备份,即使套餐中不提供此选项
  • 按电话或电子邮件搜索联系人。该方法可用于查找重复项
  • 在联系人、公司、交易、备注和任务中按任意查询搜索
  • 以不同的筛选条件获取任何实体的列表
  • 创建、修改和删除联系人、交易、公司、备注和任务
  • 将文件、备注和任务附加到联系人、交易和公司
  • 方便地处理附加字段,无需了解其 ID
  • 按名称或名称的一部分指定 CRM 中的负责人 ID
  • 对于所有请求,返回的不是包含大量数据的巨大数组,而是便于操作的对象(Contact、Lead 等)

未来计划

  • 部署备份的能力
  • 添加对新实体(如买家等)的支持
  • 向用户字段值添加验证

感谢

  • Владислав Алаторцев — 因其在附件文件和删除实体方面的独特方法以及在没有存储 cookie 文件的能力下进行工作
  • Роман Маслеников — 因其查找和修复错误

主要类方法描述

AmoCRM 类

  • AmoCRM::VERSION — 包装器的当前版本
  • AmoCRM::getPhoneFieldId() — 返回实体“联系人”的电话字段 ID
  • AmoCRM::getEmailFieldId() — 返回实体“联系人”的电子邮件字段 ID
  • AmoCRM::getUsers() — 返回 CRM 中的用户数组
  • AmoCRM::getTaskTypes() — 返回任务类型的数组
  • AmoCRM::getPipelinesName() — 返回 CRM 中的漏斗数组
  • AmoCRM::getStatusesName($pipelineId) — 返回指定漏斗中的状态数组(需要漏斗 ID)
  • AmoCRM::getCustomFields($type) — 返回指定实体类型的用户字段数组。可能的类型:contact、lead、company
  • AmoCRM::getCustomFieldsEnums($type) — 返回指定实体类型的用户字段枚举数组
  • searchContactsByPhoneAndEmail($phone, $email) — 按电话和电子邮件搜索联系人。电话以 7 或 8 开头被视为不同的电话。返回包含联系人 ID 的对象 Contact 数组

分别按联系人、公司、交易、任务和备注搜索所有实体

  • searchContacts/searchCompanies/searchLeads/searchTasks
  • getContactNotes/getCompanyNotes/getLeadNotes/getTaskNotes ($query = null, $limit = 0,$offset = 0, $responsibleUsersIdOrName = array(), DateTime $modifiedSince = null, $isRaw = false) — 根据指定的实体进行搜索。所有字段都不必填写。如果没有填写任何内容,将返回所有实体的完整列表。$query - 查询文本。$limit - 响应中的实体数量。0 = 无限制 $offset - 从开始处跳过的实体数量 $responsibleUsersIdOrName - 负责用户(名称或ID)。如果有多个,则在数组中 $modifiedSince - 修改后的日期和时间,由DateTime对象指定 $isRaw - 标志以“原始”数据形式获取。与常规API查询相同的方式作为数组

注意!!!所有列表都按最早更改顺序排序。无法更改排序顺序 = (=

  • backup($directory) — 在$directory目录中创建整个CRM的完整备份。可能存在内存限制问题

抽象类BaseEntity

所有其他主要类都基于此类。可以将其中的所有方法用于其他类。

  • __construct($id = null) — 创建类实例时调用的方法。可以传递所需实体的ID,然后将从CRM加载数据。如果不传递ID,则将创建一个空对象
  • getRaw() — 根据实体获取原始数据
  • save() — 将当前实体保存到CRM
  • delete() — 在CRM中删除当前实体
  • getId() — 返回实体ID
  • getName() — 返回实体名称
  • setName($name) — 将名称更改为$name
  • getResponsibleUserId() — 返回负责实体的ID
  • getResponsibleUserName() — 返回负责实体的名称
  • setResponsibleUser($responsibleUserIdOrName) — 设置负责实体。接受负责人的ID或其名称(在所有CRM经理的名称中搜索此字符串)
  • getDateCreate() — 返回包含创建实体日期和时间的DateTime对象
  • getDateUpdate() — 返回包含上次更改实体日期和时间的DateTime对象
  • getUserIdUpdate() — 返回最后更改实体的用户的ID
  • getUserNameUpdate() — 返回最后更改实体的用户的名称
  • getCreatedUserId() — 返回创建实体的用户的ID
  • getCreatedUserName() — 返回创建实体的用户的名称
  • getLeadsId() — 返回附加交易的ID数组
  • getLeads() — 返回附加交易的Lead对象数组
  • addLead($lead) — 将交易附加到实体
  • delLead($lead) — 从实体中移除交易
  • getContactsId() — 返回附加联系人ID的数组
  • getContacts() — 返回附加联系人的Contact对象数组
  • addContactId($contact) — 将联系人附加到实体
  • delContactId($contact) — 从实体中移除联系人
  • getCompanyId() — 返回与实体关联的公司ID
  • getCompany() — 返回与实体关联的Company对象
  • setCompany($company) — 设置与实体关联的公司
  • getTags() — 返回关联数组标签id => name
  • addTag($tag) — 向实体添加标签
  • delTag($tag) — 从实体中删除标签
  • getPhones() — 返回编号电话数组
  • addPhone($phone, $enum = CustomField::PHONE_OTHER) — 向实体添加电话,不必要参数电话类型,默认为“其他”。检查实体中是否已存在此类电话,并避免添加重复项。可能的电话类型选项位于常量CustomField::PHONE__中
  • delPhone($phone) — 从实体中删除电话。不考虑电话格式。考虑电话是否以7或8开头
  • getEmails() — 返回有序的电子邮件数组
  • addEmails($email, $enum = CustomField::EMAIL_OTHER) — 将电子邮件添加到实体中,不必要指定电子邮件类型,默认为“其他”。检查是否存在相同的电子邮件地址,如果不添加重复项。可能的电子邮件类型选项位于常量CustomField::Email_中。
  • delEmail($email) — 从实体中删除电子邮件
  • addCustomField($name, $type = CustomField::TYPE_TEXT, $enums = array()) — 在当前实体类型中创建自定义字段,名称为$name,类型为$type,如果需要,则选项为$enums。返回创建的字段id。字段类型存储在CustomField::TYPE_中。
  • delCustomField($nameOrId) — 从当前实体类型中删除自定义字段,接受字段id或名称
  • getCustomFieldValueInStr($nameOrId) — 以字符串形式返回自定义字段的值。接受其名称或id。值分隔符为分号(;)
  • getCustomFieldValueInArray($nameOrId) — 以数组形式返回自定义字段的值。接受其名称或id
  • setCustomFieldValue($customFieldNameOrId, $value, $subtype = null) — 设置自定义字段的值。第一个参数可以是字段id,也可以是CRM中的字段名称。如果不传递值($value)或将其设置为空,则在保存到CRM时,该字段也将被清除。多选字段类型的值以数组形式输入。对于地址类型,还需要$subtype,这些类型存储在Value::SUBTYPE_中。
  • addNote($text) — 为当前实体添加备注
  • addNoteSystem($text, $serviceName) — 为当前实体添加系统(不可删除)备注
  • addNoteSmsOut($text, $phone) — 为当前实体添加类型为“已发出短信”的备注(电话号码为$phone)
  • addNoteSmsIn($text, $phone) — 为当前实体添加类型为“接收短信”的备注(来自电话号码$phone)
  • addTask($text, $responsibleUserIdOrName = null, DateTime $completeTill = null, $typeId = 3) — 为当前实体添加任务。$text - 任务文本。$responsibleUserIdOrName(可选)- 负责人,接受id或名称,如果没有设置,则负责人与当前实体相同。$completeTill(可选)- 日期和时间,以DateTime对象的形式,表示完成任务的时间,如果没有指定,则时间设置为当前时间。$typeId(可选)- 任务类型,请参阅CRM中的选项,如果未设置,则默认为3 - 信件。
  • addFile($pathToFile) — 将文件附加到实体(交易、联系人或公司)。$pathToFile - 文件路径

联系人类和公司类

所有基本方法

Lead类

  • getSale() — 返回预算
  • setSale($sale) — 设置预算
  • getPipelineId() — 返回管道id
  • getPipelineName() — 返回管道名称
  • getStatusId() — 返回状态id
  • getStatusName() — 返回状态名称
  • setPipeline($idOrNamePipeline) — 设置管道。接受id或名称
  • setStatus($idOrNameStatus, $idOrNamePipeline = null) — 在管道$idOrNamePipeline中设置状态,如果未指定,则使用当前管道。接受CRM中的id或名称,包括管道和状态
  • getMainContactId() — 返回主要联系人的id
  • getMainContact() — 返回主要联系人的Contact对象
  • setMainContact($contact) — 设置主要联系人
  • isClosed() — 如果交易已关闭则返回true,否则返回false

备注和任务类

  • getElementId() — 返回将要关联的实体id
  • setElementId($elementId) — 设置将要关联的实体id
  • getElementType() — 返回将要关联的实体类型

可能的值:1 - 联系人,2 - 交易,3 - 公司,4 - 任务结果

  • setElementType($elementType) — 设置将要关联的实体类型。选项与上面相同
  • getType() — 返回任务或备注的类型
  • setType($type) — 设置任务或笔记的类型。选项请参考CRM。
  • getText() — 返回任务或笔记的文本。
  • setText($text) — 设置任务或笔记的文本。

未排序类

  • new Unsorted($formName, $lead, $contacts, $pipelineIdOrName = null, $companies = array()) — 创建对象 $formName - 在CRM界面中显示的表单名称。$lead - 创建并绑定到“未处理”状态下的交易。$contacts - 在“未处理”状态下创建并绑定到交易的对象 Contact 数组。$pipelineIdOrName - 创建申请的漏斗,可选参数。$companies - 可选参数,创建并绑定到交易的对象 Company 数组。
  • addNote($text) — 为交易添加文本注释。需要在保存前使用。
  • save() — 在CRM中保存“未处理”。

辅助类 Config、CustomField、Value、Note 和 Task

作为辅助类创建,因此不会对其进行详细描述。

示例

在CRM中搜索、修改和保存联系人。

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', 'test@test.ru', '011c2d7f862c688286b43ef552fb17f4');
    $contacts =  $amo->searchContactsByPhoneAndEmail('79998887766', 'test@test.ru'); //Ищем контакт по телефону и почте
    $contact = current($contacts); //Берём первый найденый контакт
    $contact->setName("{$contact->getName()} лучший") //Меняем имя дописывая в текущее строчку
            ->addPhone('78889998887766', 'MOB') //Добавляем мобильный телефон
            ->addEmail('test2@test.ru', 'WORK') //Добавляем рабочую почту
            ->delEmail('test@test.ru') //Удаляем почту
            ->setResponsibleUser('Пётр Иванович') //Меняем ответственного
            ->save() //Сохраняем все изменение на сервере црм
            ->addTask('Позвонить клиенту', 'Саша'); //Прикрепляем задачку, и назначаем ответственным за неё Сашу
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage()); //Прерывем работу скрипта и выводим текст ошибки
}
?>

在“未处理”状态下创建带有注释和两个关联联系人的交易,在“第二次销售”漏斗中。

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', 'test@test.ru', '011c2d7f862c688286b43ef552fb17f4');
    $contact = new \DrillCoder\AmoCRM_Wrap\Contact();
    $contact->setName('Петя')
            ->addPhone(79998887766); //Создаём контакт, который будет создан в црм после принятия заявки в неразобранном
    $contact2 = new \DrillCoder\AmoCRM_Wrap\Contact();
    $contact2->setName('Ваня')
             ->addPhone(79998887755); //Создаём второй контакт
    $lead = new \DrillCoder\AmoCRM_Wrap\Lead();
    $lead->setName('Тестовая сделка')
         ->setSale(2500); //Создаём сделку, которая будет создана в црм после принятия заявки в неразобранном
    $unsorted = new \DrillCoder\AmoCRM_Wrap\Unsorted('Супер-Форма', $lead, array($contact, $contact2), 'Вторые продажи');
    $unsorted->addNote('Клиент сложный')
             ->save(); // Сохраняем всё в неразобранное в црм
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage()); //Прерывем работу скрипта и выводим текст ошибки
}
?>

实现 Rostat 和 AmoCRM 集成的标准逻辑。

此外,还有一个小的功能,用于补充联系人数据。

<?php
//Тестовые данные
$form = 'Заказать звонок';
$name = 'Тест';
$phone = '+7(999)888-77-66';
$email = 'testik@test.ru';
$responsibleUserId = 'Александр';
$comment = 'Срочно перезвонить!';

try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', 'test@test.com', '8a66666666b3494179da07abc74bfd49');
    $lead = new \DrillCoder\AmoCRM_Wrap\Lead();
    $lead->setName("Заявка с формы '$form'")
         ->setCustomFieldValue('roistat', isset($_COOKIE['roistat_visit']) ? $_COOKIE['roistat_visit'] : null)
         ->setCustomFieldValue('roistat-marker', isset($_COOKIE['roistat_marker']) ? $_COOKIE['roistat_marker'] : 'Прямой визит')
         ->setCustomFieldValue('Форма захвата', $form)
         ->setCustomFieldValue('utm_source', $_COOKIE['utm_source'])
         ->setCustomFieldValue('utm_medium', $_COOKIE['utm_medium'])
         ->setCustomFieldValue('utm_campaign', $_COOKIE['utm_campaign'])
         ->setCustomFieldValue('utm_term', $_COOKIE['utm_term'])
         ->setCustomFieldValue('utm_content', $_COOKIE['utm_content'])
         ->setResponsibleUser($responsibleUserId)
         ->save()
         ->addNote($comment);
    $contacts = $amo->searchContactsByPhoneAndEmail($phone, $email);
    if (!empty($contacts)) {
        $contact = current($contacts);
    } else {
        $contact = new \DrillCoder\AmoCRM_Wrap\Contact();
        $contact->setName($name);
    }
    $contact->addPhone($phone)
            ->addEmail($email)
            ->addLead($lead)
            ->save();
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    echo $e->getMessage();
}?>