Apple Pay - authorize.net ส่งคืนข้อผิดพลาด 153 เฉพาะเมื่อใช้งานจริง sandbox ทำงาน


14

หลังจากค้นหาบทความจำนวนมากฉันไม่พบวิธีแก้ไขปัญหาของฉัน

ผมได้รวมปุ่ม ApplePay บนเว็บไซต์ของฉันและทำ successfuly การทำธุรกรรมในโหมด ฉันใช้ authorize.net php SDK เพื่อสร้างคำขอ ปัญหาเริ่มต้นขึ้นเมื่อฉันเปลี่ยนเป็นสด ข้อความจาก authorize.net คือ " มีข้อผิดพลาดในการประมวลผลข้อมูลการชำระเงินฟิลด์ที่จำเป็นขาดหายไปจากข้อมูลที่ถอดรหัส "

นี่คือสิ่งที่ฉันได้ทำ:

  1. เปลี่ยนใบรับรองการประมวลผลการชำระเงินด้วยใบรับรองจากบัญชีสด authorize.net
  2. เปลี่ยนข้อมูลรับรองที่ฉันใช้เพื่อประมวลผลการชำระเงิน authorize.net เป็นบัญชีจริงเดียวกันฉันได้รับใบรับรองกระบวนการชำระเงิน
  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."
            }
        ]
    }
}

ฉันกำลังคิดถึงอะไร

แก้ไข:

นี่คือรหัสเกี่ยวกับการส่ง opaqueData จาก 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:

ฉันเพิ่มอีเมลและโทรศัพท์และที่อยู่ IP ในคำขอด้วยผลลัพธ์เดียวกัน คำขอที่แก้ไขมีดังนี้:

