饿了么接口——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阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,046评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,470评论 25 707
  • 本文转载自http://dataunion.org/?p=9307 背景介绍Kafka简介Kafka是一种分布式的...
    Bottle丶Fish阅读 5,340评论 0 34
  • 今天妹妹打电话来带着哭腔说老师建议她报考八大美院,她拒绝后被老师骂,说自己根本考不上,试也不愿去试。妈妈挂了电话后...
    露露Yao阅读 343评论 1 1
  • 明明每天晚上都是十二点下班的,突然说让我早点睡和爸爸一起回家。我直觉是出事了,但是又猜测不出。我窝在被子里玩手机,...
    遥远的话阅读 289评论 0 0