Apple Pay-仅当在线沙盒有效时,authorize.net才返回错误153


14

在搜索了很多文章之后,我找不到我的问题的解决方案。

我已经在网站上集成了ApplePay按钮,并在沙盒模式下成功完成了交易。我正在使用authorize.net php SDK生成请求。当我转为居住时,问题开始了。来自authorize.net的消息是“ 处理付款数据时出错。解密数据中缺少必填字段

这是我所做的:

  1. 使用真实的authorize.net帐户中的一张更改了付款处理证书
  2. 将我用来处理authorize.net付款的凭据更改为我获得付款流程证书的真实账户
  3. 使用带有真实信用卡的实时Apple设备。
  4. 我正在使用First data Nashville处理器作为支持ApplePay的CC处理器

请注意,如果我切换回沙盒模式,则事务将顺利通过。

该请求和失败的响应如下:

请求:

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

编辑2:

我在请求中添加了电子邮件,电话和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->客户->电子邮件为空,可能需要设置,是否可以在请求时设置?
Jannes Botis

1
您可以发布与设置“ opaqueData”字段相关的代码吗?它应该是从ApplePay钱包收到的base64编码令牌。
DinushaNT

2
@Roadowl是怎么回事。我编辑了帖子。请注意,相同的代码在沙盒模式下有效。该请求也会生成,并且可以看到。我认为它的产生方式并不多。
bksi

Answers:


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的开发中心生成这些文件。您还需要在最终用户设备上生成的示例支付令牌以及生成令牌的时间戳。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商家ID必须与您在Apple网站上创建的ID相同。如果不同,我们将无法解密付款数据。
  • 必须是电子商务交易。确认您的网关帐户已设置为无卡帐户。
  • 提交的数据必须使用base64编码。据我所知,您做的正确,但请仔细检查。我不知道
    您返回的BLOB 是否已经进行了base64编码,但是也许要仔细检查以确保您没有对其进行双重编码。
  • opaqueData字段不应该是just token.paymentData.data。相反,它应该是Base64-encoded代表整个的JSON字符串token.paymentData object

处理付款数据时出错。

  • 必须指定两个不透明参数。
  • 您不能输入卡号或有效期。
  • 您不能包含跟踪数据。
  • 必须是电子商务交易。确认您的网关帐户设置为“不存在卡”帐户。
  • 交易必须是授权的或授权并捕获交易的类型。
  • 您不能包含3DS数据。
  • 您必须提交可以成功解密的数据。
  • 解密的数据必须属于提交请求的商家。
  • 提交的数据必须使用base64编码。

感谢您的建议。全部应用。我不确定您是否注意到在沙盒模式下所有事务都会通过。我制作了一个新的商人ID,并将其用于相同结果的交易。然后我在沙盒上尝试了相同的ID,并且交易通过了。
bksi

@bksi我已经更新了答案。请确保您已完成所有检查表,并且仍然面对问题,然后尝试重新执行整个过程,从创建新的捆绑包标识符,商户ID,将其注册到捆绑包ID和在授权门户上,从授权门户生成新的CSR,以及在Apple Developer上创建新的付款处理证书并使用3DS付款类型
Vignesh Kumar,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.