集成Braintree php时出错


Error while integrating Braintree php

我在我的codeigniter项目中使用braintree来处理信用卡支付,并且braintree_Transaction::sale抛出无效参数异常,称账单地址参数的密钥无效消息。但我不认为有任何验证错误。我想做的事情可以简化为:

$card_info = [
      'cardholderName' =>mysql_real_escape_string($_POST['full_name']),
      'number' =>mysql_real_escape_string($_POST['number']),
      'expirationMonth' =>mysql_real_escape_string($_POST['expiry_month']),
      'expirationYear' =>mysql_real_escape_string($_POST['expiry_year']),
      'cvv' =>mysql_real_escape_string($_POST['card_cvv']),
      'billingAddress' =[
              'firstName' =>mysql_real_escape_string($_POST['first_name']),
              'lastName'=>mysql_real_escape_string($_POST['last_name']),
              'streetAddress'=>mysql_real_escape_string($_POST['user_address']),
              'city'=>mysql_real_escape_string($_POST['user_city']),
              'state'=>mysql_real_escape_string($_POST['user_state']),
              'country' =>mysql_real_escape_string($_POST['user_country']),
                ]
       ]
       $result = Braintree_Transaction::sale(['amount'=>'4.99',
                                              'creditCard'=>$card_info,
                                              'options'=>['submitForSettlement' => true]
                                              ])

但是当我运行以下代码时,我得到以下错误:

 <br />
 <b>Fatal error</b>:  Uncaught exception 'InvalidArgumentException' with       message 'invalid keys: creditCard[billingAddress][city],   creditCard[billingAddress][country], creditCard[billingAddress][firstName], creditCard[billingAddress][lastName], creditCard[billingAddress][state], creditCard[billingAddress][streetAddress]' in   C:'xampp'htdocs'naya_admin'application'third_party'braintree'lib'Braintree'Util.php:343
 Stack trace:
     #0 C:'xampp'htdocs'naya_admin'application'third_party'braintree'lib'Braintree'TransactionGateway.php(48): Braintree'Util::verifyKeys(Array, Array)
      #1    C:'xampp'htdocs'naya_admin'application'third_party'braintree'lib'Braintree'TransactionGateway.php(251): Braintree'TransactionGateway-&gt;create(Array)
      #2 C:'xampp'htdocs'naya_admin'application'third_party'braintree'lib'Braintree'Transaction.php(480): Braintree'TransactionGateway-&gt;sale(Array)
      #3  C:'xampp'htdocs'naya_admin'application'modules'brain_tree'controllers'brain_tree .php(67): Braintree'Transaction::sale(Array)
      #4 [internal function]: Brain_tree-&gt;transaction()
      #5 in 
 <b>C:'xampp'htdocs'naya_admin'application'third_party'braintree'lib'Braintree'Ut il.php</b> on line 
     <b>343</b>
      <br />

全面披露:我在Braintree工作。如果您有任何进一步的问题,请随时联系支持人员

Ilan Hasanov是正确的,您需要在交易呼叫中分别传递账单参数和信用卡详细信息。此外,您应该将"city"替换为"locality",将"state"替换为《region》,将"country"替换为您存储在数据库中的任何国家字段

$billing =[
    'firstName' =>mysql_real_escape_string($_POST['first_name']),
    'lastName'=>mysql_real_escape_string($_POST['last_name']),
    'streetAddress'=>mysql_real_escape_string($_POST['user_address']),
    'locality'=>mysql_real_escape_string($_POST['user_city']),
    'region'=>mysql_real_escape_string($_POST['user_state']),
    'countryName' =>mysql_real_escape_string($_POST['user_country']),
];

此外,为了降低PCI合规性负担,我建议将nonce代替信用卡详细信息传递给服务器。

您需要分离账单地址:

    $card_info = [
    'cardholderName' =>mysql_real_escape_string($_POST['full_name']),
    'number' =>mysql_real_escape_string($_POST['number']),
    'expirationMonth' =>mysql_real_escape_string($_POST['expiry_month']),
    'expirationYear' =>mysql_real_escape_string($_POST['expiry_year']),
    'cvv' =>mysql_real_escape_string($_POST['card_cvv']),
];
$billing =[
    'firstName' =>mysql_real_escape_string($_POST['first_name']),
    'lastName'=>mysql_real_escape_string($_POST['last_name']),
    'streetAddress'=>mysql_real_escape_string($_POST['user_address']),
    'city'=>mysql_real_escape_string($_POST['user_city']),
    'state'=>mysql_real_escape_string($_POST['user_state']),
    'country' =>mysql_real_escape_string($_POST['user_country']),
];
$result = Braintree_Transaction::sale(['amount'=>'4.99',
    'creditCard'=>$card_info,
    'billing' => $billing,
    'options'=>['submitForSettlement' => true]
]);

参考Braintree PHP API