简体   繁体   English

集成Braintree php时出错

[英]Error while integrating Braintree php

I am using braintree to handle credit card payment in my codeigniter project and the Braintree_Transaction::sale throws invalid argument exception saying invalid keys message for billing address parameters . 我正在使用Braintree在我的codeigniter项目中处理信用卡付款,并且Braintree_Transaction :: sale抛出无效的参数异常 ,该异常表示帐单邮寄地址参数无效的密钥消息。 But i dont think there are any validation errors. 但是我不认为有任何验证错误。 What i am trying to do can be simplified as below: 我正在尝试做的事情可以简化如下:

$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]
                                              ])

But when i run the following code i get following error : 但是当我运行以下代码时,出现以下错误:

 <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 />

You need to seperate the billing Address: 您需要分隔帐单邮寄地址:

    $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]
]);

Refer to Braintree PHP API 请参阅Braintree PHP API

Full disclosure: I work at Braintree. 全面披露:我在Braintree工作。 If you have any further questions, feel free to contact support . 如果您还有其他疑问,请随时与支持小组联系

Ilan Hasanov is correct that you need to pass the billing parameters separately from credit card details in the transaction call. Ilan Hasanov是正确的,您需要在交易呼叫中将计费参数与信用卡详细信息分开传递。 In addition, you should replace "city" with "locality" , "state" with "region" , and "country" with whichever country field you are storing in your database 另外,您应将“ 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']),
];

In addition, to keep your PCI compliance burden low, I recommend passing a nonce to your server in place of the credit card details. 另外,为了使您的PCI合规性负担降低,我建议将随机数代替信用卡详细信息传递给您的服务器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM