๋ฌด๋ฃŒ CRM API

๋ฌด๋ฃŒ CRM API

์•ฝ 14๋…„ ์ „์— ์šฐ๋ฆฌ๋Š” ๋ฌด๋ฃŒ PBX์™€ ํ†ตํ•ฉ๋œ ๋ฌด๋ฃŒ CRM ์‹œ์Šคํ…œ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ 000๊ฐœ ๊ธฐ์—…๊ณผ 64๋ช…์˜ ์ง์›์ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ์šฐ๋ฆฌ๋Š” ZCRM์˜ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐฉํ˜• API ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํŒ๋งค ์ฑ„๋„์—์„œ CRM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜์—์„œ๋Š” API ์ž‘์—…๊ณผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์œ ์šฉํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š” ์˜ˆ์ œ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์ดํŠธ์˜ ์–‘์‹์—์„œ ์ž ์žฌ ๊ณ ๊ฐ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

๋ฌด๋ฃŒ CRM์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…

CRM์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ž์ œํ•˜์ž. ๋ฌด๋ฃŒ CRM Zadarma๋Š” ๋ชจ๋“  ํ‘œ์ค€ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ณด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ํ”ผ๋“œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ณ ๊ฐ์— ๋Œ€ํ•œ ์ •๋ณด ์™ธ์—๋„ ๋ชจ๋“  ์ทจํ–ฅ(๋‹ฌ๋ ฅ, ์นธ๋ฐ˜, ๋ชฉ๋ก)์— ๋Œ€ํ•œ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ์ž‘์—… ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ 50๋ช… ์ด์ƒ์˜ ์ง์›์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ „ํ™” ํ†ต์‹ ๊ณผ ์™„์ „ํžˆ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค(WebRTC ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํ˜ธ์ถœ ํฌํ•จ).
๋ฌด๋ฃŒ CRM API
๋ฌด๋ฃŒ์€ ๋ฌด์Šจ ๋œป์ธ๊ฐ€์š”? ์ง€๋ถˆํ•ด์•ผ ํ•˜๋Š” ZCRM ์š”๊ธˆ์ด๋‚˜ ์„œ๋น„์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ง€๋ถˆํ•ด์•ผ ํ•  ์œ ์ผํ•œ ๊ฒƒ์€ ์ „ํ™” ํ†ตํ™” ๋ฐ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค (์˜ˆ๋ฅผ ๋“ค์–ด ํŠน๋ณ„ ๊ด€์„ธ์— ๋”ฐ๋ผ ๋ชจ์Šคํฌ๋ฐ” ๋ฒˆํ˜ธ์˜ ์›” ์š”๊ธˆ์€ 95 ๋ฃจ๋ธ” ๋˜๋Š” ๋Ÿฐ๋˜์€ 1 ์œ ๋กœ์ž…๋‹ˆ๋‹ค). ์ „ํ™”๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค๋ฉด? ์ง€๋ถˆํ•  ํ•„์š”๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.
๋ฌด๋ฃŒ PBX Zadarma๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š” ๋™์•ˆ ๋ฌด๋ฃŒ CRM์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๋“ฑ๋ก ํ›„ PBX๋Š” 2์ฃผ ๋™์•ˆ ํ™œ์„ฑํ™”๋˜๋ฉฐ ์•ž์œผ๋กœ 1๊ฐœ์›”์— ํ•œ ๋ฒˆ ๊ณ„์ •์„ ๋ณด์ถฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CRM๊ณผ PBX๊ฐ€ ํ•„์š”ํ•œ ์‚ฌ๋ฌด์‹ค์„ ์ƒ์ƒํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ๋ฒˆํ˜ธ๋‚˜ ์ „ํ™”๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌด๋ฃŒ CRM์— API๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

