gpt4 book ai didi

android - Trigger.IO 应用内支付重复回调相同的 orderid 不同的签名

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:07 27 4
gpt4 key购买 nike

我们在trigger.io的支付模块遇到了一个奇怪的问题。该流程与 ios 支付完美配合,但在 android 中,一些应用内支付回调在同一秒内被调用两次。收据签名不同,但 orderid、notificationid、purchasetoken 和 developerPayload 都保持不变。当我们尝试验证收据时,结果证明它是真实且正确的。但是当我们看财务报告时,我们只看到一笔付款而不是两笔(因为它可能只是一笔付款但为什么签名不同?)。

为什么 trigger.io 两次调用回调导致产品被购买两次?为什么 android 为一次付款返回 2 个不同且可确认的收据?这是 andorid 端还是 trigger.io 端的错误,因为我无法使用 javascipt 调用回调?或者这是一次已知的黑客尝试?

我们也遇到过完全没有回调,但是刷卡成功的情况。这是一个错误还是针对这种情况有任何解决方法?

这是我开始购买的代码:

if(forge.is.android())
forge.payments.purchaseProduct("someproductname", paymentSuccess, paymentError);

这里是回调函数:

function paymentCallback(data, confirm){

forge.request.ajax({
url: "someurl.php",
dataType: "json",
data:"function=logPayment&action=PaymentCallbackStart",
success: function (data) {
hideLoader();
},
error: function (error) {
hideLoader();
}
});

var productId = data.productId;
var orderId = data.orderId;
var signed_data;

if(forge.is.android())
{
var state = data.purchaseState;
var receipt = encodeURIComponent(data.receipt.signature);
signed_data = encodeURIComponent(data.receipt.data);
}
else if(forge.is.ios())
{
var state = data.PurchaseState;
var receipt = data.receipt.data;
}

forge.request.ajax({
url: "someurl.php",
dataType: "json",
data:"function=logPayment&data=" + encodeURIComponent("birthday=" + gbirthday + "&birthhour=" + gbirthhour + "&name=" + gname + "&gender=" + ggender + "&birthday2=" + gbirthday2 + "&birthhour2=" + gbirthhour2 + "&name2=" + gname2 + "&gender2=" + ggender2 + "&content=" + text + "&ProductID=" + qs.ProductID + "&userId=" + guserId + "&data=" + JSON.stringify(data)) + "&action=PaymentCallback",
success: function (data) {
hideLoader();
},
error: function (error) {
hideLoader();

}
});

if(state == "PURCHASED")
{
if(typeof gbirthday != "undefined")
{
var text = $('#imessagem').val();
forge.request.ajax({
url: "someurl.php",
dataType: "json",
data:"function=askQuestion&birthday=" + encodeURIComponent(gbirthday) + "&birthhour=" + encodeURIComponent(gbirthhour) + "&name=" + encodeURIComponent(gname) + "&gender=" + ggender + "&birthday2=" + encodeURIComponent(gbirthday2) + "&birthhour2=" + encodeURIComponent(gbirthhour2) + "&name2=" + encodeURIComponent(gname2) + "&gender2=" + ggender2 + "&content=" + encodeURIComponent(text) + "&ProductID=" + qs.ProductID + "&userId=" + guserId + "&signed_data=" + signed_data + "&receipt=" + receipt,
success: function (data) {
processPayment(productId,orderId)
hideLoader();
},
error: function (error) {
hideLoader();

forge.request.ajax({
url: "someurl.php",
dataType: "json",
data:"function=logPayment&data=" + encodeURIComponent(JSON.stringify(error)) + "&action=PaymentQuestionError",
success: function (data) {
hideLoader();
},
error: function (error) {
hideLoader();

}
});

}
});

forge.request.ajax({
url: "someurl.php",
dataType: "json",
data:"function=logPayment&data=" + encodeURIComponent(JSON.stringify(data)) + "&action=Payment",
success: function (data) {
hideLoader(); },
error: function (error) {
hideLoader();

}
});
}
if(forge.is.android())
processPayment(productId,orderId);
}
else
{
if(forge.is.ios())
processPayment(productId,orderId);
}
confirm();
}

最佳答案

这称为重放攻击。通常,如果您收到付款(回调,例如 PayPal 的 IPN),您将更新您的数据库。如果他们一次又一次地调用相同的命令,攻击就会失败,因为状态已经设置为 true。

在早期,这是一种常见的攻击。

阅读以下文章:

编辑:我猜你在回调之后在数据库中做了一个插入?最好在回调之前(实际结帐之前)插入订单,并在您的表中创建一个默认设置为 false 的状态字段。回调成功后,您必须更新状态并将其设置为 true。

例如。我想订披萨(店主将我的订单输入系统)。我的收据是我的付款证明(回拨)。比萨饼做好后,我吃了它,但我还是很饿。我回到披萨店,要了一个新的(我可以重复一千遍)。一个简单的解决方案是销毁我的收据或在上面签名(更新状态),这样我就无法再次订购相同的比萨饼。

编辑编辑:当您接受 Paypal 时,请注意拒付“攻击”( http://forums.whirlpool.net.au/archive/2214159 )。

13/05/2014:目前我唯一看到的是您的AJAX 数据属性 格式错误。这不是一个字符串,而是一个对象。这可能不是真正的问题。如果您并不总是收到回调并且您确定您的请求到达了 Google 服务器,我猜这是他们这边(或 Trigger.IO)的问题。我建议您联系 Trigger.IO 以确保您的请求确实到达了他们的服务器。如果是这样,您可以就此问题与 Google 联系,看看他们是否收到了您的所有请求。

forge.request.ajax({
url: "someurl.php",
dataType: "json",
data:{
function(watchOut!! 'function' is a reserved keyword!!) : 'logPayment',
action : 'PaymentCallbackStart'
},
success: function (data) {
hideLoader();
},
error: function (error) {
hideLoader();
}
});

关于android - Trigger.IO 应用内支付重复回调相同的 orderid 不同的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23388918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com