Apple Pay - authorize.net restituisce l'errore 153 solo quando funziona live, sandbox funziona


14

Dopo aver cercato molti articoli non sono riuscito a trovare una soluzione al mio problema.

Ho integrato il pulsante ApplePay sul mio sito e ho effettuato con successo transazioni in modalità sandbox . Sto usando l'SDK php di autorize.net per generare la richiesta. I problemi sono iniziati quando sono passato al live. Il messaggio da authorize.net è " Si è verificato un errore durante l'elaborazione dei dati di pagamento. I campi obbligatori mancano nei dati decrittati "

Ecco cosa ho fatto:

  1. Modificato il certificato di elaborazione del pagamento con uno dall'account live autorize.net
  2. Modificate le credenziali che sto utilizzando per elaborare i pagamenti di authorize.net sullo stesso account live, ho ottenuto il certificato della procedura di pagamento
  3. Usa un dispositivo Apple live con una vera carta di credito.
  4. Sto usando il processore Nashville First Data come processore CC che supporta ApplePay

Se torno alla modalità sandbox, la transazione passa senza problemi.

Di seguito la richiesta e la risposta non riuscita:

Richiesta:

{ 
    "createTransactionRequest":{ 
        "merchantAuthentication":{ 
            "name":"xxxxxxxxx",
            "transactionKey":"xxxxxxxxxxx"
        },
        "clientId":"sdk-php-2.0.0",
        "refId":"ref1575669789",
        "transactionRequest":{ 
            "transactionType":"authOnlyTransaction",
            "amount":"14.08",
            "payment":{ 
                "opaqueData":{ 
                    "dataDescriptor":"COMMON.APPLE.INAPP.PAYMENT",
                    "dataValue":"eyJ2ZXJzaW9u...Q1OSJ9fQ=="
                }
            },
            "order":{ 
                "invoiceNumber":"63059-191206",
                "description":"xxxxxxxxx, xxxxxxxxxxxx v9.0.12 (Order# 63059-191206)"
            },
            "customer":{ 
                "type":"individual",
                "email":""
            },
            "billTo":{ 
                "firstName":"xxxxxxx",
                "lastName":"xxxxxxx",
                "address":"xxxx San Remo Cir ",
                "city":"Vista",
                "state":"CA",
                "zip":"92084",
                "country":"US"
            },
            "retail":{ 
                "marketType":0,
                "deviceType":8
            },
            "transactionSettings":{ 
                "setting":[ 
                    { 
                        "settingName":"duplicateWindow",
                        "settingValue":"60"
                    }
                ]
            }
        }
    }
}

Risposta:

{
    "transactionResponse":{
        "responseCode":"3",
        "authCode":"",
        "avsResultCode":"P",
        "cvvResultCode":"",
        "cavvResultCode":"",
        "transId":"0",
        "refTransID":"",
        "transHash":"",
        "testRequest":"0",
        "accountNumber":"",
        "accountType":"",
        "errors":[
            {
                "errorCode":"153",
                "errorText":"There was an error processing the payment data. Required fields are missing from decrypted data."
            }
        ],
        "transHashSha2":"",
        "SupplementalDataQualificationIndicator":0
    },
    "refId":"ref1575669789",
    "messages":{
        "resultCode":"Error",
        "message":[
            {
                "code":"E00027",
                "text":"The transaction was unsuccessful."
            }
        ]
    }
}

Cosa mi sto perdendo?

MODIFICARE:

Ecco il codice relativo all'invio di opaqueData da ApplePay

$transactionMode = $cc_authorize_mode == $this->MODE_TEST ? \net\authorize\api\constants\ANetEnvironment::SANDBOX : \net\authorize\api\constants\ANetEnvironment::PRODUCTION;
$merchantAuthentication = new AnetAPI\MerchantAuthenticationType();
$merchantAuthentication->setName($cc_authorize_loginid);
$merchantAuthentication->setTransactionKey($cc_authorize_txnkey);

// Set the transaction's refId
$refId = 'ref' . time();
$phoneNumber = ! empty($co_b_phone) ? $co_b_phone : $co_phone;
$customerEmail = ! empty($co_b_email) ? $co_b_email : $co_email;
$ip = lloader()->getUtilByName('ip')->getClientIp();

// Create order information
$order = new AnetAPI\OrderType();
$order->setInvoiceNumber($order_number);
$order->setDescription($this->getOrderPostedByMessage($id_order, $order_number));

// Set the customer's Bill To address
$customerAddress = new AnetAPI\CustomerAddressType();
$customerAddress->setFirstName($co_ccholder_firstname);
$customerAddress->setLastName($co_ccholder_lastname);
if (! empty($co_b_company)) { $customerAddress->setCompany($co_b_company); }
$customerAddress->setAddress($co_b_address." ".$co_b_address2);
$customerAddress->setCity($co_b_city);
$bState = f_isUSState($co_b_state) ? $STATES_XX[$co_b_state] : $STATES[$co_b_state];
$customerAddress->setState($bState);
$customerAddress->setZip($co_b_zip);
$customerAddress->setCountry($countriesISO2[$co_country]);
$customerAddress->setPhoneNumber($phoneNumber);
$customerAddress->setEmail($customerEmail);

