昨天原本要動工介紹 電子發票 ,但突然在 google 廣告看到:lalamove 和 gogovan 的網站介紹,之前在找有哪些機車物流有提供 API 串接時,有注意到 lalamove 在 2017/10 獲得資金後,預計開放API系統串接,沒想到終於看到 lalamove 提供 API 的消息,不過實際到官網上看,目前應該是只有開放給企業客戶使用。
失望之餘順手點開 gogovan ,沒想到竟然有提供 API 測試,不知道之前怎麼會漏掉這間,事不宜遲拿來當插件題目 XD
gogovan 提供網頁、APP、電話叫件,也可以根據不同配送需求,選擇附加服務,標榜所有貨物都能在當日送達。
在台灣目前提供三種配送方式
時效性以機車來說最慢 90 分鐘內會送達,但快速的便利性也反映在運費上。
自司機收取貨件後開始計算:
里程總計金額 | 配送所需時間 |
---|---|
$90-$130 | 30分鐘內 |
$140-$180 | 45分鐘內 |
$190-$230 | 60分鐘內 |
$240-$280 | 90分鐘內 |
提供了五個國家的 API
GoGoVan API documentation - TW
API 功能:
必填項目:
費用試算 API
GET https://gogovan-staging-tw.herokuapp.com/api/v0/orders/price.json
每個國家使用的 API key 都是固定的
台灣的是 b87d2da0-d333-4dbd-b984-b7d05d232fa3
User-Language 可以是 en-US
, zh-TW
, zh-CN
這兩個參數需要放在 header 中
$header = array(
'GoGoVan-API-Key: b87d2da0-d333-4dbd-b984-b7d05d232fa3',
'GoGoVan-User-Language: zh-TW',
);
document curl example
-F 'order[name]=Eddie' \
-F 'order[phone_number]=0912345678' \
-F 'order[pickup_time]=2016-01-30T18:00:00H' \
-F 'order[vehicle]=van' \
-F 'order[locations]=[[25.0552809,121.544679,"台北市松山區興安街174巷6號1樓"],[25.1344639,121.506923,"台北市北投區溫泉路68巷24號1樓"]]'
因為官方範例的 'order'
參數是使用 -F(--form) 傳送,對應到 php curl 的寫法,就要把 'order'
放到 CURLOPT_POSTFIELDS
中,並將 CURLOPT_CUSTOMREQUEST
設為 'GET'
。
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $body );
//full curl setting
$ch = curl_init("https://gogovan-staging-tw.herokuapp.com/api/v0/orders/price.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'form[param1]=A&form[param2]=B');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
第二個要解決的是 'order['locations']'
的參數問題,GOGOVAN 期望收到的格式是
order[locations]=[[25.0552809,121.544679,"台北市松山區XXX"],[25.1344639,121.506923,"台北市北投區YYY"]]
如果直接把 array
用 http_build_query()
轉成 GET 格式
$order['locations'] = array(
array(25.0552809,121.544679, '台北市松山區XXX')
, array(25.1344639,121.5069234, '台北市北投區YYY')
);
$urlQuery = http_build_query($order);
會得到
locations[0][0]=25.0552809&locations[0][1]=121.544679&locations[0][2]=台北市松山區XXX&locations[1][0]=25.1344639&locations[1][1]=121.5069234&locations[1][2]=台北市北投區YYY
所以應該要選擇 json_encode()
來處理 'location'
{"locations":[[25.0552809,121.544679,"\u53f0\u5317\u5e02\u677e\u5c71\u5340XXX"],[25.1344639,121.5069234,"\u53f0\u5317\u5e02\u5317\u6295\u5340YYY"]]}
但由於當 php array key 為 string 時, json_encode()
會轉成 object data type
In JSON; Curly braces hold objects (
{}
), Square brackets hold arrays ([]
).
為了避免出現大括號({}
),我們將參數 'locations'
獨立到另一個 array
$locations = array(
array(25.0552809,121.544679, '台北市松山區XXX')
, array(25.1344639,121.5069234, '台北市北投區YYY')
);
再把參數拆成兩部分組成 url query,就可以順利得到完整 response 了
$urlQuery = http_build_query($postData).'&order[locations]='.json_encode($locations);
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlQuery);