Apple Pay-ライブ、サンドボックスが機能している場合のみ、authorize.netがエラー153を返す


14

多くの記事を検索した後、私の問題の解決策を見つけることができませんでした。

ApplePayボタンを自分のサイトに統合し、サンドボックスモードで正常にトランザクションを実行しました。authorize.net php SDKを使用してリクエストを生成しています。問題は、ライブに切り替えたときに始まりました。authorize.netからのメッセージは、「支払いデータの処理中にエラーが発生しました。復号化されたデータに必須フィールドがありません

ここで私がやったこと:

  1. 支払い処理証明書を、ライブのauthorize.netアカウントの証明書で変更しました
  2. authorize.netの支払いを処理するために使用している資格情報を、支払い処理証明書を取得した同じライブアカウントに変更しました
  3. 実際のクレジットカードでライブアップルデバイスを使用してください。
  4. ApplePayをサポートするCCプロセッサとしてFirst data Nashvilleプロセッサを使用しています

サンドボックスモードに切り替えると、トランザクションは問題なく通過することに注意してください。

要求と失敗した応答は次のとおりです。

リクエスト:

{ 
    "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:

リクエストにメールと電話、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アカウントでマーチャントIDを再作成した場合でも、支払い処理証明書を数十回再生成しました。
bksi

1
transactionRequest-> customer-> emailが空です。設定が必要な場合がありますが、リクエスト時に設定できますか?
Jannes Botis

1
「opaqueData」フィールドの設定に関連するコードを投稿できますか?ApplePayウォレットから受け取ったbase64エンコードトークンの場所。
DinushaNT

2
@Roadowl問題は何ですか。投稿を編集しました。同じコードがサンドボックスモードで機能することに注意してください。また、リクエストが生成され、確認できます。それがどのように生成されるかとはあまり関係ないと思います。
bksi

回答:


3

これはおそらく、ApplePay側からのOpaqueDataフィールドのデータの問題が原因です。したがって、私の提案は、そのトークンをログファイルに出力し、次のライブラリのいずれかを使用して同じトークンを復号化し、そこに存在するすべてのデータを手動で確認することです。サンドボックス環境とライブ環境の両方で同じことができます。したがって、トークンデータに違いがあることがわかります。

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 Merchant IDは、Appleサイトで作成したものと同一である必要があります。異なる場合、支払いデータを復号化できません。
  • eコマーストランザクションである必要があります。ゲートウェイアカウントがカード非提示アカウントとして設定されていることを確認します。
  • 送信されるデータはbase64でエンコードされている必要があります。私の知る限り、あなたはそれを正しく行っていますが、再確認してください。
    返されているBLOB が既にbase64でエンコードされているかどうかはわかりませんが、ダブルエンコードしていないことを確認するために再確認してください。
  • opaqueDataフィールドは単なるであってはなりませんtoken.paymentData.data。むしろ、Base64-encoded全体を表すJSON文字列である必要がありますtoken.paymentData object

支払いデータの処理中にエラーが発生しました。

  • 両方の不透明パラメーターを指定する必要があります。
  • カード番号や有効期限を含めることはできません。
  • トラックデータを含めることはできません。
  • eコマーストランザクションである必要があります。ゲートウェイアカウントがCard Not Presentアカウントとして設定されていることを確認します。
  • トランザクションは、承認であるか、トランザクションのタイプを許可および取得する必要があります。
  • 3DSデータを含めることはできません。
  • 正常に復号化できるデータを送信する必要があります。
  • 復号化されたデータは、リクエストを送信する販売者に属している必要があります。
  • 送信されるデータはbase64でエンコードされている必要があります。

提案をありがとう。それらのすべてが適用されます。サンドボックスモードでは、すべてのトランザクションが通過することに気付いたとは思いません。完全に新しいマーチャントIDを作成し、同じ結果のトランザクションに使用しました。次に、同じIDをサンドボックスで試しましたが、トランザクションは成功しています。
bksi

@bksi回答を更新しました。すべてのチェックリストを完了し、問題に直面していることを確認してから、新しいバンドル識別子、マーチャントIDを作成して、バンドルIDに登録し、オーソライズポータルで登録し、オーソライズポータルから新しいCSRを生成して、プロセス全体を再実行して
Apple
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.