{ 
"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
พยายามสร้างใบรับรองใหม่หรือไม่
Mully

1
ใช่ฉันสร้างใบรับรองการประมวลผลการชำระเงินซ้ำหลายครั้งถึงสิบครั้งแม้กระทั่งสร้างข้อมูลประจำตัวของผู้ค้าในบัญชี Apple
bksi

1
transactionRequest -> customer -> อีเมลว่างเปล่าอาจต้องมีการตั้งค่ามันเป็นไปได้ไหมที่จะตั้งตามคำขอ
Jannes Botis

1
คุณสามารถโพสต์รหัสที่เกี่ยวข้องกับการตั้งค่าฟิลด์ "opaqueData" ได้หรือไม่? ที่ซึ่งควรเป็นโทเค็นเข้ารหัส 64 ที่ได้รับจากกระเป๋าเงิน ApplePay
DinushaNT

2
@Radowadow เป็นเรื่องอะไร ฉันแก้ไขโพสต์ โปรดทราบว่ารหัสเดียวกันทำงานในโหมดแซนด์บ็อกซ์ นอกจากนี้ยังมีการสร้างคำขอและสามารถมองเห็นได้ มันไม่มากกับวิธีที่มันถูกสร้างขึ้นฉันคิดว่า
bksi

คำตอบ:


3

นี่อาจเป็นเพราะปัญหาข้อมูลในฟิลด์ OpaqueData ซึ่งมาจากด้าน ApplePay ดังนั้นคำแนะนำของฉันคือพิมพ์โทเค็นนั้นใน logfile แล้วถอดรหัสแบบเดียวกันโดยใช้หนึ่งในไลบรารีต่อไปนี้เพื่อตรวจสอบด้วยตนเองว่ามีข้อมูลทั้งหมดอยู่ที่นั่นหรือไม่ คุณสามารถทำสิ่งเดียวกันทั้งในสภาพแวดล้อมของ Sandbox และสภาพแวดล้อมแบบสด ดังนั้นคุณจะเห็นความแตกต่างในข้อมูลโทเค็น

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 คุณสามารถถอดรหัสโทเค็นได้หรือไม่
DinushaNT

น่าเสียดายที่ยังไม่มี ฉันกำลังลองใช้github.com/PayU-EMEA/apple-pay
bksi

-1

ตามที่กล่าวไว้ที่นี่

สองสิ่งที่ควรพิจารณา:

  • รหัสผู้ขายของ Apple ที่คุณเข้าสู่เว็บไซต์ของเราจะต้องเหมือนกับรหัสที่คุณสร้างขึ้นที่ไซต์ Apple หากแตกต่างเราจะไม่สามารถถอดรหัสข้อมูลการชำระเงินได้
  • ต้องเป็นธุรกรรมอีคอมเมิร์ซ ยืนยันว่าบัญชีเกตเวย์ของคุณได้รับการตั้งค่าเป็นบัญชีที่ไม่แสดงบัตร
  • ข้อมูลที่ส่งจะต้องเข้ารหัส base64 เท่าที่ฉันสามารถบอกได้ว่าคุณทำถูกแล้ว แต่ตรวจสอบอีกครั้ง ฉันไม่ทราบว่า BLOB ที่
    คุณได้รับกลับมามีการเข้ารหัสแบบพื้นฐาน 64 หรือไม่ แต่อาจตรวจสอบอีกครั้งเพื่อให้แน่ใจว่าคุณไม่ได้เข้ารหัสสองครั้ง
  • opaqueDatatoken.paymentData.dataฟิลด์ไม่ควรจะเป็นเพียงแค่ แต่ก็ shoud เป็นBase64-encodedสตริง JSON token.paymentData objectตัวแทนทั้งหมด

เกิดข้อผิดพลาดในการประมวลผลข้อมูลการชำระเงิน

  • ต้องระบุพารามิเตอร์ทึบแสงทั้งคู่
  • คุณไม่สามารถใส่หมายเลขบัตรหรือวันหมดอายุ
  • คุณไม่สามารถรวมข้อมูลการติดตาม
  • ต้องเป็นธุรกรรมอีคอมเมิร์ซ ยืนยันว่าบัญชีเกตเวย์ของคุณถูกตั้งค่าเป็นบัญชีที่ไม่แสดงบัตร
  • การทำธุรกรรมจะต้องได้รับอนุญาตหรืออนุญาตและประเภทการทำธุรกรรม
  • คุณไม่สามารถรวมข้อมูล 3DS
  • คุณต้องส่งข้อมูลที่สามารถถอดรหัสได้สำเร็จ
  • ข้อมูลที่ถอดรหัสจะต้องเป็นของผู้ขายที่ส่งคำขอ
  • ข้อมูลที่ส่งจะต้องเข้ารหัส base64

ขอบคุณสำหรับคำแนะนำ พวกเขาทั้งหมดจะถูกนำไปใช้ ฉันไม่แน่ใจว่าคุณสังเกตเห็นว่าการทำธุรกรรมทั้งหมดผ่านเมื่ออยู่ในโหมดแซนด์บ็อกซ์ ฉันสร้างรหัสผู้ขายใหม่โดยสมบูรณ์และใช้เพื่อการทำธุรกรรมที่มีผลลัพธ์เหมือนกัน จากนั้นฉันลองใช้รหัสเดิมบนแซนด์บ็อกซ์และธุรกรรมกำลังจะผ่านไป
bksi

@bksi ฉันได้รับคำตอบที่อัปเดตแล้ว โปรดตรวจสอบให้แน่ใจว่าคุณได้ทำรายการตรวจสอบทั้งหมดแล้วและยังคงประสบปัญหาแล้วลองทำกระบวนการทั้งหมดใหม่จากการสร้างตัวระบุกลุ่มใหม่รหัสผู้ขายลงทะเบียนให้เป็นกลุ่มรหัส & บนพอร์ทัลอนุมัติสร้าง CSR ใหม่จากพอร์ทัลอนุญาต การสร้างใบรับรองการประมวลผลการชำระเงินใหม่สำหรับนักพัฒนาแอปเปิ้ลและใช้ประเภทการชำระเงิน 3DS
Vignesh Kumar A
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.