2

我正在尝试将 adyen api 实施到我的项目中,但遇到以下问题:

起初,我收到来自 adyen 的通知回调,其中 AUTHORIZATION 为 true,事务状态为 1,但在此之后,我没有收到任何其他通知。即使支付过程被捕获为真,通知也不会到达。

我已经在 adyen 沙箱中测试了 adyen 通知,并且通知可以正常工作。这是回调文件的代码示例:

if (($eventCode=="AUTHORISATION") && ($success=="true"))
{

    if($paymentRecharge['status']!=0) //Check if status is placed only
    {
        ReleaseTableLock($orderID);

        print('[accepted]');  
        return;
    }

    if (($paymentRecharge['adyen_amount']!=$value) || ($paymentRecharge['currency']!=$currency)) //Check to see if the paid value is the same as our value, otherwise this is Fraud
    {
        SetPaymentStatus($orderID,5);
        ReleaseTableLock($orderID);
        print('[accepted]'); 
        return;
    }

    MarkAsAuthorised($orderID); //changes status to 1 - authorised

    //check if we need to Capture automatically
    if($adyenParams['adyen_capture']==1)
    {
        $adyen = new AdyenGateway();
        $data = array();
        $data["params"] = $adyenParams;

        $data["userId"] = $paymentRecharge['customerId'];
        $response;
        $result=$adyen->Capture($data,$pspReference,$response,$paymentRecharge['userId'],$paymentRecharge['adyen_amount'],$paymentRecharge['currency']);
    }
}

if (($eventCode=="AUTHORISATION") && ($success=="false"))
{
        SetPaymentStatus($orderID,6);
        ReleaseTableLock($orderID);
        print('[accepted]');
        return;
}

if (($eventCode=="CAPTURE") && ($success=="true"))
{
        SetPaymentStatus($orderID,2);
        ProcessPayment($orderID);
}



//Release the payment order lock
ReleaseTableLock($orderID);
print('[accepted]');

为什么会发生这种情况的任何想法?

4

1 回答 1

7

解决方案不在我之前分享的代码示例中。事情是这样发生的 - 像往常一样,我有一个表锁,因为 Adyen 发送并行通知和修改,也许其中一些是针对其他已付款的帐户,如果表锁失败,我会向他们发送一个[失败]响应,而不是[接受]。

Adyen 不接受 [失败] 响应。这样做会导致消息队列被阻止重试。这在文档中明确提到。

他们的系统不理解[失败],只有[接受]。就这件事而言,因为我有一些较旧的付款不断作为来自 Adyen 的通知返回,所以我的系统没有找到它们并且锁定失败,所以我一直向他们发送 [失败] 响应。Adyen 将我置于罚球区,并将我标记为未收到通知。

从 adyen 文档中:

接受通知

在收到通知后的 10 秒内将响应“[accepted]”从您的服务器发送到 Adyen 服务器。我们建议您与处理通知分开接受和回复通知。

在我们的服务器收到此响应后,通知中的所有项目都标记为已收到。

至少一次交付

如果通知传递失败,或者如果无法从响应中确定消息是否传递成功,则会多次发送通知。这种至少一次发送规则意味着您可能会多次收到相同的通知。

重试

只要未明确收到成功的响应,就会定期发送多次通知,并增加时间间隔:

2 分钟 5 分钟 10 分钟 15 分钟 30 分钟 1 小时 2 小时 4 小时 8 小时 第三次尝试失败后,即 2 + 5 + 10 = 17 分钟后,系统消息将显示在 Adyen 客户区 (CA)。然后,系统在接下来的 7 天内继续每 8 小时重试一次。

如果要触发重发尝试,可以向自己发送测试通知:

在客户区域中,转至设置 > 服务器通信。如果操作成功,则重新发送所有排队的通知。否则,您将大致了解我们系统在此之前记录的当前错误。

于 2014-04-01T10:01:43.773 回答