我们在后端使用 FCM 将付款通知发送到移动应用程序。最终,它停止工作,因为旧版 API 已于 2024 年 7 月关闭。Google 提供了迁移指南
这是我发送 FCM 消息的新函数:
async function sendFCMInvoicePaidNotificationMessagev2(to, transactionID, mobileNumber, callback) {
var myAccessToken = await getAccessToken()
unirest.post('https://fcm.googleapis.com/v1/projects/xxxx-xxxx-xxxx/messages:send').headers({
'Authorization': myAccessToken,
'Accept': 'application/json',
'Content-Type': 'application/json',
'cache-control': 'no-cache'
}).proxy('http://xxxx:1234').send({
'to': to,
'priority': 'high',
'restricted_package_name': config.get('googlePkgName'),
'notification': {
'title': 'Invoice # ' + transactionID + ' has been paid. Thank you.'
},
'data': {
'transactionID': transactionID,
'mobileNumber': mobileNumber
}
}).end(function(responseFCM) {
callback(responseFCM);
});
}
function getAccessToken() {
var SCOPES = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/firebase.messaging'];
return new Promise(function(resolve, reject) {
const key = require('./service_account.json');
const jwtClient = new google.auth.JWT(
key.client_email,
null,
key.private_key,
SCOPES,
null
);
jwtClient.authorize(function(err, tokens) {
if (err) {
reject(err);
return;
}
resolve(tokens.access_token);
});
});
}
运行服务,我得到以下响应:
{"statusCode":401,"body":{"error":{"code":401,"message":"请求是 缺少所需的身份验证凭据。预期的 OAuth 2 访问 令牌、登录 cookie 或其他有效的身份验证凭据。看 https://developers.google.com/identity/sign-in/web/devconsole-project。","status":"未经身份验证","details":[{"@type":"type.googleapis.com /google.rpc.ErrorInfo","reason":"CREDENTIALS_MISSING","domain":"googleapis.com","metadata":{"method":"google.firebase.fcm.v1.FcmService.SendMessage"," service":"fcm.googleapis.com"}}]}},"headers":{"www-authenticate":"承载者 领域=“https://accounts.google.com/”“,”变化“:”X-Origin,Referer, 来源,接受编码","内容类型":"application/json; 字符集=UTF-8","日期":"2024 年 9 月 17 日星期二 07:14:13 GMT","服务器":"脚手架上 HTTPServer2","缓存控制":"私有","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff" ,"alt-svc":"h3=":443"; ma=2592000,h3-29=":443"; ma=2592000","accept-ranges":"none","connection":"close","transfer-encoding":"chunked"},"request":{"uri":{"protocol":"https :","斜杠":true,"auth":null,"主机":"fcm.googleapis.com","端口":443,"主机名":"fcm.googleapis.com","哈希":null ,“搜索”:空,“查询”:空,“路径名”:“/v1/projects/xxxxxxxx/messages:发送”,“路径”:“/v1/projects/xxxxxxxx/messages:发送”,“href” :"https://fcm.googleapis.com/v1/projects/xxxxxxxx/messages:send"},"method":"post","headers":{"授权":{},"接受":"申请/json","Content-Type":"application/json","cache-control":"no-cache","content-length":386}}}
嗯“预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据”...也许我没有正确创建 service_account.json ?我认为我正确地遵循了 Google 的步骤。要为您的服务帐户生成私钥文件:
这里出了什么问题?
您需要在访问令牌之前添加授权类型 Bearer
async function sendFCMInvoicePaidNotificationMessagev2(to, transactionID, mobileNumber, callback) {
var myAccessToken = await getAccessToken()
unirest.post('https://fcm.googleapis.com/v1/projects/xxxx-xxxx-xxxx/messages:send').headers({
'Authorization': 'Bearer ' + myAccessToken,
'Accept': 'application/json',
'Content-Type': 'application/json',
'cache-control': 'no-cache'
}).proxy('http://xxxx:1234').send({
'to': to,
'priority': 'high',
'restricted_package_name': config.get('googlePkgName'),
'notification': {
'title': 'Invoice # ' + transactionID + ' has been paid. Thank you.'
},
'data': {
'transactionID': transactionID,
'mobileNumber': mobileNumber
}
}).end(function(responseFCM) {
callback(responseFCM);
});
}