Cybersource - Как избежать двойных звонков для кредитной карты - PullRequest
0 голосов
/ 08 апреля 2020

Я работаю над проектом C#, который должен отменить / возместить расходы на карту клиента.

Как я понимаю из документации, если расчет еще не был обработан ( с помощью пакетной обработки один раз в день) появляется возможность аннулировать захват. Если операция захвата void успешна, вы также должны аннулировать предварительную авторизацию, чтобы снять удержание суммы с карты клиента. Если, с другой стороны, захват был обработан, то вы должны зачислить карту клиента.

Чтобы попытаться добиться этого, у меня есть следующий (расширенный и упрощенный) код ...

    public class RefundData
    {
        public string PreauthMerchantRefId { get; set; }
        public string CaptureMerchantRefId { get; set; }
        public string PreauthRequestId { get; set; }
        public string CaptureRequestId { get; set; }
        public double Amount { get; set; }
    }

    private bool SendRequest(RequestMessage request)
    {
        try
        {
            TransactionProcessorClient proc = new TransactionProcessorClient(
                new BasicHttpsBinding(BasicHttpsSecurityMode.TransportWithMessageCredential),
                new EndpointAddress(DEV_PROCESSOR_URL));
            proc.ChannelFactory.Credentials.UserName.UserName = request.merchantID;
            proc.ChannelFactory.Credentials.UserName.Password = DEV_TRANSACTION_KEY;

            return proc.runTransaction(request).reasonCode == "100";
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
    }
    .
    .
    .
    public bool ProcessRefund(RefundData refundData)
    {
        // First try to void the capture
        var nextRequest = new RequestMessage()
        {
            merchantID = MERCHANT_ID,
            merchantReferenceCode = refundData.CaptureMerchantRefId,
            purchaseTotals = new PurchaseTotals()
            {
                currency = "USD",
                grandTotalAmount = refundData.Amount.ToString("0.00")
            },
            voidService = new VoidService()
            {
                run = "true",
                voidRequestID = refundData.CaptureRequestId,
            },
            clientLibrary = ".NET WCF",
            clientLibraryVersion = Environment.Version.ToString(),
            clientEnvironment =
                        Environment.OSVersion.Platform +
                        Environment.OSVersion.Version.ToString()
        };

        if (this.SendRequest(nextRequest))
        {
            // Voiding the capture was good. Now try to void the
            // pre-auth so any hold on the funds are removed from
            // the customer's card.
            nextRequest = new RequestMessage()
            {
                merchantID = MERCHANT_ID,
                merchantReferenceCode = refundData.PreauthMerchantRefId,
                purchaseTotals = new PurchaseTotals()
                {
                    currency = "USD",
                    grandTotalAmount = refundData.Amount.ToString("0.00")
                },
                ccAuthReversalService = new CCAuthReversalService()
                {
                    run = "true",
                    authRequestID = refundData.PreauthRequestId,
                },
                clientLibrary = ".NET WCF",
                clientLibraryVersion = Environment.Version.ToString(),
                clientEnvironment =
                        Environment.OSVersion.Platform +
                        Environment.OSVersion.Version.ToString()
            };

            // Cybersource test server always returns reasonCode "242"
            return this.SendRequest(nextRequest);
        }

        // Window to void the capture must be closed. Just credit the
        // customer's card...
        nextRequest = new RequestMessage()
        {
            merchantID = MERCHANT_ID,
            merchantReferenceCode = refundData.CaptureMerchantRefId,
            purchaseTotals = new PurchaseTotals()
            {
                currency = "USD",
                grandTotalAmount = refundData.Amount.ToString("0.00")
            },
            ccCreditService = new CCCreditService()
            {
                captureRequestID = refundData.CaptureRequestId,
                run = "true"
            },
            clientLibrary = ".NET WCF",
            clientLibraryVersion = Environment.Version.ToString(),
            clientEnvironment =
                    Environment.OSVersion.Platform +
                    Environment.OSVersion.Version.ToString()
        };

        // Cybersource test server always returns reasonCode "100" -
        // even if this has already been fully refunded.
        return this.SendRequest(nextRequest);
    }

Итак, здесь я хочу выполнить две вещи sh:

1) По возможности отменить захват (если это возможно, затем также аннулировать предварительную авторизацию). Если аннулировать захват слишком поздно, верните клиенту кредит, выдав на его карту кредит.

2) Избегайте зачисления на карту клиента более одного раза.

Что касается пункта 1 Я обнаружил, что попытка аннулировать предварительную авторизацию всегда возвращает «242», что, как я понимаю, означает отсутствие соответствующей транзакции. Но есть. Я вижу это в интерфейсе. Является ли это аннулирование предварительной аутентификации никогда не необходимым или только иногда необходимым?

Но проблема 2 - более серьезная проблема: потому что все они являются последующими транзакциями (я всегда ссылаюсь на RequestId для связанной предварительной аутентификации или захват), я предполагал, что Cybersource будет запрещать зачисление карты на сумму, превышающую первоначальный связанный захват. Кажется, это не так. По крайней мере, на тестовом сервере я могу сделать столько дополнительных кредитов для одного расчета, сколько захочу.

Итак, у меня есть два вопроса:

1) Я делаю что-то не так в отношении отмены предварительной авторизации после отмены захвата? Является ли это даже необходимым?

2) Есть ли способ обеспечить, чтобы, если мой метод вызывался более одного раза, одна и та же покупка / расчет не была возвращена более одного раза, и на карту клиента потенциально зачислялось бесконечное количество раз? количество раз?

Я должен упомянуть, что обнаружил, что если вы «аннулируете» захват сразу после выдачи кредита, то становится невозможным снова кредитовать карту. Но я не уверен, что это правильно.

Любое понимание будет оценено.

...