Apple Pay - Authorize.net त्रुटि देता है 153 केवल जब लाइव, सैंडबॉक्स काम करता है


14

बहुत सारे लेख खोजने के बाद मुझे अपनी समस्या का हल नहीं मिला।

मैंने अपनी साइट पर ApplePay बटन को एकीकृत किया है और सैंडबॉक्स मोड में सफल लेनदेन किया है । मैं अनुरोध उत्पन्न करने के लिए authorize.net php SDK का उपयोग कर रहा हूं। जब मैंने जीना शुरू किया तो समस्याएं शुरू हो गईं। Authorize.net का संदेश है " भुगतान डेटा संसाधित करने में त्रुटि हुई थी। आवश्यक फ़ील्ड डिक्रिप्ट किए गए डेटा से गायब हैं "

यहाँ मैंने क्या किया है:

  1. लाइव ऑथराइज.नेट अकाउंट से एक के साथ पेमेंट प्रोसेसिंग सर्टिफिकेट को बदल दिया
  2. मैंने उसी भुगतान खाते को प्राधिकृत करने की प्रक्रिया का उपयोग करके क्रेडेंशियल्स को बदला है, मुझे भुगतान प्रक्रिया प्रमाणपत्र मिला है
  3. वास्तविक क्रेडिट कार्ड के साथ लाइव ऐप्पल डिवाइस का उपयोग करें।
  4. मैं प्रथम डेटा नैशविले प्रोसेसर को CC प्रोसेसर के रूप में उपयोग कर रहा हूं जो ApplePay का समर्थन करता है

ध्यान दें कि यदि मैं सैंडबॉक्स मोड में वापस जाता हूं, तो लेनदेन बिना किसी समस्या के पास हो जाएगा।

अनुरोध और विफल प्रतिक्रिया निम्नानुसार है:

निवेदन:

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

उत्तर:

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

मैं क्या खो रहा हूँ?

संपादित करें:

यहाँ ApplePay से opaqueData भेजने के बारे में कोड दिया गया है

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

मैंने एक ही परिणाम के साथ अनुरोध में ईमेल और फोन और आईपी पता जोड़ा। संशोधित अनुरोध इस प्रकार है:

