Apple Pay - authorize.net gibt den Fehler 153 nur zurück, wenn die Sandbox live funktioniert

14

Nachdem ich viele Artikel durchsucht hatte, konnte ich keine Lösung für mein Problem finden.

Ich habe die ApplePay-Schaltfläche auf meiner Website integriert und erfolgreich Transaktionen im Sandbox-Modus durchgeführt . Ich verwende authorize.net PHP SDK, um die Anfrage zu generieren. Die Probleme begannen, als ich zum Leben wechselte. Die Meldung von authorize.net lautet "Beim Verarbeiten der Zahlungsdaten ist ein Fehler aufgetreten. Erforderliche Felder fehlen in den entschlüsselten Daten. "

Hier was ich getan habe:

  1. Das Zahlungsverarbeitungszertifikat wurde durch ein Zertifikat aus dem Live-Konto authorize.net geändert
  2. Die Anmeldeinformationen, die ich zum Verarbeiten von Authorize.net-Zahlungen auf dasselbe Live-Konto verwende, wurden geändert. Ich habe das Zahlungsprozesszertifikat erhalten
  3. Verwenden Sie ein Live-Apple-Gerät mit einer echten Kreditkarte.
  4. Ich verwende den First Data Nashville-Prozessor als CC-Prozessor, der ApplePay unterstützt

Beachten Sie, dass die Transaktion ohne Probleme erfolgreich ist, wenn ich wieder in den Sandbox-Modus wechsle.

Die Anfrage und die fehlgeschlagene Antwort folgen:

Anfrage:

{ 
    "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"
                    }
                ]
            }
        }
    }
}

Antwort:

{
    "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."
            }
        ]
    }
}

Was vermisse ich?

BEARBEITEN:

Hier ist der Code zum Senden von opaqueData von 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:

Ich habe der Anfrage eine E-Mail-, Telefon- und IP-Adresse mit demselben Ergebnis hinzugefügt. Die geänderte Anfrage folgt:

{ 
"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"
                }
            ]
        }
    }
}

}}

bksi
quelle
1
Sie haben versucht, Zertifikate neu zu generieren?
Mully
1
Ja, ich habe die Zahlungsverarbeitungszertifikate ein Dutzend Mal neu generiert und sogar die Händleridentität im Apple-Konto neu erstellt.
Bksi
1
transactionRequest -> Kunde -> E-Mail ist leer. Möglicherweise muss sie festgelegt werden. Kann sie auf Anfrage festgelegt werden?
Jannes Botis
1
Können Sie den Code für die Einstellung des Felds "opaqueData" veröffentlichen? Wo sollte es das Base64-codierte Token sein, das von der ApplePay-Brieftasche empfangen wurde?
DinushaNT
2
@ Roadowl was ist los. Ich habe den Beitrag bearbeitet. Beachten Sie, dass derselbe Code im Sandbox-Modus funktioniert. Auch die Anfrage wird generiert und ist sichtbar. Es macht nicht viel damit zu tun, wie es erzeugt wird, denke ich.
Bksi

Antworten:

3

Dies ist höchstwahrscheinlich auf ein Datenproblem im OpaqueData-Feld zurückzuführen, das von der ApplePay-Seite stammt. Mein Vorschlag ist also, dieses Token in der Protokolldatei zu drucken und es dann mit einer der folgenden Bibliotheken zu entschlüsseln, um manuell zu überprüfen, ob alle Daten dort vorhanden sind. Sie können dasselbe sowohl für die Sandbox-Umgebung als auch für die Live-Umgebung tun. Sie werden also einen Unterschied bei den Token-Daten feststellen.

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

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


So funktioniert es mit der etsy applepay-php Bibliothek.

Sie benötigen ein 'Zahlungsverarbeitungszertifikat' und einen privaten Schlüssel von Apple (im Folgenden als Merch.cer und priv.p12 bezeichnet). Sie können diese im Apple Dev Center generieren. Sie benötigen außerdem ein Beispiel für ein Zahlungstoken, das auf einem Endbenutzergerät generiert wurde, und den Zeitstempel, zu dem es generiert wurde. Ein RSA-verschlüsseltes Token sollte folgendermaßen aussehen:

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

Demo

$ # 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>
DinushaNT
quelle
Ja, das ist mein nächster Schritt. Ich muss meine Zahlungsverarbeitungszertifikate erstellen, um dies tun zu können.
Bksi
@bksi könntest du die Token entschlüsseln?
DinushaNT
Leider noch nein. Ich versuche, github.com/PayU-EMEA/apple-pay
bksi
-1

Wie hier erwähnt

Ein paar Dinge zu sehen:

  • Die Apple-Händler-ID, die Sie auf unserer Website eingeben, muss mit der ID identisch sein, die Sie auf der Apple-Website erstellt haben. Wenn dies anders ist, können wir die Zahlungsdaten nicht entschlüsseln.
  • Muss eine E-Commerce-Transaktion sein. Vergewissern Sie sich, dass Ihr Gateway-Konto als Konto ohne Karte eingerichtet ist.
  • Die übermittelten Daten müssen base64-codiert sein. Soweit ich das beurteilen kann, machen Sie das richtig, aber überprüfen Sie es noch einmal. Ich weiß nicht, ob das BLOB, das
    Sie zurückerhalten, bereits Base64-codiert ist, aber überprüfen Sie es möglicherweise noch einmal, um sicherzustellen, dass Sie es nicht doppelt codieren.
  • Das opaqueData- Feld sollte NICHT gerecht sein token.paymentData.data. Es sollte sich vielmehr um eine Base64-encodedJSON-Zeichenfolge handeln, die das gesamte Zeichen darstellt token.paymentData object.

Bei der Verarbeitung der Zahlungsdaten ist ein Fehler aufgetreten.

  • Beide undurchsichtigen Parameter müssen angegeben werden.
  • Sie können weder die Kartennummer noch das Ablaufdatum angeben.
  • Sie können keine Trackdaten einschließen.
  • Muss eine E-Commerce-Transaktion sein. Bestätigen Sie, dass Ihr Gateway-Konto als Konto "Karte nicht vorhanden" eingerichtet ist.
  • Die Transaktion muss autorisiert sein oder die Art der Transaktion autorisieren und erfassen.
  • Sie können keine 3DS-Daten einschließen.
  • Sie müssen Daten senden, die erfolgreich entschlüsselt werden können.
  • Entschlüsselte Daten müssen dem Händler gehören, der die Anfrage sendet.
  • Die übermittelten Daten müssen base64-codiert sein.
Vignesh Kumar A.
quelle
Danke für die Vorschläge. Alle von ihnen werden angewendet. Ich bin nicht sicher, ob Sie bemerkt haben, dass alle Transaktionen im Sandbox-Modus erfolgreich sind. Ich habe eine völlig neue Händler-ID erstellt und diese für die Transaktionen mit demselben Ergebnis verwendet. Dann habe ich die gleiche ID wieder in der Sandbox ausprobiert und die Transaktionen werden übergeben.
Bksi
@bksi Ich habe die Antwort aktualisiert. Stellen Sie sicher, dass Sie alle Checklisten ausgefüllt haben und das Problem weiterhin besteht. Versuchen Sie dann , den gesamten Vorgang erneut durchzuführen, indem Sie eine neue Bundle-ID, Händler-ID, Registrierung für die Bundle-ID und auf dem Autorisierungsportal erstellen und eine neue CSR aus dem Autorisierungsportal und erstellen Erstellen eines neuen Zahlungsverarbeitungszertifikats für Apple-Entwickler und Verwenden der 3DS-Zahlungsart
Vignesh Kumar A