Apple Pay - authorize.net yalnızca canlı, korumalı alan çalıştığında 153 hatasını döndürüyor


14

Makaleler çok aradıktan sonra benim sorunum için bir çözüm bulamadık.

ApplePay düğmesini siteme entegre ettim ve sanal alan modunda başarıyla işlemler yaptım . İsteği oluşturmak için authorize.net php SDK kullanıyorum. Sorunlar yaşama geçince başladı. Authorize.net'ten gelen mesaj " Ödeme verileri işlenirken bir hata oluştu. Şifresi çözülmüş verilerde zorunlu alanlar eksik "

İşte ne yaptım:

  1. Ödeme işlem sertifikasını canlı authorize.net hesabından biriyle değiştirdi
  2. Authorize.net ödemelerini aynı canlı hesaba işlemek için kullandığım kimlik bilgilerini değiştirdim, ödeme süreci sertifikasını aldım
  3. Gerçek kredi kartı ile canlı elma cihazı kullanın.
  4. ApplePay'i destekleyen CC işlemci olarak İlk veri Nashville işlemcisini kullanıyorum

Korumalı alan moduna geri dönersem, işlemin sorunsuz bir şekilde geçtiğini unutmayın.

İstek ve başarısız yanıt şu şekildedir:

İstek:

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

Tepki:

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

Neyi kaçırıyorum?

DÜZENLE:

İşte ApplePay'den opaqueData gönderme ile ilgili kod

$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:

İstekte aynı sonucu içeren e-posta, telefon ve ip adresi ekledim. Değiştirilen istek aşağıdaki gibidir:

{ 
"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
Sertifikaları yeniden oluşturmayı denediniz mi?
19'da

1
Evet, ödeme işlem sertifikalarını onlarca kez yeniden oluşturdum, hatta elma hesabında satıcı kimliğini yeniden oluşturdum.
bksi

1
transactionRequest -> müşteri -> e-posta boş, ayarlanması gerekebilir, istek üzerine ayarlanması mümkün müdür?
Jannes Botis

1
"OpaqueData" alanı ayarıyla ilgili kodu gönderebilir misiniz? ApplePay cüzdanından alınan base64 kodlu belirteç nerede olmalıdır.
DinushaNT

2
@Roadowl sorun nedir. Gönderiyi düzenledim. Aynı kodun korumalı alan modunda çalıştığını unutmayın. Ayrıca istek oluşturulur ve görülebilir. Bence nasıl üretildiğini pek düşünmüyorum.
bksi

Yanıtlar:


3

Bunun nedeni büyük olasılıkla ApplePay tarafından gelen OpaqueData alanındaki bir veri sorunudur. Benim önerim, bu belirteci günlük dosyasında yazdırmak ve ardından tüm verilerin orada olup olmadığını el ile kontrol etmek için aşağıdaki kitaplıklardan birini kullanarak aynı şifreyi çözmek. Aynı işlemi hem Korumalı Alan ortamı hem de Canlı ortam için yapabilirsiniz. Böylece jeton verilerinde herhangi bir fark göreceksiniz.

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

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


Etsy applepay-php kütüphanesini kullanarak böyle yapar .

Apple'dan bir 'Ödeme İşleme Sertifikası' ve özel bir anahtara ihtiyacınız olacaktır (aşağıda merch.cer ve priv.p12 olarak anılacaktır). Bunları Apple'ın Dev Center'da oluşturabilirsiniz. Ayrıca, bir son kullanıcı cihazında oluşturulan örnek bir ödeme belirtecine ve oluşturulduğu zaman damgasına da ihtiyacınız olacaktır. RSA şifreli bir simge şöyle görünmelidir:

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

gösteri

$ # 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>

Evet, bu benim bir sonraki adımım. Bunu yapabilmek için ödeme işleme sertifikalarımı oluşturmam gerekiyor.
bksi

@bksi jetonların şifresini çözebilir misiniz?
DinushaNT

Ne yazık ki hala hayır. Github.com/PayU-EMEA/apple-pay
bksi

-1

As söz burada

Bakmanız gereken birkaç şey:

  • Sitemize girdiğiniz Apple Satıcı Kimliği, Apple sitesinde oluşturduğunuzla aynı olmalıdır. Farklıysa, ödeme verilerinin şifresini çözemeyiz.
  • Bir e-ticaret işlemi olmalı. Ağ geçidi hesabınızın kart olmayan bir hesap olarak ayarlandığını doğrulayın.
  • Gönderilen veriler base64 kodlu olmalıdır. Anlayabildiğim kadarıyla, bunu doğru yapıyorsun, ama iki kez kontrol et.
    Geri aldığınız BLOB'un base64 kodlu olup olmadığını bilmiyorum , ancak çift kodlamadığınızdan emin olmak için belki iki kez kontrol edin.
  • opaqueData alanı sadece OLMAMALIDIR token.paymentData.data. Aksine, Base64-encodedtamamını temsil eden bir JSON dizesi olmalıdır token.paymentData object.

Ödeme verileri işlenirken bir hata oluştu.

  • Her iki opak parametre de belirtilmelidir.
  • Kart numarası veya son kullanma tarihi ekleyemezsiniz.
  • Parça verilerini ekleyemezsiniz.
  • E-ticaret işlemi olmalı. Ağ geçidi hesabınızın Kart Bulunamadı hesabı olarak ayarlandığını doğrulayın.
  • İşlem yetkilendirme veya işlem türünü yetkilendirmeli ve yakalamalıdır.
  • 3DS verilerini ekleyemezsiniz.
  • Şifresi başarıyla çözülebilen veriler göndermelisiniz.
  • Şifresi çözülen veriler, talebi gönderen satıcıya ait olmalıdır.
  • Gönderilen veriler base64 kodlu olmalıdır.

Önerileriniz için teşekkürler. Hepsi uygulanır. Korumalı alan modundayken tüm işlemlerin geçtiğini belirttiğinizden emin değilim. Tamamen yeni satıcı kimliği oluşturdum ve aynı sonuçtaki işlemler için kullandım. Sonra sanal alanda aynı kimliği denedim ve işlemler geçiyor.
bksi

@bksi Cevabı güncelledim. Lütfen tüm kontrol listelerini tamamladığınızdan ve hala sorunla karşılaştığınızdan emin olun, ardından yeni paket tanımlayıcısı, satıcı kimliği oluşturmak, paket kimliğine ve yetkilendirme portalına kaydolmak, Yetkilendirme portalından yeni bir CSR oluşturmak için tüm işlemi yeniden yapmayı
Vignesh Kumar A
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.