在使用Firebase作为后端为Android实现Braintree支付时遇到问题
我在firebase上得到以下输出:“无法确定付款方式” 注意:我对JavaScript和Firebase函数没有太多的知识,因此无法实现这一点 我一直遵循Braintree的指南来设置付款方式。这是事件的流程: 第一步 前端从服务器请求客户端令牌并初始化客户端SDK 步骤2 服务器使用服务器SDK生成客户端令牌并将其发送回客户端 步骤3 客户提交付款信息,客户端SDK将该信息传递给Braintree,并立即返回付款方法 步骤4 前端会立即将付款方式发送到服务器 步骤5 您的服务器代码接收支付方法nonce,然后使用服务器SDK创建事务 到目前为止,我一直停留在第五步。nonce以以下格式发布到我的Firebase数据库:在使用Firebase作为后端为Android实现Braintree支付时遇到问题,android,firebase,braintree,Android,Firebase,Braintree,我在firebase上得到以下输出:“无法确定付款方式” 注意:我对JavaScript和Firebase函数没有太多的知识,因此无法实现这一点 我一直遵循Braintree的指南来设置付款方式。这是事件的流程: 第一步 前端从服务器请求客户端令牌并初始化客户端SDK 步骤2 服务器使用服务器SDK生成客户端令牌并将其发送回客户端 步骤3 客户提交付款信息,客户端SDK将该信息传递给Braintree,并立即返回付款方法 步骤4 前端会立即将付款方式发送到服务器 步骤5 您的服务器代码接收支付方
-nonce
-LsHNQLklFEX48oiSt1H:"tokencc_bc_vbmypn_dvn4gy_xy47fw_th6vv9_bq6"
-LsHn2hilKlmVeT1g1Ow: tokencc_bf_8qrjsk_j7bg44_p8kk88_qz7vn2_vk6"
我将如何执行步骤5
功能代码:
'use strict';
const functions = require('firebase-functions');
const express = require('express');
const app = express();
const braintree = require('braintree');
const admin = require('firebase-admin');
admin.initializeApp();
var clientToken;
var nonceFromTheClient;
var transaction;
var gateway = braintree.connect({
environment: braintree.Environment.Sandbox,
merchantId:"",
publicKey: "",
privateKey: ""
});
exports.createToken = functions.https.onRequest((request, response) => {
gateway.clientToken.generate({}, function (err, response) {
if (err){
console.log('inside error',err);
} else {
clientToken = response.clientToken;
}
});
response.send(clientToken);
});
exports.createTransaction = functions.https.onRequest((req, res) => {
app.post("/nonce", function (req, res) {
nonceFromTheClient = req.body.payment_method_nonce;
console.log("nonce" + nonceFromTheClient)
});
gateway.transaction.sale({amount: '10.00', paymentMethodNonce: nonceFromTheClient, options: {submitForSettlement: true}}, function (err, result) {
if (err) {
console.error(err);
return;
}
if (result.success) {
console.log('Transaction status: ' + result.transaction.status);
} else {
console.error(result.message);
}
});
res.send(transaction);
});
活动代码:
if (cardPayment.isChecked) {
val client = AsyncHttpClient()
client.get(
"https://.../createToken",
object : TextHttpResponseHandler() {
override fun onFailure(
statusCode: Int,
headers: Array<out Header>?,
responseString: String?,
throwable: Throwable?
) {
}
override fun onSuccess(
statusCode: Int,
headers: Array<Header>,
clientToken: String
) {
mClientToken = clientToken
onBraintreeSubmit(it)
}
})
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_CODE && data != null) {
if (resultCode == Activity.RESULT_OK) {
val result =
data.getParcelableExtra<DropInResult>(DropInResult.EXTRA_DROP_IN_RESULT)
val nonce = result.paymentMethodNonce?.nonce
if (nonce != null) {
FirebaseShoppingCartDatabase.postNonceToDatabase(nonce)
val client = AsyncHttpClient()
client.get(
"https://..../createTransaction",
object : TextHttpResponseHandler() {
override fun onFailure(
statusCode: Int,
headers: Array<out Header>?,
responseString: String?,
throwable: Throwable?
) {
}
override fun onSuccess(
statusCode: Int,
headers: Array<Header>,
clientToken: String
) {
}
})
}
} else if (resultCode == RESULT_CANCELED) {
} else {
// handle errors here, an exception may be available in
val error = data.getSerializableExtra(DropInActivity.EXTRA_ERROR) as Exception
System.out.println("eroare " + error)
}
}
}
fun onBraintreeSubmit(v: View) {
val dropInRequest = DropInRequest()
.clientToken(mClientToken)
dropInRequest
.disablePayPal()
startActivityForResult(dropInRequest.getIntent(context), REQUEST_CODE)
}
}
if(cardPayment.isChecked){
val client=AsyncHttpClient()
client.get(
"https://.../createToken",
对象:TextHttpResponseHandler(){
覆盖故障(
状态代码:Int,
标题:数组?,
响应:字符串?,
可丢弃的:可丢弃的?
) {
}
一旦成功,就放弃乐趣(
状态代码:Int,
标题:数组,
clientToken:字符串
) {
mClientToken=clientToken
onBraintreeSubmit(it)
}
})
}
重写activityResult(请求代码:Int,结果代码:Int,数据:Intent?){
if(requestCode==REQUEST\u CODE&&data!=null){
if(resultCode==Activity.RESULT\u确定){
val结果=
data.getParcelableExtra(DropInResult.EXTRA\u DROP\u IN\u RESULT)
val nonce=result.paymentMethodNonce?.nonce
if(nonce!=null){
FirebaseShoppingCartDatabase.postNonceToDatabase(nonce)
val client=AsyncHttpClient()
client.get(
"https://..../createTransaction",
对象:TextHttpResponseHandler(){
覆盖故障(
状态代码:Int,
标题:数组?,
响应:字符串?,
可丢弃的:可丢弃的?
) {
}
一旦成功,就放弃乐趣(
状态代码:Int,
标题:数组,
clientToken:字符串
) {
}
})
}
}else if(resultCode==RESULT\u取消){
}否则{
//如果在此处处理错误,则中可能存在异常
val error=data.getSerializableExtra(DropInActivity.EXTRA_错误)作为异常
System.out.println(“eroare”+错误)
}
}
}
有趣的大脑树submit(v:视图){
val dropInRequest=dropInRequest()
.clientToken(mClientToken)
下降要求
.disablePayPal()
startActivityForResult(dropInRequest.getIntent(上下文),请求代码)
}
}
让它开始工作。我错误地将nonce传递给服务器。(使用不同的URL)完全披露:我在Braintree工作。请与您的联系,以便我们查看服务器日志以了解此错误的原因。也就是说,只要您正确地将nonce传递给服务器,就应该能够使用它创建事务。实际上,我已经让它工作了。我将nonce错误地传递给服务器。谢谢:D