美团的订单列表查询(新) api 如何使用,如何生成签名字符串。
关键是生成签名字符串:
我这里遇到一个问题,如果用 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();