Drupal Form API и аутентификация исключений BrainTree
Когда я создаю форму Drupal с API и создаю форму по мере необходимости, Braintree возвращает исключение аутентификации. Когда я беру тот же самый отрендеренный HTML и выводю его на страницу (пропускаю API), тогда он работает. Я не могу понять, почему!
Ниже приведен код, который не работает.
function my_module_menu() {
$items['user/payment/add'] = array(
'title' => t('Add Card'),
'type' => MENU_LOCAL_TASK,
'page callback' => 'drupal_get_form',
'page arguments' => array('my_module_add_form'),
'access arguments' => array('access content'),
'weight' => 2,
);
}
function my_module_add_form() {
global $user;
require_once 'sites/all/libraries/braintree/lib/Braintree.php';
Braintree_Configuration::environment('sandbox');
Braintree_Configuration::merchantId('xxx');
Braintree_Configuration::publicKey('xxx');
Braintree_Configuration::privateKey('xxx');
$customer = Braintree_Customer::find($user->uid);
$trData = Braintree_TransparentRedirect::updateCustomerData(
array(
'redirectUrl' => 'http://www.xxx.com/user/payment',
'customerId' => $user->uid
)
);
$form['#action'] = url(Braintree_TransparentRedirect::url(), array('external' => true));
$form['customer[first_name]'] = array(
'#type' => 'textfield',
'#title' => t('First Name'),
);
$form['customer[last_name]'] = array(
'#type' => 'textfield',
'#title' => t('Last Name'),
);
$form['tr_data'] = array(
'#type' => 'hidden',
'#value' => htmlentities($trData),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save')
);
return $form;
}
если вместо этого я возьму этот точный вывод HTML и сделаю это с normal_menu_item и теми же учетными данными, что и выше...
function my_module_menu() {
$items['user/payment/add'] = array(
'title' => t('Add Card'),
'type' => MENU_NORMAL_ITEM,
'page callback' => 'my_module_add_page',
'access arguments' => array('access content'),
'weight' => 2,
);
}
function my_module_add_page() {
global $user;
require_once 'sites/all/libraries/braintree/lib/Braintree.php';
Braintree_Configuration::environment('sandbox');
Braintree_Configuration::merchantId('xxx');
Braintree_Configuration::publicKey('xxx');
Braintree_Configuration::privateKey('xxx');
$customer = Braintree_Customer::find($user->uid);
$trData = Braintree_TransparentRedirect::updateCustomerData(
array(
'redirectUrl' => 'http://www.xxx.com/user/payment',
'customerId' => $user->uid
)
);
$output="
<form accept-charset='UTF-8' id='tqcustom-billing' method='post' action='".Braintree_TransparentRedirect::url()."'>
<div>
<div class='form-item form-type-textfield form-item-customer-first-name'>
<label for='edit-customer-first-name'>First Name </label>
<input type='text' class='form-text' maxlength='128' size='60' value='' name='customer[first_name]' id='edit-customer-first-name'>
</div>
<div class='form-item form-type-textfield form-item-customer-last-name'>
<label for='edit-customer-last-name'>Last Name </label>
<input type='text' class='form-text' maxlength='128' size='60' value='' name='customer[last_name]' id='edit-customer-last-name'>
</div>
<input type='hidden' value='".$trData."' name='tr_data'>
<input type='submit' class='form-submit' value='Save' name='op' id='edit-submit'>
</div>
</form>
";
return $output;
}
он возвращает нормально с кодом состояния 200. Что-то о drupal_get_form или drupal_render убивает среду, которая необходима braintree для аутентификации сообщения формы. Что в мире может быть причиной этого? Вывод HTML в браузере на 100% одинаков в обоих направлениях, но первый способ не аутентифицируется.
Пожалуйста, спросите меня о деталях, и я предоставлю их - отчаянно пытаясь выяснить это.
1 ответ
В первом примере вы передаете вывод Braintree_TransparentRedirect::updateCustomerData
через htmlentities
перед отображением формы. Это приведет к тому, что амперсанды будут отображаться как & amp; вместо &. Поскольку поле tr_data подписано вашим ключом API, оно должно быть именно тем, что возвращается из Braintree_TransparentRedirect::updateCustomerData
,
Отказ от ответственности: я работаю на Брэйнтри