1. 美团点评开放平台接入准备第一次对接美团点评开放平台时我花了整整三天才搞明白整个流程。现在回想起来其实核心就三个步骤创建应用、获取授权、调用接口。我们先从最基础的账号准备说起。要接入美团点评API首先需要注册成为开发者。这里有个坑点个人账号和企业账号的权限差异很大。如果是商业项目建议直接用企业账号注册否则后期可能遇到功能限制。注册完成后登录开放平台控制台https://open.dianping.com在应用管理页面点击创建应用。创建应用时需要特别注意应用类型的选择自用型应用适合单个商户使用权限范围仅限于该商户的数据工具型应用适合服务多个商户的第三方开发者需要额外资质审核我建议先用自用型应用测试等流程跑通后再考虑升级。创建成功后记下系统分配的app_key和app_secret这两个参数相当于你的API钥匙后续所有请求都要用到。2. OAuth2.0授权流程详解授权流程是整个对接过程中最复杂的环节也是出错率最高的部分。美团点评采用的是标准的OAuth2.0协议但有些细节需要特别注意。2.1 构建授权链接授权流程始于构建正确的授权链接。这个链接需要包含以下关键参数$authUrl https://e.dianping.com/dz-open/merchant/auth? . http_build_query([ app_key 你的app_key, redirect_url 你的回调地址, state 自定义防CSRF字符串, scope json_encode([tuangou]) // 必须用JSON数组格式 ]);这里最容易出错的是scope参数。美团要求必须传入JSON数组格式的字符串即使只有一个权限也要用数组包裹。我曾经因为直接传字符串tuangou导致授权失败调试了半天才发现问题。2.2 处理授权回调用户授权后美团会跳转到你设置的redirect_url并附带auth_code参数。这个code有效期只有10分钟必须立即用它换取sessionpublic function handleCallback() { $authCode $_GET[auth_code] ?? null; if (!$authCode) { die(授权失败未收到auth_code); } $params [ app_key $this-appKey, app_secret $this-appSecret, auth_code $authCode, grant_type authorization_code ]; $response $this-httpPost(https://openapi.dianping.com/router/oauth/token, $params); if (empty($response[session])) { die(获取session失败 . json_encode($response)); } // 存储session到数据库 $this-saveSession($response[session], $response[expires_in]); }获取到的session通常有30天有效期建议存储到数据库并设置定时任务在到期前刷新。3. 团购券核销核心实现有了授权信息后就可以实现核心的团购券核销功能了。美团提供了三种核销方式我们重点讲最常见的输码核销。3.1 查询券信息核销前需要先查询券状态这个接口返回的信息量很大public function queryCoupon($receiptCode, $shopUuid) { $params [ app_key $this-appKey, timestamp date(Y-m-d H:i:s), session $this-getSession(), receipt_code $receiptCode, open_shop_uuid $shopUuid, v 1, format json ]; // 生成签名 $params[sign] $this-generateSign($params); $response $this-httpPost( https://openapi.dianping.com/router/tuangou/receipt/prepare, $params ); if ($response[status] ! SUCCESS) { throw new Exception(查询失败 . $response[message]); } return $response; }签名生成是另一个容易出错的点。美团要求所有参数按字典序排序后拼接签名private function generateSign($params) { ksort($params); $signString $this-appSecret; foreach ($params as $k $v) { $signString . $k . $v; } $signString . $this-appSecret; return strtoupper(md5($signString)); }3.2 执行核销操作确认券状态正常后就可以调用核销接口了。这里有个重要细节美团要求核销请求必须包含requestid防重放public function consumeCoupon($receiptCode, $shopUuid) { $params [ app_key $this-appKey, timestamp date(Y-m-d H:i:s), session $this-getSession(), receipt_code $receiptCode, open_shop_uuid $shopUuid, requestid uniqid(), // 防重放ID v 1 ]; $params[sign] $this-generateSign($params); $response $this-httpPost( https://openapi.dianping.com/router/tuangou/receipt/consume, $params ); if ($response[status] ! SUCCESS) { throw new Exception(核销失败 . $response[message]); } // 记录核销日志 $this-logConsume($receiptCode, $shopUuid); return $response; }4. 生产环境部署要点从测试环境切换到生产环境时我踩过几个坑值得分享4.1 回调地址配置在应用上线前必须先在开放平台配置正式的回调地址。这个地址必须:使用HTTPS协议与注册时填写的域名完全一致不能带端口号默认443配置完成后需要等待约30分钟生效这点美团文档里没明确说明我第一次上线时就因为立即测试导致失败。4.2 会话管理策略生产环境的会话管理需要更健壮的方案实现session自动刷新在session到期前24小时自动续期多店铺支持每个店铺需要独立的session存储失败重试机制网络波动时自动重试3次class SessionManager { private $db; public function __construct() { $this-db new PDO(...); } public function getSession($shopId) { $stmt $this-db-prepare(SELECT * FROM shop_sessions WHERE shop_id ?); $stmt-execute([$shopId]); $session $stmt-fetch(); // 临近过期自动刷新 if ($session time() strtotime($session[expire_time]) - 86400) { return $this-refreshSession($shopId); } return $session[session] ?? null; } private function refreshSession($shopId) { // 实现刷新逻辑 } }4.3 监控与报警上线后建议实现以下监控每日授权成功率监控接口平均响应时间监控核销失败告警短信/邮件通知我们团队用PrometheusGrafana搭建了监控看板当核销失败率超过5%时自动触发告警。