logo科技微讯

美团联盟 API 如何查询订单

作者:科技微讯
日期:2021-05-01
📝 笔记

美团的订单列表查询(新) api 如何使用,如何生成签名字符串

关键是生成签名字符串:

  • 按照参数 key 进行“字典序升序”;
  • 按照 keyvalue 顺序把参数拼起来;
  • 得到的拼接结果再首尾拼接秘钥;
  • 最后对字符串 md5。

我这里遇到一个问题,如果用 got 这个包向 api 发送请求,如果请求出错无法返回出错的理由,直接 400,如果用 node-fetch 这个包发出请求,可以通过 res.text() 获得出错结果:sign 签名错误。

const crypto = require("crypto");
const fetch = require("node-fetch");

function ksort(obj) {
  var keys = Object.keys(obj).sort(),
    sortedObj = {};
  for (var i in keys) {
    sortedObj[keys[i]] = obj[keys[i]];
  }
  return sortedObj;
}

const getSign = function (options) {
  const SECRET = "808fd9e47375cd2885fdf8a2c974ac05";
  var str = "";
  str += SECRET;
  const params = ksort(options);
  for (let i in params) {
    str += i + params[i];
  }
  str += SECRET;
  const sign = crypto.createHash("md5").update(str).digest("hex");
  return sign;
};

const api = new URL("https://runion.meituan.com/api/orderList");

async function app() {
  const key = "7708a5ff3175bf175f58a548d6c72311";
  const now = new Date();
  const ts = `${Math.floor(now / 1000)}`;
  const types = ["4", "6"];
  const startTime = `${
    new Date(now.getFullYear(), now.getMonth(), now.getDate()) / 1000
  }`;
  const endTime = ts;
  const page = "1";
  const limit = "100";
  const queryTimeType = "1";
  const paramsArray = types.map((type) => {
    const options = {
      key,
      ts,
      type,
      startTime,
      endTime,
      page,
      limit,
      queryTimeType,
    };
    const sign = getSign(options);
    options.sign = sign;
    return options;
  });
  const promiseArray = paramsArray.map((item) => {
    const url = new URL(api);
    url.search = new URLSearchParams(item).toString();
    // 或 const url = api + "?" + new URLSearchParams(item).toString();
    return fetch(url)
      .then((res) => res.json())
      .then((res) => {
        if (item.type === "4") {
          res.type = "外卖";
        }
        if (item.type === "6") {
          res.type = "闪购";
        }
        return res;
      });
  });

  const orders = await Promise.all(promiseArray);
  console.log(orders);
}
app();
donation赞赏
thumbsup0
thumbsdown0
暂无评论