Я использую облачные функции firebase в качестве сервера для оплаты Paypal. Документация не очевидна для понимания. когда я пытаюсь отправить объект из приложения Android в облачные функции firebase, ничего не произошло. Думаю, я неправильно добавил. Итак, как я могу передать объект из приложения Android в функцию?
public void payout(String PayerID,String paymentId) {
// Create the arguments to the callable function.
JSONObject postData = new JSONObject();
try {
postData.put("PayerID", PayerID);
postData.put("paymentId",paymentId);
} catch (JSONException e) {
e.printStackTrace();
}
mFunctions
.getHttpsCallable("payout")
.call(postData)
.continueWith(new Continuation<HttpsCallableResult, Object>() {
@Override
public Object then(@NonNull Task<HttpsCallableResult> task)
throws Exception {
return null;
}
});
}
///////////////////////////////////////////
exports.payout=functions.https.onRequest((req,res)=>{
const sender_batch_id = Math.random().toString(36).substring(9);
const payReq=JSON.stringify({
sender_batch_header: {
sender_batch_id: sender_batch_id,
email_subject: "You have a nice payment"
},
items: [
{
recipient_type: "EMAIL",
amount: {
value: 0.90,
currency: "USD"
},
receiver: "[email protected]",
note: "Thank you very much.",
sender_item_id: "item_3"
}
]
});
paypal.payout.create(payReq,(error, payout)=>{
if (error) {
console.warn(error.res);
res.status('500').end();
throw error;
}else{
console.info("payout created");
console.info(payout);
res.status('200').end();
}
});
});
exports.process = functions.https.onRequest((req, res) => {
const paymentId = req.body.paymentId;
var payerId = {
payer_id: req.body.PayerID
};
return paypal.payout.execute(paymentId, payerId, (error, payout) => {
if (error) {
console.error(error);
} else {
if (payout.state === 'approved') {
console.info('payment completed successfully, description: ',
payout.transactions[0].description);
const ref=admin.firestore().collection("Users").doc(payerId);
ref.set({'paid': true});
} else {
console.warn('payment.state: not approved ?');
}
}
}).then(r =>
console.info('promise: ', r));
});
Проблема возникает из-за того, что в вашем приложении для Android вы вызываете вызываемую функцию HTTPS (через mFunctions.getHttpsCallable("payout")), но ваша облачная функция не является вызываемой функцией HTTPS, а является «простой» функцией HTTPS.
Вызываемые функции HTTPS записываются следующим образом:
exports.payout = functions.https.onCall((data, context) => {
// ...
});
в то время как функции HTTPS записываются следующим образом:
exports.payout = functions.https.onRequest((req,res)=> {
// ...
})
Поэтому вам следует адаптировать код вашей облачной функции в соответствии с документацией: https://firebase.google.com/docs/functions/callable
Обратите внимание, что другим вариантом может быть запись в базу данных (база данных реального времени или Firestore) и запуск облачной функции с помощью триггера onWrite или onCreate. Преимущество такого подхода в том, что вы напрямую сохраняете информацию о платеже в базе данных.
Да, в этом примере используется функция HTTPS, но это всего лишь триггер для выполнения кода. Таким образом, вы вполне можете использовать любой другой триггер облачных функций, в частности триггер вызываемой функции HTTPS или фоновый триггер. Вам просто нужно немного адаптировать код для чтения данных, которые вы получаете от внешнего интерфейса.
обобщает ли это правило? даже для интеграции с PayPal?
Ваш последний вопрос на самом деле слишком широк, чтобы на него правильно ответить. Вы должны выбрать триггер облачной функции в зависимости от ваших требований. Но несомненно то, что с разными триггерами вы можете запускать одну и ту же бизнес-логику в облачной функции. И это касается платежа, где единственным ограничением является тот факт, что платежная платформа вызывается управляемой средой (то есть службой Cloud Functions в данном случае).
но в документации предлагается использовать HTTP-запросы, а не первые триггеры или триггеры в реальном времени. см. эту ссылку, там есть документы для интеграции PayPal github.com/firebase/functions-samples/blob/master/paypal/…