Apple Pay - authorize.net mengembalikan kesalahan 153 hanya ketika live, sandbox berfungsi

14

Setelah mencari banyak artikel saya tidak dapat menemukan solusi untuk masalah saya.

Saya telah mengintegrasikan tombol ApplePay di situs saya dan berhasil melakukan transaksi dalam mode kotak pasir . Saya menggunakan php SDK authorize.net untuk menghasilkan permintaan. Masalahnya dimulai ketika saya beralih ke hidup. Pesan dari authorize.net adalah " Terjadi kesalahan saat memproses data pembayaran. Kolom yang diperlukan hilang dari data yang didekripsi "

Inilah yang telah saya lakukan:

  1. Mengubah sertifikat pemrosesan pembayaran dengan satu dari akun live authorize.net
  2. Mengubah kredensial yang saya gunakan untuk memproses pembayaran authorize.net ke akun langsung yang sama dengan yang saya dapatkan sertifikat proses pembayaran
  3. Gunakan perangkat apple hidup dengan kartu kredit nyata.
  4. Saya menggunakan prosesor Data pertama Nashville sebagai prosesor CC yang mendukung ApplePay

Perhatikan bahwa jika saya beralih kembali ke mode kotak pasir, transaksi berlalu tanpa masalah.

Permintaan dan respons gagal berikut:

Permintaan:

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

Tanggapan:

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

Apa yang saya lewatkan?

EDIT:

Berikut adalah kode mengenai pengiriman opaqueData dari 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:

Saya menambahkan email dan telepon serta alamat ip dalam permintaan dengan hasil yang sama. Permintaan yang dimodifikasi berikut:

{ 
"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
sumber
1
Mencoba membuat ulang sertifikat?
Mully
1
Ya, saya meregenerasi sertifikat pemrosesan pembayaran selusin kali, bahkan membuat ulang identitas pedagang di akun apple.
bksi
1
transactionRequest -> customer -> email kosong, mungkin harus disetel, apakah mungkin diatur atas permintaan?
Jannes Botis
1
Bisakah Anda memposting kode yang terkait dengan pengaturan bidang "opaqueData"? Di mana seharusnya itu token berkode base64 yang diterima dari dompet ApplePay.
DinushaNT
2
@Roadowl ada apa. Saya mengedit posting. Perhatikan bahwa kode yang sama berfungsi dalam mode kotak pasir. Juga permintaan dihasilkan, dan dapat dilihat. Tidak banyak dengan bagaimana itu dihasilkan saya pikir.
bksi

Jawaban:

3

Ini kemungkinan besar karena masalah data di bidang OpaqueData yang berasal dari sisi ApplePay. Jadi saran saya adalah untuk mencetak token itu dalam logfile, kemudian mendekripsi yang sama menggunakan salah satu dari pustaka berikut untuk memeriksa secara manual apakah semua data ada di sana. Anda dapat melakukan hal yang sama untuk lingkungan Sandbox dan lingkungan Live. Jadi, Anda akan melihat perbedaan dalam data token.

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

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


Beginilah caranya menggunakan pustaka etsy applepay-php .

Anda akan memerlukan 'Sertifikat Pemrosesan Pembayaran' dan kunci pribadi dari Apple (disebut sebagai merch.cer dan priv.p12 di bawah). Anda dapat membuatnya di Apple's Dev Center. Anda juga akan memerlukan token pembayaran contoh yang dihasilkan pada perangkat pengguna akhir dan cap waktu yang dihasilkannya. Token terenkripsi RSA akan terlihat seperti ini:

{
 "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
sumber
Ya, itu adalah langkah saya selanjutnya. Saya harus membuat sertifikat pemrosesan pembayaran untuk dapat melakukannya.
bksi
@ bksi bisakah kamu mendekripsi token?
DinushaNT
Sayangnya masih belum. Saya mencoba menggunakan github.com/PayU-EMEA/apple-pay
bksi
-1

Seperti yang disebutkan di sini

Beberapa hal untuk dilihat:

  • ID Apple Merchant yang Anda masukkan ke situs kami harus identik dengan yang Anda buat di situs Apple. Jika berbeda, kami tidak akan dapat mendekripsi data pembayaran.
  • Harus berupa transaksi e-niaga. Konfirmasikan bahwa akun gateway Anda diatur sebagai akun kartu-tidak-hadir.
  • Data yang dikirim harus dienkode base64. Sejauh yang saya tahu, Anda melakukan itu dengan benar, tetapi periksa. Saya tidak tahu apakah BLOB yang
    Anda dapatkan kembali sudah disandikan base64, tapi mungkin periksa ulang untuk memastikan Anda tidak melakukan double-encoding.
  • bidang opaqueData TIDAK boleh adil token.paymentData.data. Sebaliknya, itu harus menjadi Base64-encodedstring JSON yang mewakili keseluruhan token.paymentData object.

Terjadi kesalahan saat memproses data pembayaran.

  • Kedua parameter buram harus ditentukan.
  • Anda tidak dapat memasukkan nomor kartu atau tanggal kedaluwarsa.
  • Anda tidak dapat memasukkan data trek.
  • Harus transaksi E-commerce. Konfirmasikan bahwa akun gateway Anda diatur sebagai akun Kartu Tidak Hadir.
  • Transaksi harus otorisasi atau otorisasi dan menangkap jenis transaksi.
  • Anda tidak dapat memasukkan data 3DS.
  • Anda harus mengirimkan data yang berhasil didekripsi.
  • Data yang didekripsi harus milik pedagang yang mengirimkan permintaan.
  • Data yang dikirim harus dienkode base64.
Vignesh Kumar A
sumber
Terima kasih atas sarannya. Semuanya diterapkan. Saya tidak yakin Anda mencatat bahwa semua transaksi lewat ketika dalam mode kotak pasir. Saya membuat id pedagang yang sepenuhnya baru dan menggunakannya untuk transaksi dengan hasil yang sama. Kemudian saya mencoba id yang sama kembali di kotak pasir dan transaksi lewat.
bksi
@ bksi saya telah memperbarui jawaban. Pastikan Anda telah menyelesaikan semua daftar periksa dan masih menghadapi masalah, kemudian coba lakukan ulang seluruh proses mulai dari membuat pengidentifikasi bundel baru, id pedagang, mendaftar ke bundel id & pada portal otorisasi, menghasilkan CSR baru dari portal Otorisasi dan membuat sertifikat pemrosesan pembayaran baru pada pengembang apel & menggunakan jenis pembayaran 3DS
Vignesh Kumar A