// Set the customer's identifying information
$customerData = new AnetAPI\CustomerDataType();
$customerData->setType("individual");
if ( ! empty($member_row['id'])) { $customerData->setId($member_row['id']); }
$customerData->setEmail($customerEmail);


// Add values for transaction settings
$duplicateWindowSetting = new AnetAPI\SettingType();
$duplicateWindowSetting->setSettingName("duplicateWindow");
$duplicateWindowSetting->setSettingValue("60");

// Create a TransactionRequestType object and add the previous objects to it
$transactionRequestType = new AnetAPI\TransactionRequestType();
$transactionRequestType->setCustomerIP($ip);
$transactionRequestType->setTransactionType($this->api_trtype_map[$transactionType]);
if (empty($this->applePayPaymentData)) {
            // Normal CC request
            // Create the payment data for a credit card
            ...
} else {
    $retail = new AnetAPI\TransRetailInfoType();
    $retail->setMarketType('0');
    $retail->setDeviceType('8');
    $transactionRequestType->setRetail($retail);

    // Apple Pay Token Request
    $op = new AnetAPI\OpaqueDataType();
    $op->setDataDescriptor("COMMON.APPLE.INAPP.PAYMENT");
    $paymentToken = base64_encode($this->applePayPaymentData);
    $op->setDataValue($paymentToken);
    $payment = new AnetAPI\PaymentType();
    $payment->setOpaqueData($op);
}

$transactionRequestType->setAmount($grandTotal);
$transactionRequestType->setOrder($order);
$transactionRequestType->setPayment($payment);
$transactionRequestType->setBillTo($customerAddress);
$transactionRequestType->setCustomer($customerData);
$transactionRequestType->addToTransactionSettings($duplicateWindowSetting);

// Assemble the complete transaction request
$request = new AnetAPI\CreateTransactionRequest();
$request->setMerchantAuthentication($merchantAuthentication);
$request->setRefId($refId);
$request->setTransactionRequest($transactionRequestType);

// Create the controller and get the response
$controller = new AnetController\CreateTransactionController($request);
$response = $controller->executeWithApiResponse($transactionMode);
if ($response != null) {
    if ($response->getMessages()->getResultCode() == "Ok") {
       ...
       if ($tresponse != null && $tresponse->getMessages() != null) {
          ...
          return true;
       } else {
          if ($tresponse->getErrors() != null) {
             ...
          }
       }
        ...
    }
    ...
}

EDIT2:

Ho aggiunto e-mail e telefono e indirizzo IP nella richiesta con lo stesso risultato. La richiesta modificata è la seguente:

{ 
"createTransactionRequest":{ 
    "merchantAuthentication":{ 
        "name":"**********",
        "transactionKey":"***************"
    },
    "clientId":"sdk-php-2.0.0",
    "refId":"ref1576180306",
    "transactionRequest":{ 
        "transactionType":"authOnlyTransaction",
        "amount":"14.08",
        "payment":{ 
            "opaqueData":{ 
                "dataDescriptor":"COMMON.APPLE.INAPP.PAYMENT",
                "dataValue":"eyJ2ZXJzaW9uIj...DFiZiJ9fQ=="
            }
        },
        "order":{ 
            "invoiceNumber":"63117-191212",
            "description":"******************* v9.0.12 (Order# 63117-191212)"
        },
        "customer":{ 
            "type":"individual",
            "email":"*********@gmail.com"
        },
        "billTo":{ 
            "firstName":"Gabe",
            "lastName":"Garcia",
            "address":"********* Cir ",
            "city":"Vista",
            "state":"CA",
            "zip":"92084",
            "country":"US",
            "phoneNumber":"**************",
            "email":"**********@gmail.com"
        },
        "customerIP":"************",
        "retail":{ 
            "marketType":"0",
            "deviceType":"8"
        },
        "transactionSettings":{ 
            "setting":[ 
                { 
                    "settingName":"duplicateWindow",
                    "settingValue":"60"
                }
            ]
        }
    }
}

}


1
Hai provato a rigenerare i certificati?
Mully,

1
Sì, ho rigenerato i certificati di elaborazione dei pagamenti dozzine di volte, anche ricreato l'identità del commerciante nel conto Apple.
bksi,

1
transactionRequest -> cliente -> l'email è vuota, potrebbe essere necessario impostarla, è possibile impostare su richiesta?
Jannes Botis,

1
Puoi pubblicare il codice relativo all'impostazione del campo "opaqueData"? Dove dovrebbe essere il token con codifica base64 ricevuto dal portafoglio ApplePay.
Dinusha del

2
@Roadowl qual è il problema. Ho modificato il post. Si noti che lo stesso codice funziona in modalità sandbox. Anche la richiesta viene generata e può essere visualizzata. Penso che non sia molto importante il modo in cui viene generato.
bksi,

Risposte:


3

Ciò è probabilmente dovuto a un problema di dati nel campo OpaqueData che proviene dal lato ApplePay. Quindi il mio suggerimento è di stampare quel token nel file di log, quindi decrittografare lo stesso usando una delle seguenti librerie per verificare manualmente se tutti i dati sono presenti lì. Puoi fare lo stesso sia per l'ambiente Sandbox sia per l'ambiente Live. Quindi vedrai qualsiasi differenza nei dati dei token.

https://github.com/PayU-EMEA/apple-pay

https://github.com/etsy/applepay-php


Ecco come funziona usando la libreria etsy applepay-php .

Avrai bisogno di un "Certificato di elaborazione dei pagamenti" e di una chiave privata di Apple (di seguito denominata merch.cer e priv.p12). Puoi generarli nel Dev Center di Apple. Sarà inoltre necessario un token di pagamento di esempio generato su un dispositivo dell'utente finale e il timestamp in cui è stato generato. Un token crittografato con RSA dovrebbe essere simile al seguente:

{
 "data": "<base64>",
 "header": {
     "applicationData": "<hex_optional>"
     "wrappedKey": "<base64>",
     "publicKeyHash": "<base64>",
     "transactionId": "<hex>"
 },
 "signature": "<base64>",
 "version": "RSA_v1"
}

dimostrazione

$ # Copy in your payment processing cert and test token
$ cd examples
$ cp /secret/place/merch.cer .
$ cp /secret/place/token.json .
$
$ # Extract private key from cert
$ openssl pkcs12 -export -nocerts -inkey merch.key -out priv.p12 -password 'pass:'
$
$ # Get intermediate and root certs from Apple
$ wget -O int.cer 'https://www.apple.com/certificateauthority/AppleAAICAG3.cer'
$ wget -O root.cer 'https://www.apple.com/certificateauthority/AppleRootCA-G3.cer'
$
$ # Verify chain of trust
$ openssl x509 -inform DER -in merch.cer -pubkey > pub.pem
$ openssl x509 -inform DER -in root.cer > root.pem
$ openssl x509 -inform DER -in int.cer > int_merch.pem
$ openssl x509 -inform DER -in merch.cer >> int_merch.pem
$ openssl verify -verbose -CAfile root.pem int_merch.pem # should output OK
$
$ # Run demo
$ cd ..
$ php -denable_dl=on -dextension=`pwd`/modules/applepay.so examples/decrypt.php -p <privkey_pass> -c examples/token.json -t <time_of_transaction>

Sì, questo è il mio prossimo passo. Devo generare i miei certificati di elaborazione dei pagamenti per poterlo fare.
bksi,

@bksi potresti decrittografare i token?
DinushaNT

Purtroppo ancora no. Sto provando a utilizzare github.com/PayU-EMEA/apple-pay
bksi il

-1

Come menzionato qui

Un paio di cose da guardare:

  • L'ID commerciante Apple che inserisci nel nostro sito deve essere identico a quello che hai creato sul sito Apple. Se è diverso, non saremo in grado di decrittografare i dati di pagamento.
  • Deve essere una transazione e-commerce. Verifica che il tuo account gateway sia impostato come un account con carta non presente.
  • I dati inviati devono essere codificati in base64. Per quanto ne so, lo stai facendo bene, ma ricontrolla. Non so se il BLOB
    che stai recuperando sia già codificato in base64, ma forse ricontrolla per assicurarti di non codificarlo due volte.
  • Il campo opaqueData NON dovrebbe essere giusto token.paymentData.data. Piuttosto, dovrebbe essere una Base64-encodedstringa JSON che rappresenta l'intero token.paymentData object.

Si è verificato un errore durante l'elaborazione dei dati di pagamento.

  • È necessario specificare entrambi i parametri opachi.
  • Non è possibile includere il numero della carta o la data di scadenza.
  • Non puoi includere i dati della traccia.
  • Deve essere una transazione e-commerce. Verifica che il tuo account gateway sia impostato come account Card Not Present.
  • La transazione deve essere autorizzazione o autorizzazione e acquisizione del tipo di transazione.
  • Non è possibile includere dati 3DS.
  • È necessario inviare dati che possono essere decifrati correttamente.
  • I dati decrittografati devono appartenere al commerciante che invia la richiesta.
  • I dati inviati devono essere codificati in base64.

Grazie per i suggerimenti Tutti sono applicati. Non sono sicuro che tu abbia notato che tutte le transazioni passano in modalità sandbox. Ho creato un ID commerciante completamente nuovo e l'ho usato per le transazioni con lo stesso risultato. Quindi ho provato lo stesso ID su sandbox e le transazioni stanno passando.
bksi,

@bksi Ho una risposta aggiornata. Assicurati di aver completato tutte le liste di controllo e stai ancora affrontando il problema, quindi prova a ripetere l'intero processo dalla creazione di un nuovo identificativo di bundle, ID commerciante, registrandolo su ID bundle e sul portale di autorizzazione, generando un nuovo CSR dal portale di autorizzazione e creazione di un nuovo certificato di elaborazione dei pagamenti su Apple Developer e utilizzo del tipo di pagamento 3DS
Vignesh Kumar A
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.