{ 
"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
प्रमाणपत्रों को फिर से बनाने की कोशिश की?
मूल रूप से

1
हां, मैंने दर्जनों बार भुगतान प्रसंस्करण प्रमाणपत्रों को पुनर्जीवित किया, यहां तक ​​कि सेब खाते में व्यापारी पहचान को फिर से बनाया।
bksi

1
लेन-देनपसंद -> ग्राहक -> ईमेल खाली है, इसे सेट करने की आवश्यकता हो सकती है, क्या अनुरोध पर सेट किया जाना संभव है?
जनेश बोटिस

1
क्या आप "opaqueData" फ़ील्ड सेट करने से संबंधित कोड पोस्ट कर सकते हैं? जहां यह Apple64 वॉलेट से प्राप्त बेस 64 एनकोडेड टोकन होना चाहिए।
दीनूशांट

2
@Roadowl क्या मामला है मैंने पोस्ट को एडिट किया। ध्यान दें कि वही कोड सैंडबॉक्स मोड में काम करता है। इसके अलावा अनुरोध उत्पन्न होता है, और देखा जा सकता है। यह इतना नहीं है कि यह कैसे उत्पन्न होता है मुझे लगता है।
bksi

जवाबों:


3

यह शायद OpaqueData क्षेत्र में एक डेटा समस्या के कारण है जो ApplePay की तरफ से आता है। तो मेरा सुझाव यह है कि लॉगफ़ाइल में उस टोकन को प्रिंट करें, फिर उसी लाइब्रेरी को मैन्युअल रूप से जांचने के लिए निम्न में से किसी एक का उपयोग करके उसी को डिक्रिप्ट करें कि क्या वहां मौजूद सभी डेटा। आप सैंडबॉक्स पर्यावरण और लाइव वातावरण दोनों के लिए एक ही कर सकते हैं। इसलिए आपको टोकन डेटा में कोई अंतर दिखाई देगा।

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

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


यह है कि यह etsy applepay-php लाइब्रेरी का उपयोग कैसे करता है ।

आपको 'भुगतान प्रसंस्करण प्रमाणपत्र' और Apple की निजी कुंजी (नीचे दिए गए merch.cer और priv.p12 के रूप में संदर्भित) की आवश्यकता होगी। आप इन्हें Apple के Dev Center में जनरेट कर सकते हैं। आपको एंड-यूज़र डिवाइस पर उत्पन्न एक उदाहरण भुगतान टोकन की आवश्यकता होगी और जिस टाइमस्टैम्प पर यह उत्पन्न किया गया था। RSA- एन्क्रिप्टेड टोकन इस तरह दिखना चाहिए:

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

डेमो

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

हां, यह मेरा अगला कदम है। मुझे ऐसा करने में सक्षम होने के लिए अपने भुगतान प्रसंस्करण प्रमाणपत्र उत्पन्न करने होंगे।
bksi

@bksi क्या आप टोकन को डिक्रिप्ट कर सकते हैं?
दिनुशनोट

दुर्भाग्य से अभी भी नहीं। मैं github.com/PayU-EMEA/apple-pay
bksi

-1

जैसा कि यहाँ बताया गया है

कुछ चीजों को देखने के लिए:

  • Apple मर्चेंट आईडी जिसे आप हमारी साइट में दर्ज करते हैं, वह आपके द्वारा Apple साइट पर बनाए गए के समान होना चाहिए। यदि यह अलग है, तो हम भुगतान डेटा को डिक्रिप्ट नहीं कर पाएंगे।
  • ई-कॉमर्स लेनदेन होना चाहिए। पुष्टि करें कि आपका गेटवे खाता कार्ड-नॉट-वर्तमान खाते के रूप में सेट है।
  • सबमिट किया गया डेटा बेस 64 एनकोडेड होना चाहिए। जहां तक ​​मैं बता सकता हूं, आप सही कर रहे हैं, लेकिन दोबारा जांच करें। मुझे नहीं पता कि
    आप जो BLOB वापस पा रहे हैं, वह पहले से ही base64 एनकोडेड है, लेकिन शायद यह सुनिश्चित करने के लिए डबल-चेक करें कि आप इसे डबल-एन्कोडिंग नहीं कर रहे हैं।
  • अपारदर्शी क्षेत्र केवल नहीं होना चाहिए token.paymentData.data। बल्कि, यह जोर से Base64-encodedजौनस स्ट्रिंग का प्रतिनिधित्व करता है token.paymentData object

भुगतान डेटा संसाधित करने में त्रुटि हुई थी।

  • दोनों अपारदर्शी मापदंडों को निर्दिष्ट किया जाना चाहिए।
  • आप कार्ड नंबर या समाप्ति तिथि शामिल नहीं कर सकते।
  • आप ट्रैक डेटा शामिल नहीं कर सकते।
  • ई-कॉमर्स लेन-देन होना चाहिए। पुष्टि करें कि आपका गेटवे खाता एक कार्ड नहीं वर्तमान खाते के रूप में स्थापित है।
  • लेन-देन को प्राधिकृत या अधिकृत करना चाहिए और लेनदेन के प्रकार पर कब्जा करना चाहिए।
  • आप 3DS डेटा शामिल नहीं कर सकते।
  • आपको वह डेटा सबमिट करना होगा जिसे सफलतापूर्वक डिक्रिप्ट किया जा सकता है।
  • डिक्रिप्टेड डेटा अनुरोध सबमिट करने वाले व्यापारी से संबंधित होना चाहिए।
  • सबमिट किया गया डेटा बेस 64 एनकोडेड होना चाहिए।

सुझाव के लिए धन्यवाद। उन सभी को लागू किया जाता है। मुझे यकीन नहीं है कि आपने नोट किया है कि सभी लेनदेन सैंडबॉक्स मोड में गुजरते हैं। मैंने पूरी तरह से नया व्यापारी आईडी बनाया और उसी परिणाम के साथ लेनदेन के लिए इसका इस्तेमाल किया। फिर मैंने सैंडबॉक्स पर वही आईडी वापस लाने की कोशिश की और लेन-देन गुजर रहा है।
बक्शी

@bksi मैंने अपडेट का जवाब दिया है। कृपया सुनिश्चित करें कि आपने सभी चेकलिस्ट को पूरा कर लिया है और फिर भी आप समस्या का सामना कर रहे हैं, फिर नए बंडल आइडेंटिफ़ायर, मर्चेंट आईडी बनाने से लेकर पूरी प्रक्रिया को
विग्नेश कुमार एक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.