直接放干貨吧,今日頭條飛魚CRM的PHP調用方法,點我跳轉。
很簡單的兩個方法,加密時重要的是有一個空格,必須要有,這個也是坑了我很長時間的一個坑。
接下來具體說一下飛魚CRM系統接口加密的方法。
<?php // 今日頭條飛魚CRM系統API域名 $host = 'https://feiyu.oceanengine.com'; // 拉取數據的路由 $pull_route = '/crm/v2/openapi/pull-clues/'; // 飛魚CRM系統中,你生成的秘鑰字符串,這里要替換成你自己的key $signature_key = 'ABCDEFGHIGKLMNOP'; // 飛魚CRM系統中,你生成的Token字符串,這里要替換成你自己的Token $token = '01234567890123abcdefghijklmnopqrstuvwxyz'; // 飛魚的加密參數還有三個:start_time、end_time、timestamp,這三個字段都是時間戳格式 // 拉取的數據從哪一天開始取數據,開始日期,例如從 2019-08-01 開始取數據 $start_time = strtotime('2019-08-01'); // 拉取的數據到哪一天截止停止取數據,結束日期,例如到 2019-09-01 停止取數據 $end_time = strtotime('2019-09-01'); // 時間戳,當前執行加密方法的時間 $timestamp = time(); // 飛魚CRM擔心數據量太大會掛掉,所以要求進行分頁獲取數據,這個是第幾頁 $page = 1; // 每頁數據要多少條,例如我設置每頁獲取10條數據 $page_size = 10; // 以上必須得參數都提供完整無誤后,就可以進行數據加密了 // 第一步,將拉取數據的路由和開始日期和結束日期和時間戳進行拼接,結果類似這樣:"/crm/v2/openapi/pull-clues/?start_time=1569859200&end_time=1572537600 1572574424" // 注意:這一步有一個空格,一定要保留,否則簽名會失敗的!!! // 注意:這一步有一個空格,一定要保留,否則簽名會失敗的!!! // 注意:這一步有一個空格,一定要保留,否則簽名會失敗的!!! $data = $pull_route.'?start_time='.$start_time.'&end_time='.$end_time.' '.$timestamp; // 第二步,將第一步拼接后的字符串進行哈希256加密,然后將結果再進行base64加密 $signature = base64_encode(hash_hmac('sha256', $data, $signature_key)); // 第三步,配置curl信息,然后獲取數據,請求地址類似這樣:"https://feiyu.oceanengine.com/crm/v2/openapi/pull-clues/?page=1&page_size=10&start_time=1569859200&end_time=1572537600" $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host.$pull_route.'?page='.$page.'&page_size='.$page_size.'&start_time='.$start_time.'&end_time='.$end_time); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 設置超時時間 curl_setopt($ch, CURLOPT_TIMEOUT, 5); // 設置請求頭信息,每個頭信息的冒號后面要保留一個空格 curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json;charset=UTF-8', 'Signature: ' . $signature, 'Timestamp: ' . $timestamp, 'Access-Token: ' . $token, ]); // 執行curl獲取數據 $output = curl_exec($ch); // 關閉資源 curl_close($ch); // 如果不出意外,那么這里你就可以獲取到飛魚CRM系統中的客戶信息了 print_r($output);
以上就是加密過程的分析,總結一下關鍵點:
1. 加密的原始數據是:不帶host地址的路由+start_time+end_time+空格+timestamp 。其中“空格”很重要!
2. 拉取數據和回傳數據是兩個路由地址,要區分清楚。
3. 拉取數據是GET請求,回傳數據是POST請求,記得改請求方式。
接下來是使用 FeiYu 加密類的教程,這個類文件可以在 飛魚CRM 中獲取到。
<?php // 引入FeiYu.php 類文件 require_once './FeiYu.php'; use FeiYuCRM\FeiYu; // 實例化 FeiYu 類並傳入初始化參數 $feiyu = new FeiYu([ 'host' => 'https://feiyu.oceanengine.com', 'pull_route' => '/crm/v2/openapi/pull-clues/', 'push_route' => '/crm/v2/openapi/clue/callback/', 'signature_key' => 'ABCDEFGHIGKLMNOP', 'token' => '01234567890123abcdefghijklmnopqrstuvwxyz', ]); // 拉取數據方法,傳入開始日期和結束日期,第三個參數是每頁數據條數 $feiyu->pullData('2019-08-01', '2019-09-01', 100)->run(function($customers){ // 這里是一個閉包,會在取完一整頁的數據后執行 foreach ($customers as $customer) { // run yourself function print_r($customer); die; } }); // 回傳數據方法 $res = $feiyu->pushData([ // 客戶id,這個id在上面的拉取數據中,飛魚CRM會給你的,每個客戶的 clud_id 是唯一的 'clue_id' => '1234567891234567891', // 這個參數根據飛魚CRM的文檔有四個狀態可選:[1:無效]、[2:潛在客戶]、[3:高價值客戶]、[4:已付費] 'clue_convert_state' => 3, ]);
順帶說明一下,有朋友聯系我,想知道飛魚的接口返回 -2 是什么意思。這個其實沒有任何意思,只要是你的接口請求錯誤,他們統一都是返回 -2 代碼,並且,僅有以下幾種狀況才會有 `msg` 說明:
- 簽名過程有錯誤,或者是請求時的地址拼接錯誤(如沒有拼接上 `start_time` 或者 `end_time` 參數)
Array ( [status] => -2 [msg] => 無效的簽名 )
- 請求頭信息沒有設置 `Signature: ` 參數、或者 `Signature: ` 值設置錯誤
Array ( [status] => -2 [msg] => 請在header中添加簽名 )
- 請求頭信息沒有設置 `Timestamp: ` 參數、或者 `Timestamp: ` 值設置錯誤
Array ( [status] => -2 [msg] => 請在header中添加時間戳 )
- 請求頭信息沒有設置 `Access-Token: ` 參數、或者 `Access-Token: ` 值設置錯誤,等一些其他原因,只有 -2 一個狀態碼,沒有錯誤說明。
Array ( [status] => -2 [msg] => Array ( ) )
除了以上的錯誤消息,基本上就沒見過別的了。
如果有問題可以在評論中追問。