接入饿了么开放平台
注册开发者账号
这个其实没什么好多说的,附上网址去注册就好了 https://open.shop.ele.me/
申请认证
和上面差不多,填写一些资料<br />https://open.shop.ele.me/openapi/certification-detail/create 如果资料没有问题,一般就两个工作日就通过了,在个人中心就可以看到结果
申请应用
接下来就是申请应用了,在这里我选择了企业应用,就是我这个应用是要给多个商家接入,而不是我自己只接入一个商家 关于应用的说明这里有 https://open.shop.ele.me/openapi/documents/sj001
选上你所需要的接口,我这里选的比较少,看你的业务需求
沙盒配置
大概配置就好像下图所示了
回调URL
就是有一些在饿了么那边发生了一些状态变化,例如订单被取消,有人下单等等情况,要让你的应用指导,就必须来发起一个情况,就是发送到这个URL
推送URL
这里因为对于我的项目来说是必须的,所以在这里我就必须配置,而且,在配置的时候它会发送一个请求到你填写的连接来检测,所以这个url是有几个要求的
- 需是https 这个是比较麻烦
- 必须返回一个成功的信息,为了这里通过,建议先直接返回一个json用于验证
echo json_encode(['message'=>'ok']);
推送消息
可以选中你所需的类型,我这里就选了一些订单状态变化的
KEY和Secret
这个就不用多说了,你所有的请求接收等等都需要配置这个的
测试店铺相关
这里提供了一个测试店铺,还是挺友好的
店铺授权
上面的信息如果填写得没有问题,接下来就要开始做店铺授权,这个授权大概意思就是,这个店铺允许给你用某些数据,授权模式使用的是Auth2.0,先放个连接 https://open.shop.ele.me/openapi/documents/oauth 说得十分的复杂,不建议直接自己来接,而是使用它提供的sdk https://open.shop.ele.me/openapi/documents/sdk,我这里用的是php,所以直接composer安装到你的项目里面
composer require eleme-openapi/eleme-openapi-sdk
生成授权连接
其实这种授权方式大概逻辑就是通过在你系统里面的一个商家唯一信息+饿了么提供的信息+回调URL来生成一个连接,这个连接去到饿了么那边去,然后商家在那边输入了账号密码登录成功以后,就会在饿了么那边绑定上了,然后再通过回调的URL携带之前那个商家的唯一信息和一个CODE(用来后面生成访问接口信息所需token),然后你在回调里面绑定这个商家唯一信息和这个token,这样就完成一个双向绑定了,而生成授权的代码大概是这个样子的
use ElemeOpenApi\Config\Config;
use ElemeOpenApi\OAuth\OAuthClient;
$app_key = '******'; // 测试商家的app_key
$app_secret = '*******'; // app_secret
// 第三个参数是代表是否是沙盒环境,等正式审核的时候需要改为false
$config = new Config($app_key, $app_secret, true);
//使用config对象,实例化一个授权类
$client = new OAuthClient($config);
// 这里用all代表需要商家给所有的权限
$scope = "all";
// 在沙盒里面填写的回调地址URL
$callBackUrl = '*******';
// 这里是一个需要比较说的,这个其实是一个回调的时候返回给你的信息,因为回调的时候需要关键信息来告诉你
// 发起的倒是是哪个商家,在这里建议使用一个随机的长字符串,然后把这个字符串和你的商家ID关联缓存起来
// 后面回调过来的时候就知道是哪个商家然后再销毁掉这个缓存
$state = '******;
//根据OAuth2.0中的对应state,scope和callback_url,获取授权URL
$auth_url = $client->get_auth_url(state, $scope, $callBackUrl);
echo $auth_url;
接下来我们拿上面生成的连接就可以直接给商家去授权了 授权成功以后回回调回来,url上面就会有code和当时我们设置的state
测试下单
那么账号有了,我们要怎么测试呢,很简单,登陆上商家测试账号
在这里就可以用你的饿了么或者其他的APP扫描找到对应的店铺,然后你定位那里附近下单就可以了
回调方法
接下来我们就可以从回调里面去申请token在我们系统里面找到对应商家做绑定,下面这里就是回调url,就是你在沙盒里面填写的那个url所对应的方法
$code = $_GET['code'];
$app_key = '*****';
$app_secret = '***';
$config = new Config($app_key, $app_secret, true);
$client = new OAuthClient($config);
// 在沙盒里面填写的回调地址URL
$callBackUrl = '*******';
$token = $client->get_token_by_code($code,callBackUrl);
token大概是长这个样,是一个对象
接口请求
接下来就需要用state找到对应的商户,做绑定,这个就要看当时state你是怎么操作的,所以需要你自己写自己系统的业务逻辑
自己写逻辑,把token和你的商家绑定上
那么我们拿到这个token就可以去要信息了
$app_key = '*****';
$app_secret = '*****';
$config = new Config($app_key, $app_secret, true);
// 这里的token就是上面的那个token对象
$user_service = new UserService($token, $config);
$user = $user_service->get_user();
如无意外,你应该会拿到下面这个信息 到这里,我们去调用饿了么那边的接口已经是打通的了,不过这里还涉及到一个问题,就是我们观察到token里面有一个字段expires_in,也就是说我们这个token是有有效期的,在沙盒里面是1天,在正式线是30天,那么我们如果需要刷新这个token,就需要这样
$app_key = '******';
$app_secret = '******';
$config = new Config($app_key, $app_secret, true);
$client = new OAuthClient($config);
$scope = 'all';
// 这里的token对象是上面保存的那个token
$refresh_token = $token->refresh_token;
$newToken = $client->get_token_by_refresh_token($refresh_token, $scope);
这样你就会得到一个新的token,旧的token就会失效了,这样就可以保持绑定不过期,不过如果商户那边主动去解除绑定,就没有办法了 剩下还有很多的查询接口,需要自己去按照自己的业务逻辑接上 https://open.shop.ele.me/openapi/documents/startguide
接收推送
沙盒里面有一个地方是填写接收推送的地址的,这个推送的意思就是,我不可能一直去查询所有订单,那么饿了么就提供了这个推送的方式,异步回调回来,这里有一个需要说明(上面已经说了),回调给你的信息你处理完,必须要返回一个code=200,内容为
echo json_encode(['message'=>'ok']);
上面这样一个内容,要不饿了么那么就会持续给你这个url发内容(最多3次)。并且多次失败以后会给你绑定的手机发短信,告诉你多次失败了,关于这个推送所有的内容,可以参考这里https://open.shop.ele.me/openapi/documents/callback 不过需要注意的一点就是,我们对于推送的内容,不能一概接受,必须要验证
$post = $_POST;
$app_key = '****';
$app_secret = '****';
$config = new Config($app_key, $app_secret, true);
if(check_signature($post, $config->get_app_secret())) {
// 检验成功了,做你的业务逻辑
}
function check_signature($message, $secret)
{
$params = $message;
$signature = $message["signature"];
unset($params["signature"]);
$checkSignature = $this->get_signature($params, $secret);
if ($signature != $checkSignature) {
return false;
}
function get_signature(array $param, $secret)
{
ksort($param);
$string = "";
foreach ($param as $key => $value) {
$string .= $key . "=" . $value;
}
$splice = $string . $secret;
$md5 = strtoupper(md5($splice));
return $md5;
}
除了这种普通的http推送方式,还有一种全双工的方式,不过好像只支持java https://open.shop.ele.me/openapi/documents/fullduplexpushmethodtype 在这里就没法介绍了
总结
至此,就完成了整个的基础接入,不过这里只是简单的做一个接入的介绍,而并没有完成和业务上的对接,因为每个项目的业务都是不一样的,所以没法一一介绍,可以自己参考文档和自己的业务做接入,接下来如果美团那边审核通过,我也尽量写一个关于美团的
来源:oschina
链接:https://my.oschina.net/u/2971783/blog/4333537