Я нахожусь в процессе реализации Netbanx в качестве шлюза платежей с использованием библиотеки PHP Omnipay, но у меня возникают проблемы с ошибками, связанными с тем, что строки «Node: state» и «Node: country» меньше, чем фасет minLength.
Примечание. Я использую тестовые учетные данные, предоставленные мне при регистрации учетной записи разработчика в Netbanx, и проверяю данные CC, указанные в их документации здесь: документы.
Вот фрагмент кода из моего класса оплаты:
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, отправляемые в Netbanx:
<?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>
Любая помощь, совет или указатели в правильном направлении относительно того, что может быть причиной этих проблем, будет принята с благодарностью 🙂
Поэтому, посмотрев документы разработчика для 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, но вам придется изменить его так, чтобы платежные данные отправлялись в нужном объекте.
Других решений пока нет …