Omnipay Netbanx проблема с ошибками государства и страны

1

Я занимаюсь внедрением Netbanx в качестве платежного шлюза с использованием библиотеки PHP Omnipay, но у меня возникают проблемы с ошибками, относящимися к строкам "Node: state" и "Node: country", которые меньше, чем грань minLength.

Примечание. Я использую тестовые учетные данные, предоставленные мне при регистрации для учетной записи разработчика в Netbanx, и проверьте данные CC, перечисленные в их документации, здесь: docs.

Вот фрагмент кода из моего класса оплаты:

class NetbanxPayment
{
    /**
     * Initialize payment gateway.
     *
     * @param string $accountNumber
     * @param string $storeId
     * @param string $storePassword
     * @param bool   $testMode
     */
    public function __construct($accountNumber, $storeId, $storePassword, $testMode = false)
    {
        $omnipay = new Omnipay;

        $this->gateway = $omnipay->create('NetBanx');

        $this->gateway->setAccountNumber($accountNumber);
        $this->gateway->setStoreId($storeId);
        $this->gateway->setStorePassword($storePassword);
        $this->gateway->setTestMode($testMode);
    }

    /**
     * Handle making the purchase
     *
     * @param       $amount
     * @param array $data
     *
     * @return \AwardForce\Modules\Payments\Contracts\Response
     */
    public function purchase($amount, $data = [])
    {
        $card = new CreditCard();

        $card->setNumber(array_get($data, 'cardNumber', ''));
        $card->setExpiryMonth(array_get($data, 'expiryMonth', ''));
        $card->setExpiryYear(array_get($data, 'expiryYear', ''));
        $card->setCvv(array_get($data, 'cvv', null));
        $card->setBillingAddress1(array_get($data, 'street', ''));
        $card->setBillingCity(array_get($data, 'city', ''));
        $card->setBillingPostcode(array_get($data, 'postcode', ''));
        if (array_get($data, 'country', '') == 'US') {
            $card->setBillingState(array_get($data, 'region', ''));
        }
        $card->setBillingCountry(array_get($data, 'country', ''));

        $response = $this->gateway->purchase([
            'amount'   => $amount,
            'currency' => $this->getCurrency(),
            'card'     => $card
        ])->send();

        dd($response);
     }
}

Вот сбрасываемый ответ с ошибками, которые я вижу:

Response {#1404 ▼
  #data: SimpleXMLElement {#1405 ▼
    +"confirmationNumber": "329008300"
    +"decision": "ERROR"
    +"code": "5023"
    +"actionCode": "M"
    +"description": "You submitted a request that is not parseable."
    +"detail": array:4 [▼
      0 => SimpleXMLElement {#1400 ▼
        +"tag": "InternalResponseCode"
        +"value": "24"
      }
      1 => SimpleXMLElement {#1399 }
      2 => SimpleXMLElement {#1398 }
      3 => SimpleXMLElement {#1395 ▼
        +"tag": "ErrorDetail"
        +"value": """
          \n
          Errors: \n
            Node: state, Detail: string length (0) is less than minLength facet (2) for StateV1 in namespace http://www.optimalpayments.com/creditcard/xmlschema/v1\n
            Node: state, Detail: string length (0) is less than minLength facet (2) for StateV1 in namespace http://www.optimalpayments.com/creditcard/xmlschema/v1\n
            Node: country, Detail: string length (0) is less than minLength facet (2) for CountryV1 in namespace http://www.optimalpayments.com/creditcard/xmlschema/v1\n
          """
      }
    ]
    +"txnTime": "2015-10-12T21:20:59.661-04:00"
    +"duplicateFound": "false"
  }
}

Здесь отформатированные XML-данные отправляются Netbankx:

<?xml version="1.0" encoding="UTF-8"?>
<ccAuthRequestV1 xmlns="http://www.optimalpayments.com/creditcard/xmlschema/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.optimalpayments.com/creditcard/xmlschema/v1">
    <merchantAccount>
        <accountNum>********</accountNum>
        <storeID>********</storeID>
        <storePwd />
    </merchantAccount>
    <merchantRefNum>********</merchantRefNum>
    <amount>1.10</amount>
    <card>
        <cardNum>4111111111111111</cardNum>
        <cardExpiry>
            <month>11</month>
            <year>2019</year>
        </cardExpiry>
        <cardType>VI</cardType>
        <cvdIndicator>1</cvdIndicator>
        <cvd>123</cvd>
    </card>
    <billingDetails>
        <cardPayMethod>WEB</cardPayMethod>
        <firstName />
        <lastName />
        <street>123 Some St</street>
        <street2 />
        <city>City</city>
        <state />
        <country>GB</country>
        <zip>1234</zip>
        <phone />
        <email />
    </billingDetails>
</ccAuthRequestV1>

Любая помощь, советы или указатели в правильном направлении относительно того, что может вызывать эти проблемы, будет с благодарностью оценена :)

  • 0
    Подтвердили ли вы, что штат и страна действительно проходят корректно? Ошибка означает, что пустые строки передаются через платежный шлюз, для array_get по умолчанию используется пустая строка, если он не может найти указанный вами ключ, который может быть им.
  • 0
    Привет, Тим, мне показалось, что я узнал дескриптор Dontfeedthecode :) Я только что выполнил тест и жестко запрограммировал значения для состояния и страны, и теперь я получаю только 2 из 3 исходных сообщений об ошибках - одно для состояния и одно для страны.
Показать ещё 3 комментария
Теги:
omnipay
netbanx-api

1 ответ

1

Поэтому, взглянув на документы разработчика для Netbanx, кажется, что он не ожидает, что состояние биллинга и страна станут частью объекта карты.

    "card" => CreditCard {#1094 ▼
      #parameters: ParameterBag {#1342 ▼
        #parameters: array:7 [▼
          "number" => "4530910000012345"
          "expiryMonth" => 11
          "expiryYear" => 2019
          "cvv" => "123"
          "billingPostcode" => "1234"
          "billingState" => "London"
          "billingCountry" => "GB"
        ]
      }

https://developer.optimalpayments.com/en/documentation/card-payments-api/card-object/

API ожидает такой запрос:

     "merchantRefNum" : "demo-1",
     "amount" : 10098,
     "settleWithAuth":true,
     "card" : {
       "cardNum" : "4111111111111111",
       "cardExpiry":{
         "month":2,
         "year":2017
        },
        "cvv":123
      },
      "billingDetails":{
         "street":"100 Queen Street West",
         "city":"Toronto",
         "state":"ON",              
         "country":"CA",
         "zip":"M5H 2N2"
      }
    } '

Вероятно, это проблема с плагином Omnipay, но вам придется изменить его, чтобы данные фактуры отправлялись в правильный объект.

  • 0
    Оказывается, дамп класса Response, который я добавил к вопросу, мог немного вводить в заблуждение. Массив params был просто дампом объекта Card (не представляющим отформатированные данные, передаваемые в Netbanx). Фактический отформатированный XML, который отправляется в Netbanx, теперь добавляется в описание вопроса.
  • 0
    Состояние, кажется, отсутствует в XML?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню