我在我的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->create(Array)
#2 C:'xampp'htdocs'naya_admin'application'third_party'braintree'lib'Braintree'Transaction.php(480): Braintree'TransactionGateway->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->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