ZCRM์˜ ๋ฐœ์ „์€ ํ•œ์‹œ๋„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ํฌ๊ณ  ์ž‘์€ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํ•œ ์Šค๋งˆํŠธ ๋…ธํŠธ๋ถ์ด ์•„๋‹Œ ์ง„์ •์œผ๋กœ ๊ธฐ๋Šฅ์ ์ธ ์‹œ์Šคํ…œ์„ ์ œ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „ํ™” ํ†ตํ•ฉ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํด๋ผ์ด์–ธํŠธ์™€์˜ ์ ‘์ด‰์ด ๋งŽ์„์ˆ˜๋ก ๋” ์ข‹์œผ๋ฉฐ ์ ‘์ด‰์€ ๋งค์šฐ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ๋•๋ถ„์— ํด๋ผ์ด์–ธํŠธ/๋ฆฌ๋“œ ๋ฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฌธ์ œ ์—†์ด ์ž๋™์œผ๋กœ ์ž…๋ ฅ(๋˜๋Š” ๋ฐ˜๋Œ€๋กœ ์ˆ˜์‹ )ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ๊ณ ๊ฐ ๋ฐ ๊ธฐํƒ€ ์ž๋™ํ™” ์‹œ์Šคํ…œ๊ณผ์˜ ๋ชจ๋“  ํ†ต์‹  ์ฑ„๋„์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
API ๋•๋ถ„์— ๋ฌด๋ฃŒ ZCRM์„ ์ „์ฒด ๋˜๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์—… ๊ณ ๊ฐ ๊ธฐ๋ฐ˜๊ณผ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์‚ฌ์ดํŠธ์˜ CRM ๋ฆฌ๋“œ ์–‘์‹์— ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ„๋„์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์‚ฌ์ดํŠธ์—์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ์ž‘์—…(์ง€์—ฐ๋œ ํ˜ธ์ถœ)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ZCRM API ๋ฐฉ๋ฒ•

ZCRM API์—๋Š” 37๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋‘ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ  ์ฃผ์š” ๊ทธ๋ฃน๋งŒ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋œ ์ „์ฒด ๋ชฉ๋ก์€ ๋‹ค์Œ ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CRM API์— ๋Œ€ํ•œ ์„ค๋ช….

๋‹ค์Œ ๋ฐฉ๋ฒ• ๊ทธ๋ฃน์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ(์ผ๋ฐ˜ ๋ชฉ๋ก, ๊ฐœ๋ณ„ ์„ ํƒ, ํŽธ์ง‘, ์‚ญ์ œ)
  • ํด๋ผ์ด์–ธํŠธ์˜ ํƒœ๊ทธ ๋ฐ ์ถ”๊ฐ€ ์†์„ฑ
  • ๊ณ ๊ฐ ํ”ผ๋“œ(๊ณ ๊ฐ ํ”ผ๋“œ ํ•ญ๋ชฉ ๋ณด๊ธฐ, ํŽธ์ง‘, ์‚ญ์ œ)
  • ํด๋ผ์ด์–ธํŠธ์˜ ์ง์›(ํด๋ผ์ด์–ธํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ•์ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ๋งŽ์€ ์ง์›์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ)
  • ์ž‘์—…(์ž‘์—… ์ž‘์—…์„ ์œ„ํ•œ ๋ชจ๋“  ๊ธฐ๋Šฅ)
  • ๋ฆฌ๋“œ(์œ ์‚ฌํ•˜๊ฒŒ ๋ชจ๋“  ๊ธฐ๋Šฅ)
  • CRM ์‚ฌ์šฉ์ž(์‚ฌ์šฉ์ž, ๊ถŒํ•œ, ์„ค์ •, ์—ฐ๋ฝ์ฒ˜ ๋ฐ ๊ทผ๋ฌด ์‹œ๊ฐ„ ๋ชฉ๋ก ํ‘œ์‹œ)
  • ํ†ตํ™”(ํ†ตํ™” ๋ชฉ๋ก ๋ฐ˜ํ™˜)

๊ธฐ์กด Zadarma API ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ PHP, C#, Python์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ด๋ฏธ Github์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API ์‚ฌ์šฉ ์˜ˆ

๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ€์žฅ ์œ ์šฉํ•œ ์˜ˆ๋Š” ์–‘์‹์—์„œ ์ž ์žฌ ๊ณ ๊ฐ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์˜ˆ์ œ์—๋Š” ๊ธฐ๋ณธ ๋ฆฌ๋“œ ๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ์˜ˆ์ด์ง€๋งŒ ๊ณ ๊ฐ์˜ ์˜๊ฒฌ(์ผ๋ฐ˜์ ์œผ๋กœ ๋ชจ๋“  ํ˜•์‹์— ์žˆ์Œ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธ”๋กœ๊ทธ์—์„œ ์˜จ๋ผ์ธ. ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์ œ๋Š” PHP ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‰ฝ๊ฒŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
๋ฆฌ๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ html ์–‘์‹์˜ ์˜ˆ:

<form method="POST" action="/ko/zcrm_leads">
   <label for="name">Name:</label>
   <br>
   <input type="text" id="name" name="name" value="">
   <br>
   <label for="phone">Phone:</label><br>
   <input type="text" id="phone" name="phones[0][phone]" value="">
   <br>
   <label for="phone">Email:</label><br>
   <input type="text" id="email" name="contacts[0][value]" value="">
   <br>
   <br>
   <input type="submit" value="Submit">
</form>

์ด ์–‘์‹์€ ๊ธฐ์‚ฌ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ์ง€ ์•Š๋„๋ก ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋””์ž์ธ๋„, ์บก์ฐจ๋„, ๋Œ“๊ธ€ ํ•„๋“œ๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๋ฒ„์ „์€ ๋ธ”๋กœ๊ทธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฆฌ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ํด๋ผ์ด์–ธํŠธ ํ”ผ๋“œ์— ๋Œ“๊ธ€์ด ์ถ”๊ฐ€๋จ).

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์–‘์‹์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ฆฌ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ PHP ์˜ˆ์ œ:

<?php
$postData = $_POST;
if ($postData) {
   if (isset($postData['phones'], $postData['phones'][0], $postData['phones'][0]['phone'])) {
       $postData['phones'][0]['type'] = 'work';
   }
   if (isset($postData['contacts'], $postData['contacts'][0], $postData['contacts'][0]['value'])) {
       $postData['contacts'][0]['type'] = 'email_work';
   }
   $params = ['lead' => $postData];
   $params['lead']['lead_source'] = 'form';

   $leadData = makePostRequest('/v1/zcrm/leads', $params);
   var_dump($leadData);
}
exit();

function makePostRequest($method, $params)
{
   // ะทะฐะผะตะฝะธั‚ะต userKey ะธ secret ะฝะฐ ะฒะฐัˆะธ ะธะท ะปะธั‡ะฝะพะณะพ ะบะฐะฑะธะฝะตั‚ะฐ
   $userKey = '';
   $secret = '';
   $apiUrl = 'https://api.zadarma.com';

   ksort($params);

   $paramsStr = makeParamsStr($params);
   $sign = makeSign($paramsStr, $method, $secret);

   $curl = curl_init();
   curl_setopt($curl, CURLOPT_URL, $apiUrl . $method);
   curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
   curl_setopt($curl, CURLOPT_POST, true);
   curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
   curl_setopt($curl, CURLOPT_POSTFIELDS, $paramsStr);
   curl_setopt($curl, CURLOPT_HTTPHEADER, [
       'Authorization: ' . $userKey . ':' . $sign
   ]);

   $response = curl_exec($curl);
   $error = curl_error($curl);

   curl_close($curl);

   if ($error) {
       return null;
   } else {
       return json_decode($response, true);
   }
}

/**
* @param array $params
* @return string
*/
function makeParamsStr($params)
{
   return http_build_query($params, null, '&', PHP_QUERY_RFC1738);
}

/**
* @param string $paramsStr
* @param string $method
* @param string $secret
*
* @return string
*/
function makeSign($paramsStr, $method, $secret)
{
   return base64_encode(
       hash_hmac(
           'sha1',
           $method . $paramsStr . md5($paramsStr),
           $secret
       )
   );
}

๋ณด์‹œ๋‹ค์‹œํ”ผ API๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. PHP, C#, Python. ๋”ฐ๋ผ์„œ ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ๊ฐ„๋‹จํ•œ ๋ฌด๋ฃŒ CRM์„ ๋ชจ๋“  ์ž‘์—… ํ๋ฆ„์— ๋งž์ถœ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ ์€ ํ”ผ๋กœ ์ž๋™ํ™”๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ZCRM์€ ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฑฐ์˜ โ€‹โ€‹๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ API๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ธฐ์กด ์‹œ์Šคํ…œ ์‹œ์Šคํ…œ์„ ๋ฌด๋ฃŒ CRM ๋ฐ PBX Zadarma์™€ ํ†ตํ•ฉํ•˜๋„๋ก ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€