拍拍贷 OpenAPI
Tips
公共参数
以 "X-" 开头。放到 request header 里。
"X-PPD-APPID": 申请的 App ID
"X-PPD-TIMESTAMP": 当前的 UTC 时间, 格式为 YYYY-MM-DD HH:mm:ss
"X-PPD-SIGNVERSION": API 签名版本,目前为 1,
"X-PPD-SERVICEVERSION": API 版本,目前为 1,
"X-PPD-TIMESTAMP-SIGN": 对 `${X-PPD-APPID}${X-PPD-TIMESTAMP}`
签名结果,
"X-PPD-SIGN": 对所有 Body / query string 里 参数签名结果,
"X-PPD-ACCESSTOKEN": 部分代表用户操作的API(比如投标)需要,用户授权获取的 accesstoken。
每个 API 特有的请求参数
放到 URL query string 或 body 里。需要对所有参数签名,签名结果放在公共参数里的X-PPD-SIGN。签名流程文档
如果把参数放在 body 里,那么 request method 为 POST。request content-type 可以为"application/x-www-form-urlencoded", "application/json" 或 "multipart/form-data" 任意一种。
Request Content-Type: (推荐使用 application/json)
- application/json: request body 为参数 object 的 JSON 序列化字符串。
- application/x-www-form-urlencoded: request body 为标准的格式 "a=1&b=2"。
- multipart/form-data: 一般无需使用这种。
散标可投标列表 API
可以获取的标的基本信息,比如级别(AA|A|B|C|D), 年利率。适合直接选择投赔标。如果投信标需要再调用 openapiNoAuth.batchListingInfo API 传入标的 id 列表批量获取信标详情以便筛选好标。
参数
- PageIndex: 页数。从 1 开始。
- StartDateTime: (可选) 只查询该时间之后的散标列表。时间精确到毫秒,格式为 "2015-11-11 12:00:00.000"。亲测其时间为 UTC+8 北京时区的时间。
Node.js
Node.js 访问拍拍贷 API 函数示例:用了 request 和 moment 两个第三方库。
const crypto = require("crypto");
const request = require("request");
const moment = require("moment");
let PPD_APIID = 'abcdefghijklmndddfdf';
let PPD_PK = `
-----BEGIN PRIVATE KEY-----
......
-----END PRIVATE KEY-----
`;
async function ppdApi(url, token, params = {}) {
let headers = {
["X-PPD-APPID"]: PPD_APIID,
["X-PPD-TIMESTAMP"]: moment.utc().format("YYYY-MM-DD HH:mm:ss"),
["X-PPD-SIGNVERSION"]: 1,
["X-PPD-SERVICEVERSION"]: 1,
["X-PPD-TIMESTAMP-SIGN"]: "",
["X-PPD-SIGN"]: "",
Accept: "application/json;charset=UTF-8"
};
if (token) {
headers["X-PPD-ACCESSTOKEN"] = token;
}
headers["X-PPD-TIMESTAMP-SIGN"] = ppdSign(
`${headers["X-PPD-APPID"]}${headers["X-PPD-TIMESTAMP"]}`,
PPD_PK
);
headers["X-PPD-SIGN"] = ppdSign(params, PPD_PK);
let result = await new Promise((resolve, reject) => {
request(
{ method: "POST", url, headers, json: true, body: params, timeout: 3000 },
(error, response, body) => {
if (error) {
return reject(error);
}
return resolve(body);
}
);
});
if (typeof result == "string") {
result = JSON.parse(result);
}
return result;
}
function ppdSign(data, privateKey) {
if (typeof data == "object") {
let keys = Object.keys(data).sort();
data = keys.reduce(
(prev, key) => prev + `${key.toLowerCase()}${data[key]}`,
""
);
}
return crypto
.createSign("sha1WithRSAEncryption")
.update(data)
.sign(privateKey, "base64");
}
函数使用示例:
const API_LIST_URL ="https://openapi.ppdai.com/listing/openapiNoAuth/loanList";
// 获取散标列表
ppdApi(API_LIST_URL, null, {PageIndex: 1}).then(result => {
console.log(result.LoanInfos);
});