在 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
);
这样您就可以将文件发送给用户。
我正在尝试创建一种功能,通过 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
);
这样您就可以将文件发送给用户。