【发布时间】:2021-03-29 05:56:13
【问题描述】:
我正在尝试创建从 Cloud Firestore 获取数据的 Cloud Functions,并使用从 Cloud Firestore 获取的值向支付网关 API 发送支付请求。
我可以使用这个函数从 Firestore 中获取我需要的文档:
exports.getData = functions.https.onRequest((req, res) => {
const docRef = db.collection('requests').doc('vsFyJ5lisBgYNwQEzOLa');
const getDoc = docRef.get()
.then(doc => {
if (!doc.exists) {
console.log('No such document!');
return res.send('Not Found')
}
console.log(doc.data());
return res.send(doc.data());
})
.catch(err => {
console.log('Error getting document', err);
});
});
但是,这个函数只打印文档值;我需要在另一个函数中使用这些值,如下所示:
exports.pay = functions.https.onRequest((req, res) => {
var Iyzipay = require('iyzipay');
const doc = db.collection('requests').doc('vsFyJ5lisBgYNwQEzOLa');
const iyzipay = new Iyzipay({
apiKey: 'apiKey',
secretKey: 'secretKey',
uri: 'https://sandbox-api.iyzipay.com'
});
var request = {
locale: Iyzipay.LOCALE.TR,
conversationId: '123456789',
price: doc.price,
paidPrice: doc.paidPrice,
currency: Iyzipay.CURRENCY.TRY,
installment: '1',
basketId: 'B67832',
paymentChannel: Iyzipay.PAYMENT_CHANNEL.WEB,
paymentGroup: Iyzipay.PAYMENT_GROUP.PRODUCT,
paymentCard: {
cardHolderName: doc.cardHolderName,
cardNumber: doc.cardNumber,
expireMonth: doc.expireMonth,
expireYear: doc.expireYear,
cvc: doc.cvc,
registerCard: '0'
},
};
iyzipay.payment.create(request, function (err, result) {
console.log(err, result);
});
});
我尝试组合如下功能:
exports.pay = functions.https.onRequest((req, res) => {
var Iyzipay = require('iyzipay');
const doc = db.collection('requests').doc('vsFyJ5lisBgYNwQEzOLa');
const iyzipay = new Iyzipay({
apiKey: 'sandbox-afXhZPW0MQlE4dCUUlHcEopnMBgXnAZI',
secretKey: 'sandbox-wbwpzKIiplZxI3hh5ALI4FJyAcZKL6kq',
uri: 'https://sandbox-api.iyzipay.com'
});
const docRef = db.collection('requests').doc('vsFyJ5lisBgYNwQEzOLa');
const getDoc = docRef.get()
.then(doc => {
if (!doc.exists) {
console.log('No such document!');
return res.send('Not Found')
}
console.log(doc.data());
return res.send(doc.data());
})
.catch(err => {
console.log('Error getting document', err);
});
var request = {
locale: Iyzipay.LOCALE.TR,
conversationId: '123456789',
price: '1',
paidPrice: '1.2',
currency: Iyzipay.CURRENCY.TRY,
installment: '1',
basketId: 'B67832',
paymentChannel: Iyzipay.PAYMENT_CHANNEL.WEB,
paymentGroup: Iyzipay.PAYMENT_GROUP.PRODUCT,
paymentCard: {
cardHolderName: doc.cardHolderName,
cardNumber: doc.cardNumber,
expireMonth: doc.expireMonth,
expireYear: doc.expireYear,
cvc: doc.cvc,
registerCard: '0'
}
};
iyzipay.payment.create(request, function (err, result) {
console.log(err, result);
});
});
当 Firestore 查询像以前一样打印在控制台上时,支付处理器返回错误。
然后我尝试使用如下静态值调用支付处理器:
var request = {
locale: Iyzipay.LOCALE.TR,
conversationId: '123456789',
price: '1',
paidPrice: '1.2',
currency: Iyzipay.CURRENCY.TRY,
installment: '1',
basketId: 'B67832',
paymentChannel: Iyzipay.PAYMENT_CHANNEL.WEB,
paymentGroup: Iyzipay.PAYMENT_GROUP.LISTING,
paymentCard: {
cardHolderName: 'John Doe',
cardNumber: '5528790000000008',
expireMonth: '12',
expireYear: '2030',
cvc: '123',
registerCard: '0'
}
}
支付处理器返回成功,所以我获取或使用 Firestore 文档值的方式一定有问题。
为了再次测试它是否确实使用了 Firestore 值,我只将一个字段切换为 cardNumber: doc.cardNumber。控制台返回:
✔ functions[pay]: http function initialized (http://localhost:5000/highmidlow1/us-central1/pay).
i functions: Beginning execution of "pay"
⚠ External network resource requested!
- URL: "https://sandbox-api.iyzipay.com/payment/auth"
- Be careful, this may be a production service.
⚠ Google API requested!
- URL: "https://oauth2.googleapis.com/token"
- Be careful, this may be a production service.
> null {
> status: 'failure',
> errorCode: '12',
> errorMessage: 'Invalid card number',
> locale: 'tr',
> systemTime: 1608311421424,
> conversationId: '123456789'
> }
> {
> expireYear: '2030',
> paidPrice: 1.2,
> cardNumber: '5528790000000008',
> cvc: '123',
> price: 1,
> expireMonth: '12', }
那么如何从 Firestore 中获取文档并在 Cloud Function 中使用其值,例如 price: doc.price?
【问题讨论】:
-
似乎您只需要将第一个函数中的查询与第二个函数中对支付处理器的调用结合起来。你具体有什么问题?请编辑问题以明确。
-
嗨@DougStevenson,感谢您的快速回复。当我结合这两个函数时,支付处理器返回一个错误,而 Firestore 查询在控制台上打印值。当我尝试使用价格:'1'而不是价格:doc.price 等值调用支付处理器时,它返回成功。因此,我认为获取和使用 Firestore 文档值的方式一定有问题。
-
您的 Firestore 可能将 doc.price 作为 字符串,而支付处理器需要它作为数字。其他常见问题通常归结为某种格式 - “1”、“$1”、“1.00”、1、1.00、“USD 1.00”都是信息可能保存在数据库中的所有可能方式。
-
如果有错误消息,您应该将其与调试详细信息一起显示出来,以便我们跟踪问题所在。
-
@LeadDreamer,感谢您的回复。我也想到了这一点,我从处理器的文档中检查了格式是否正确。他们似乎是正确的,所以我认为这是关于别的事情。
标签: node.js firebase google-cloud-firestore google-cloud-functions