最近項目需要對接餓了么http://merchant.openapi.eleme.io/quickstart.html
餓了么居然沒給sdk,只好自己寫了,不開心
1.首先要拿到兩個參數
consumer_key
是對接餓了么開放平臺的基本憑證,它代表的是一個品牌或個人實體。該品牌或個人的所有餐廳會關聯在此key之下。
consumer_secret
eleme分配給APP的consumer_key
2.制作簽名,直接看代碼吧——makeSig2()
3.發送http請求——sendHttp2();
4.制作接口——提供了餐廳接口和訂單接口的例子
5.調接口——這就不用寫出來了吧
商家測試
餓了么提供了以下體驗店信息以供接口開發測試:
consumer_key: 0170804777
consumer_secret: 87217cb263701f90316236c4df00d9352fb1da76
restaurant_id: 62028381
restaurant_name: 餓了么開放平臺測試
餐廳下單測試地址: http://r.ele.me/openapi-test
注意:如遇到 "測試餐廳必須與測試帳號一起使用" 的錯誤提示,請清理cookies
<?php
/**
* 餓了嗎接口,參考文檔http://merchant.openapi.eleme.io/quickstart.html
* Created by sky
* User: SD
* Date: 2016/7/15
* Time: 17:36
*/
class ElemeAPI
{
const BASE_URL = 'http://v2.openapi.ele.me/';
private $consumer_key;
private $consumer_secret;
/**
* 初始化接口類,必須兩個參數,consumer_key,consumer_secret
* ElemeAPI constructor.
* @param $sy_param ['consumer_key'=>'','consumer_secret'=>'']
*/
public function __construct($sy_param)
{
$this->consumer_key = $sy_param['consumer_key'];
$this->consumer_secret=$sy_param['consumer_secret'];
}
####################餐廳接口
/**
* 查詢所屬餐廳
* @return mixed
*/
function getAllRestaurants(){
$api_url='restaurant/own/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
return self::sendHttp2($api_url,'GET',$sys_request);
}
function getRestaurant($restaurant_id){
$api_url = 'restaurant/'.$restaurant_id.'/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
$api_request = array();
$api_request['restaurant_id'] = $restaurant_id;
return $this->sendHttp2($api_url,'GET',$sys_request,$api_request);
}
#################訂單接口
/**
* 獲取訂單詳情
* @param $eleme_order_id 訂單編號
* @param $tp_id 0=不顯示第三方ID,1=顯示第三方ID
* @return mixed
*/
function getOrderDetail($eleme_order_id,$tp_id=null){
$api_url = 'order/'.$eleme_order_id.'/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
$api_request = array();
$api_request['tp_id'] = $tp_id;
return $this->sendHttp2($api_url,'GET',$sys_request,$api_request);
}
/**
* 取消訂單
* @param $eleme_order_id
* @param $reason
* @return mixed
*/
function cancelOrder($eleme_order_id,$reason){
$api_url = 'order/'.$eleme_order_id.'/status/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
$api_request =array();
$api_request['status']=-1;
$api_request['reason'] = $reason;
$res = $this->sendHttp2($api_url,'PUT',$sys_request,$api_request);
return $res;
}
/**
* 確認訂單
* @param $eleme_order_id
* @return mixed
*/
function confirmOrder($eleme_order_id){
$api_url = 'order/'.$eleme_order_id.'/status/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
$api_request =array();
$api_request['status']=2;
return $this->sendHttp2($api_url,'PUT',$sys_request,$api_request);
}
/**
* 同意退單
* @param $eleme_order_id
* @return mixed
*/
function agreeRefund($eleme_order_id){
$api_url = 'order/'.$eleme_order_id.'/agree_refund/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
return $this->sendHttp2($api_url,'POST',$sys_request);
}
/**
* 不同意退單
* @param $eleme_order_id
* @param null $reason
* @return mixed
*/
function disagreeRefund($eleme_order_id,$reason=null){
$api_url = 'order/'.$eleme_order_id.'/disagree_refund/';
$sys_request =['consumer_key'=>$this->consumer_key,'timestamp'=>time()];
$api_request =array();
$api_request['reason']=$reason;
return $this->sendHttp2($api_url,'POST',$sys_request,$api_request);
}
/**
* 計算簽名
* @param $api_url 指定接口url
* @param array $params 參數
* @return string 返回簽名
*
*/
private function makeSig($api_url,$params=[]){
//將所有參數(sig除外)按照參數名的字母順序排序,并用 & 連接:
if(count($params)){
ksort($params);
$str_a = http_build_query($params);
}else{
return false;
}
var_dump($str_a);
//按照請求url + ? + 字符串A + consumer_secret的順序進行連接,得到 字符串B
$str_b = self::BASE_URL.$api_url.'?'.$str_a.$this->consumer_secret;
var_dump($str_b);
//對``字符串B``用UTF-8 Encode之后計算HEX值字符串(用HEX Encode),得到 字符串C:
$str_c =bin2hex(utf8_encode($str_b));
var_dump($str_c);
//對 字符串C 計算SHA1哈希,得到簽名:
$sig = sha1($str_c);
var_dump($sig);
return $sig;
}
/**
* @param $api_url
* @param array $params
* @return string
*/
private function makeSig2($api_url,$params=[]){
ksort($params);
$pairs = array();
foreach($params as $key=>$val) {
array_push($pairs, $key . '=' . urlencode($val));
}
$params = join('&', $pairs);
//var_dump($params);
$str = self::BASE_URL.$api_url.'?'.$params.$this->consumer_secret;
$sig = sha1(bin2hex($str));
//var_dump($sig);
return $sig;
}
/**
* @param $api_url
* @param $method
* @param array $sys_request 系統級參數
* @param array $api_request API級參數 可以為空
* @return mixed
*/
private function sendHttp2($api_url,$method,$sys_request=[],$api_request=null){
if(count($api_request)){
//如果有API級參數
$api_request = array_filter($api_request); //刪除數組中的空值
$params = array_merge($sys_request,$api_request); //API級參數與系統及參數合并得到完整的參數
}else{
$params = $sys_request; //系統級參數就是完整參數
}
$sig = $this->makeSig2($api_url,$params);
$method = strtoupper($method);
if($method=='GET'){
//如果是get方式傳參
$params['sig'] = $sig;
$url = self::BASE_URL.$api_url.'?'.http_build_query($params);
}else{
//如果是其他方式傳參,將系統級參事和簽名sig,加入到url中即可
$sys_request['sig'] = $sig;
$url = self::BASE_URL.$api_url.'?'.http_build_query($sys_request);
}
//var_dump($url);
$ch = curl_init();
$header = array(
"Content-Type:application/x-www-form-urlencoded; charset=UTF-8"
);
// 添加apikey到header
$api_request = count($api_request)>0? http_build_query($api_request) :$api_request;
curl_setopt($ch, CURLOPT_HTTPHEADER , $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_URL , $url);
switch($method){
case 'GET':
curl_setopt($ch,CURLOPT_HTTPGET,true);
break;
case 'POST':
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$api_request);
break;
case 'PUT':
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'PUT');
curl_setopt($ch,CURLOPT_POSTFIELDS,$api_request);
break;
case 'DELETE':
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'DELETE');
curl_setopt($ch,CURLOPT_POSTFIELDS,$api_request);
break;
}
// 執行HTTP請求
$res = curl_exec($ch);
return $res;
}
}