在 Whatspp 业务 api 的 http post 请求中上传文件作为二进制数据的正确方法是什么?

What is the correct way to upload file as binary data in http post request of Whatspp business api?

我正在尝试创建一种功能,通过 whatsapp 以 pdf 格式向我们的客户发送发票。为此,我已经有一张 pdf 发票,需要通过 whatsapp 服务器上传,以便根据文件发送给我们的客户:https://developers.facebook.com/docs/whatsapp/api/media/

因为它需要二进制媒体数据, 我正在创建一个 http post 请求正文,如下所示:

    let requestOptions = {
      method: method,
      url: "https://whatsapp-url" + '/v1/upload',
      body: Buffer.from(fs.readFileSync("path/test.pdf")),
      json: true,
      headers: {
        authorization: bearerToken,
        'content-type' : 'application/pdf'
      }
    };

作为对此的回应,我确实在响应正文中收到了来自 Whatsapp 的媒体 ID,我根据文档使用它向客户发送消息: https://developers.facebook.com/docs/whatsapp/api/messages

但是唉!!收到的 pdf 文件已损坏且无法打开,而且我还注意到,与我在客户端通过 Whatsapp 消息收到的文件相比,我发送的 pdf 文件的大小要小得多。

任何人都可以帮助我在创建上传请求正文时可能做错了什么,因为我怀疑这是我的所有问题。

如文档中所述,您不能这样做。

您需要做的是为文件创建一个唯一的 url(通过 api)并将其保存在您的终端。然后将 url 发送到 whatsApp。

有两种方法可以通过 link 或 ID 将文件发送给用户。 Link 可以是您自己的 WhatsApp 服务器 link,也可以是外部 link,提供者名称作为参数。

如果您有文件,则可以将文件上传到您的 WhatsApp 业务 API 服务器并在 return 中获取媒体 ID。使用该媒体 ID 创建 link 或仅使用该媒体 ID 将文件发送给用户。

以下是创建二进制文件的代码示例

 const dataStream = fs.readFileSync(
    `Your Path to file/File Name`,
    null
  );

  let uploadFile = yield whatsAppMessage.uploadWhatsappMediaToUser(
    bot, // We are using Bot kit to process message
    'application/pdf', // mime type
    dataStream, // Binary Data Stream to upload the file
    file name //File name
  );

    function uploadWhatsappMediaToUser(bot, contentType, binaryData, filename) {
  const options = {
    method: 'POST',
    uri: `Upload URL`,
    headers: {
      Authorization: `Bearer  {auth_token}`,
      'Content-Type': contentType,
      'Content-Disposition': `attachment; filename=${filename}`,
    },
    rejectUnauthorized: false,
    body: binaryData,
  };

  return rp(options);
}

在 uploadFile 变量中,您将收到需要解析以提取媒体 ID 的 json 对象。使用该媒体 ID 发送文件。

以下是将文件作为邮件附件发送的代码

const fileDetails = {
    mime_type: 'application/pdf', // MIME type
    id: uploadFile.media[0].id, // Media ID
    filename: fileName,
  };
  yield whatsAppMessage.sendWhatsappMediaMessageToUser(
    bot, // Bot kit object
    userId, //User mobile number
    fileDetails // Above File object
  );

这样您就可以将文件发送给用户。