餓了么接口——php

最近項目需要對接餓了么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;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,799評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,677評論 25 708
  • 本文轉載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,490評論 0 34
  • 今天妹妹打電話來帶著哭腔說老師建議她報考八大美院,她拒絕后被老師罵,說自己根本考不上,試也不愿去試。媽媽掛了電話后...
    露露Yao閱讀 358評論 1 1
  • 明明每天晚上都是十二點下班的,突然說讓我早點睡和爸爸一起回家。我直覺是出事了,但是又猜測不出。我窩在被子里玩手機,...
    遙遠的話閱讀 306評論 0 0