拍拍贷/API

拍拍贷/API

拍拍贷 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

openapiNoAuth.loanList

可以获取的标的基本信息,比如级别(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);
});

Last update: 2018-08-03 08:22:27 UTC