Apple Pay - Authorize.net chỉ trả về lỗi 153 khi hoạt động, hộp cát hoạt động


14

Sau khi tìm kiếm rất nhiều bài viết, tôi không thể tìm ra giải pháp cho vấn đề của mình.

Tôi đã tích hợp nút ApplePay trên trang web của mình và thực hiện thành công các giao dịch ở chế độ hộp cát . Tôi đang sử dụng SDK php của Authorize.net để tạo yêu cầu. Các vấn đề bắt đầu khi tôi chuyển sang sống. Thông báo từ Authorize.net là " Đã xảy ra lỗi khi xử lý dữ liệu thanh toán. Các trường bắt buộc bị thiếu trong dữ liệu được giải mã "

Đây là những gì tôi đã làm:

  1. Đã thay đổi chứng chỉ xử lý thanh toán với một từ tài khoản Authorize.net trực tiếp
  2. Đã thay đổi thông tin đăng nhập tôi đang sử dụng để xử lý các khoản thanh toán Authorize.net vào cùng một tài khoản trực tiếp, tôi đã nhận được chứng chỉ quy trình thanh toán
  3. Sử dụng thiết bị táo sống với thẻ tín dụng thực sự.
  4. Tôi đang sử dụng bộ xử lý dữ liệu đầu tiên của Columbia làm bộ xử lý CC hỗ trợ ApplePay

Lưu ý rằng nếu tôi chuyển về chế độ hộp cát, giao dịch sẽ không gặp sự cố.

Yêu cầu và phản hồi không thành công sau:

Yêu cầu:

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

Phản ứng:

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

Tôi đang thiếu gì

BIÊN TẬP:

Đây là mã liên quan đến việc gửi opaqueData từ 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:

Tôi đã thêm email và điện thoại và địa chỉ IP trong yêu cầu với kết quả tương tự. Yêu cầu sửa đổi như sau:

{ 
"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
Đã thử tái tạo chứng chỉ?
Mully

1
Có, tôi đã tạo lại chứng chỉ xử lý thanh toán hàng chục lần, thậm chí tạo lại danh tính người bán trong tài khoản apple.
bksi

1
giao dịchRequest -> khách hàng -> email trống, có thể được yêu cầu đặt, có thể được đặt theo yêu cầu không?
Jannes Botis

1
Bạn có thể đăng mã liên quan đến cài đặt trường "opaqueData" không? Nơi cần là mã thông báo được mã hóa base64 nhận được từ ví ApplePay.
DinushaNT

2
@Roadowl vấn đề là gì. Tôi đã chỉnh sửa bài viết. Lưu ý rằng cùng một mã hoạt động trong chế độ hộp cát. Ngoài ra yêu cầu được tạo ra, và có thể được nhìn thấy. Nó không nhiều với cách nó được tạo ra tôi nghĩ.
bksi

Câu trả lời:


3

Điều này rất có thể là do sự cố dữ liệu trong trường OpaqueData xuất phát từ phía ApplePay. Vì vậy, đề xuất của tôi là in mã thông báo đó trong logfile, sau đó giải mã tương tự bằng cách sử dụng một trong các thư viện sau để kiểm tra thủ công xem tất cả dữ liệu có ở đó không. Bạn có thể làm tương tự cho cả môi trường Sandbox và môi trường Live. Vì vậy, bạn sẽ thấy bất kỳ sự khác biệt trong dữ liệu mã thông báo.

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

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


Đây là cách nó sử dụng thư viện etsy applepay-php .

Bạn sẽ cần một 'Chứng chỉ xử lý thanh toán' và một khóa riêng từ Apple (được gọi là merch.cer và private.p12 bên dưới). Bạn có thể tạo những thứ này tại Trung tâm Dev của Apple. Bạn cũng sẽ cần một mã thông báo thanh toán mẫu được tạo trên thiết bị của người dùng cuối và dấu thời gian mà nó được tạo. Mã thông báo được mã hóa RSA sẽ trông như thế này:

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

Bản giới thiệu

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

Vâng, đó là bước tiếp theo của tôi. Tôi phải tạo chứng chỉ xử lý thanh toán của mình để có thể làm điều đó.
bksi

@bksi bạn có thể giải mã các mã thông báo không?
DinushaNT

Đáng tiếc vẫn không có. Tôi đang thử sử dụng github.com/PayU-EMEA/apple-pay
bksi

-1

Như đã đề cập ở đây

Một vài điều cần xem xét:

  • ID Apple Merchant mà bạn nhập vào trang web của chúng tôi phải giống hệt với ID mà bạn đã tạo tại trang web của Apple. Nếu khác, chúng tôi sẽ không thể giải mã dữ liệu thanh toán.
  • Phải là một giao dịch thương mại điện tử. Xác nhận rằng tài khoản cổng của bạn được thiết lập dưới dạng tài khoản không có thẻ.
  • Dữ liệu được gửi phải được mã hóa base64. Theo như tôi có thể nói, bạn đang làm đúng, nhưng hãy kiểm tra lại. Tôi không biết nếu BLOB
    bạn nhận lại đã được mã hóa base64, nhưng có thể kiểm tra lại để đảm bảo bạn không mã hóa hai lần.
  • trường opaqueData KHÔNG nên chỉ token.paymentData.data. Thay vào đó, nó sẽ là một Base64-encodedchuỗi JSON đại diện cho toàn bộ token.paymentData object.

Có lỗi khi xử lý dữ liệu thanh toán.

  • Cả hai tham số mờ phải được chỉ định.
  • Bạn không thể bao gồm số thẻ hoặc ngày hết hạn.
  • Bạn không thể bao gồm dữ liệu theo dõi.
  • Phải là giao dịch thương mại điện tử. Xác nhận rằng tài khoản cổng của bạn được thiết lập dưới dạng tài khoản Thẻ không có mặt.
  • Giao dịch phải được ủy quyền hoặc ủy quyền và nắm bắt loại giao dịch.
  • Bạn không thể bao gồm dữ liệu 3DS.
  • Bạn phải gửi dữ liệu có thể được giải mã thành công.
  • Dữ liệu được giải mã phải thuộc về người bán gửi yêu cầu.
  • Dữ liệu được gửi phải được mã hóa base64.

Cảm ơn những lời đề nghị. Tất cả đều được áp dụng. Tôi không chắc chắn bạn lưu ý rằng tất cả các giao dịch đều vượt qua khi ở chế độ hộp cát. Tôi đã tạo id thương gia hoàn toàn mới và sử dụng nó cho các giao dịch có cùng kết quả. Sau đó, tôi đã thử cùng id trở lại trên hộp cát và các giao dịch đang trôi qua.
bksi

@bksi Mình đã cập nhật câu trả lời. Vui lòng đảm bảo rằng bạn đã hoàn thành tất cả các danh sách kiểm tra và bạn vẫn gặp phải sự cố sau đó thử Thực hiện lại toàn bộ quá trình từ tạo định danh gói mới, id người bán, đăng ký nó để đóng gói id & trên cổng ủy quyền, tạo CSR mới từ cổng ủy quyền và tạo chứng chỉ xử lý thanh toán mới trên nhà phát triển apple và sử dụng loại thanh toán 3DS
Vignesh Kumar A
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.