• PHP之美团餐饮系统,订单推送,订单同步,订单消息回调


    前言:相关权限一定要授权!!!
    准备工作:
            1、开发者账户
            2、开通接口权限!!!这点一定要确认好了,大坑。
            2、品牌账户
            3、品牌账户创建门店
            4、品牌账户创建商品下发到门店
            5、门店连接POS机,
            6、开发者配置回调地址
                    a、地址一:业务授权码回调地址
                    b、地址二:业务消息回调地址

    业务步骤参考文档!!!

    下面我们按照文档的步骤来分析讲解

     前面三个去联系销售人员,要是不懂的,有够麻烦的

    接口开发

    1、签名规则  参考链接

    1. //签名计算方法
    2. function get_sign($sign_key, $data)
    3. {
    4. if ($data == null) {
    5. return null;
    6. }
    7. ksort($data);
    8. $result_str = "";
    9. foreach ($data as $key => $val) {
    10. if ($key != null && $key != "" && $key != "sign") {
    11. $result_str = $result_str . $key . $val;
    12. }
    13. }
    14. $result_str = $sign_key . $result_str;
    15. $ret = bin2hex(sha1($result_str, true));
    16. return $ret;
    17. }

    第二步:业务授权URL拼装

    1. //美团手动授权文件
    2. include './php_conn.php';
    3. $timestamp = time();
    4. $data = array("developerId" => DEVELOPERID_TUAN, "businessId" => BUSINESSID_TUAN, "timestamp" => $timestamp, "charset" => 'UTF-8', "state" => "code");
    5. $sign = get_sign(SIGNKEY_TUAN, $data);
    6. //业务授权url
    7. $url = 'https://open-erp.meituan.com/general/auth?developerId=' . DEVELOPERID_TUAN . '×tamp=' . $timestamp . '&charset=UTF-8&businessId=18&sign=' . $sign . '&state=code';
    8. header('Location:' . $url);
    9. exit();
    10. ?>

    拼装授权后会自动跳转到美团的授权界面,使用商户账户登录

     登录后界面,注意一定要有授权!!!!

     第三步:回调地址获取authorization_code后同步获取access_token  ​​​​​​

    日志存储函数

    1. /**
    2. * 日志内容储存(默认进入temp文件夹)
    3. * log_api 小程序接口日志(页面预览信息等等)
    4. * log_pay 支付接口日志
    5. * log_wxmp 微信接口日志
    6. * web_cache 页面缓存
    7. */
    8. function log_result($str, $wjj = 'other', $file = "")
    9. {
    10. $file = $file ? $file : "" . date("Ymd") . ".txt";
    11. $save_path = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "temp" . DIRECTORY_SEPARATOR . $wjj . DIRECTORY_SEPARATOR;
    12. if (!file_exists($save_path)) {
    13. mkdir($save_path, 0777, true);
    14. }
    15. $file_path = $save_path . $file;
    16. $fp = fopen($file_path, "a+");
    17. fwrite($fp, "【" . date("Y-m-d H:i:s") . "】\r\n" . $str . "\r\n\r\n\r\n");
    18. fclose($fp);
    19. }
    1. //curl发送post数据
    2. function curl_post_json($url, $data = array())
    3. {
    4. $curl = curl_init();
    5. $data_string = array();
    6. foreach ($data as $k => $v) {
    7. $data_string[] = $k . '=' . $v;
    8. }
    9. curl_setopt_array($curl, [
    10. CURLOPT_URL => $url,
    11. CURLOPT_RETURNTRANSFER => true,
    12. CURLOPT_ENCODING => "",
    13. CURLOPT_MAXREDIRS => 10,
    14. CURLOPT_TIMEOUT => 30,
    15. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    16. CURLOPT_CUSTOMREQUEST => "POST",
    17. CURLOPT_POSTFIELDS => implode('&', $data_string),
    18. ]);
    19. $response = curl_exec($curl);
    20. curl_close($curl);
    21. return $response;
    22. }

     

    注意:

    1. 接口只支持https;

    2. 端口只支持80或者443;

    3. 授权码有效期仅有10分钟,超时则需要重新生成授权链接,由商家重新授权。

    4. 请在“控制台->基础设置->回调接口设置->统一回调地址->业务授权码回调地址”中进行设置

    1. //业务码回调
    2. $get_data = $_GET;
    3. $logStr = "【美团授权回调" . date("Y-m-d H:i:s", time()) . "】\r\n反馈结果:" . json_encode($get_data, true) . "";
    4. log_result($logStr, "log_meituan_code", date("Ymd") . "_code.txt");
    5. if ($get_data["state"] == 'code' && $get_data["code"]) {
    6. $url = 'https://api-open-cater.meituan.com/oauth/token';
    7. $data_arr = array();
    8. $data_arr["businessId"] = BUSINESSID_TUAN;
    9. $data_arr["charset"] = 'UTF-8';
    10. $data_arr["code"] = $get_data["code"];
    11. $data_arr["developerId"] = (float)$get_data["developerId"];
    12. $data_arr["grantType"] = 'authorization_code';
    13. $data_arr["timestamp"] = (float)time();
    14. $sign = get_sign(SIGNKEY_TUAN, $data_arr);
    15. $data_arr["sign"] = $sign;
    16. $res = curl_post_json($url, $data_arr);
    17. $res_arr = json_decode($res, true);
    18. $logStr = "【美团授权回调(access_token)" . date("Y-m-d H:i:s", time()) . "】\r\n反馈结果:" . $res . "";
    19. log_result($logStr, "log_meituan_code", date("Ymd") . "_code.txt");
    20. if ($res_arr["code"] == 0) {
    21. $file = "access_token_meituan.txt";
    22. $file_up = "access_token_meituan_up.txt";
    23. $save_path = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "temp" . DIRECTORY_SEPARATOR;
    24. if (!file_exists($save_path)) {
    25. mkdir($save_path, 0777, true);
    26. }
    27. $file_path = $save_path . $file;
    28. $file_path_up = $save_path . $file_up;
    29. $access_token_meituan = $res_arr["data"]["accessToken"];
    30. $_str = $access_token_meituan . "_||_" . (time() + $res_arr["data"]["expireIn"]);
    31. $access_token_meituan_up = $res_arr["data"]["refreshToken"];
    32. $_str_up = $access_token_meituan_up . "_||_" . (time() + $res_arr["data"]["expireIn"]);
    33. file_put_contents($file_path, $_str);
    34. file_put_contents($file_path_up, $_str_up);//存入txt文档
    35. }
    36. }

     第五步:获取access_token  ​​​​​​
            注意:ISV/开发者请在访问令牌过期之前(授权后30天内),通过更新令牌接口主动请求开放平台,获取新的访问令牌

    1. //获取access_token
    2. function access_token_meituan()//获取访问令牌
    3. {
    4. global $access_token_meituan;
    5. if (!$access_token_meituan) {
    6. $file = "access_token_meituan.txt";
    7. $save_path = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "temp" . DIRECTORY_SEPARATOR;
    8. if (!file_exists($save_path)) {
    9. mkdir($save_path, 0777, true);
    10. }
    11. $file_path = $save_path . $file;
    12. if (file_exists($file_path)) {
    13. $fp = fopen($file_path, "r");
    14. $fp_str = fread($fp, filesize($file_path));
    15. fclose($fp);
    16. if ($fp_str) {
    17. $arr = explode("_||_", $fp_str);
    18. $access_time = $arr[1];
    19. if ($access_time && $access_time > time()) {
    20. $access_token_meituan = $arr[0];
    21. }
    22. }
    23. }
    24. }
    25. return $access_token_meituan;
    26. }
    27. function access_token_meituan_up()//获取更新令牌
    28. {
    29. global $access_token_meituan_up;
    30. if (!$access_token_meituan_up) {
    31. $file = "access_token_meituan_up.txt";
    32. $save_path = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "temp" . DIRECTORY_SEPARATOR;
    33. if (!file_exists($save_path)) {
    34. mkdir($save_path, 0777, true);
    35. }
    36. $file_path = $save_path . $file;
    37. if (file_exists($file_path)) {
    38. $fp = fopen($file_path, "r");
    39. $fp_str = fread($fp, filesize($file_path));
    40. fclose($fp);
    41. if ($fp_str) {
    42. $arr = explode("_||_", $fp_str);
    43. $access_time = $arr[1];
    44. if ($access_time && $access_time > time()) {
    45. $access_token_meituan_up = $arr[0];
    46. }
    47. }
    48. }
    49. }
    50. return $access_token_meituan_up;
    51. }

    第六步:更新access_token  ​​​​​​(可以放在服务器周期任务中,每20天访问一次)

    1. //美团手动修改access_token文件
    2. $url = 'https://api-open-cater.meituan.com/oauth/refresh';//更新签名
    3. $data_arr = array();
    4. $data_arr["timestamp"] = time();
    5. $data_arr["scope"] = 'all';
    6. $data_arr["refreshToken"] = access_token_meituan_up();
    7. $data_arr["grantType"] = 'refresh_token';
    8. $data_arr["developerId"] = DEVELOPERID_TUAN;
    9. $data_arr["charset"] = 'UTF-8';
    10. $data_arr["businessId"] = BUSINESSID_TUAN;
    11. $sign = get_sign(SIGNKEY_TUAN, $data_arr);
    12. $data_arr["sign"] = $sign;
    13. $res = curl_post_json($url, $data_arr);
    14. $res_arr = json_decode($res, true);
    15. $logStr = "【美团更签名(access_token_up)" . date("Y-m-d H:i:s", time()) . "】\r\n反馈结果:" . $res . "";
    16. log_result($logStr, "log_meituan_code", date("Ymd") . "_code.txt");
    17. if ($res_arr["code"] == 0) {
    18. $file = "access_token_meituan.txt";
    19. $file_up = "access_token_meituan_up.txt";
    20. $save_path = dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR . "temp" . DIRECTORY_SEPARATOR;
    21. if (!file_exists($save_path)) {
    22. mkdir($save_path, 0777, true);
    23. }
    24. $file_path = $save_path . $file;
    25. $file_path_up = $save_path . $file_up;
    26. $access_token_meituan = $res_arr["data"]["accessToken"];
    27. $_str = $access_token_meituan . "_||_" . (time() + $res_arr["data"]["expireIn"]);
    28. $access_token_meituan_up = $res_arr["data"]["refreshToken"];
    29. $_str_up = $access_token_meituan_up . "_||_" . (time() + $res_arr["data"]["expireIn"]);
    30. file_put_contents($file_path, $_str);
    31. file_put_contents($file_path_up, $_str_up);
    32. }

    七: 推送美团订单接口示例

    1. /*
    2. * 美团公共请求接口
    3. * $url 请求地址
    4. * $array 请求内容
    5. * $retu_arry 返回数
    6. */
    7. function MeiTuanYin($url, $bizarray = array())
    8. {
    9. $array = array();
    10. $array["appAuthToken"] = access_token_meituan();
    11. $array["charset"] = 'UTF-8';
    12. $array["timestamp"] = (float)time();
    13. $array["version"] = 2;
    14. $array["developerId"] = DEVELOPERID_TUAN;
    15. $array["businessId"] = BUSINESSID_TUAN;
    16. $array["biz"] = json_encode($bizarray, JSON_UNESCAPED_UNICODE);
    17. $sign = get_sign(SIGNKEY_TUAN, $array);
    18. $array["sign"] = $sign;
    19. $res = curl_post_json($url, $array);
    20. // $res_arr = json_decode($res, true);
    21. return $res;
    22. }
    23. //推送订单
    24. $Mtuanurl = 'https://api-open-cater.meituan.com/rms/trade/api/v1/poi/order/push';
    25. $Mtuanbiz = array();
    26. $Mtuanbiz["orgId"] = $rs_mendian["meituan_id"];
    27. $Mtuanbiz["messageType"] = $messageType;
    28. $Mtuanbiz["order"] = array();
    29. $res_M = MeiTuanYin($Mtuanurl, $Mtuanbiz);
    30. //登记日志
    31. $logStr = "【美团订单推送数据-反馈结果-messageType=" . $messageType . "】:\r\n" . $res_M . "\r\n请求参数:" . json_encode($Mtuanbiz, JSON_UNESCAPED_UNICODE);
    32. log_result($logStr, "log_meituan", date("Ymd") . "_template.txt");
    33. $res_M_arr = json_decode($res_M, true);
    34. ?>

     注意点:
    1、如果订单推送成功后,POS机点击接单后出现这个提示,是美团服务商的问题,联系解决。代码无问题


    2、如果出现这个提示,则表示,开发者消息回调地址没有配置

     

     3、如果配置消息回调地址后出现以下提示,表示回调消息中返回结果不对

     
    八、回调消息接口配置和代码


     
    1. //美团收银订单状态修改回调
    2. $post_data = file_get_contents("php://input");
    3. if ($post_data) {
    4. echo '{"code": 0,"message": "success"}';
    5. $post_data_arr = convertUrlQuery(urldecode($post_data));
    6. $post_data_arr["message"] = json_decode($post_data_arr["message"], JSON_UNESCAPED_UNICODE);
    7. if ($post_data_arr["message"] && $post_data_arr["message"]["mtOrderId"]) {
    8. if ($rsor = _get_one_tj('shop_order', "meituan_or_danhao='" . $post_data_arr["message"]["mtOrderId"] . "'")) {
    9. if ($post_data_arr["msgType"] == 1810011) {//接单
    10. } elseif ($post_data_arr["msgType"] == 1810013) {//拒绝接单
    11. } elseif ($post_data_arr["msgType"] == 1810017) {//制作完成,已发货
    12. } elseif ($post_data_arr["msgType"] == 1810019) {//以取餐,已发货
    13. } elseif ($post_data_arr["msgType"] == 1810023) {//商家主动取消订单
    14. }
    15. }
    16. }
    17. } else {
    18. echo '{"code": -1,"message": "系统错误"}';
    19. }
    20. $logStr = "【美团订单二回调" . date("Y-m-d H:i:s", time()) . "】\r\n反馈结果:" . json_encode($post_data_arr, JSON_UNESCAPED_UNICODE) . "";
    21. log_result($logStr, "log_meituan_callback", date("Ymd") . "_callback2.txt");
    22. ?>

     久:订单推送注意事项

     
    如果第三方小程序中的订单状态发生改变后,需同步POS订单。还是使用推单接口!并且推送的参数和推单一样!

    对应的massagetype状态值不一样,同时在订单参数中,填写推送成功后返回的POS订单ID

     

  • 相关阅读:
    【tgcalls】Instance接口的实例类的创建
    深度学习基础之《TensorFlow框架(15)—神经网络》
    物联网感知-分布式光纤振动传感主机实现基本原理
    DDIM代码详细解读(1):数据集加载、类别条件信息读取、关键超参数解析
    前置知识--Quartz
    @PostConstruct详解
    容器运行elasticsearch安装ik分词非root权限安装报错问题
    国赛练习(1)
    Mac连接U盘后怎么读取 Mac连接U盘后怎么取消只读模式
    leetcode第 387 场周赛总结
  • 原文地址:https://blog.csdn.net/weixin_44936767/article/details/126659929