Drupal 7 Drupal表单API和BrainTree异常验证

Drupal 7 Drupal表单API和BrainTree异常验证,drupal-7,drupal-forms,braintree,Drupal 7,Drupal Forms,Braintree,当我使用API创建Drupal表单并根据需要构造表单时,Braintree返回一个身份验证异常。当我获取相同的呈现HTML并将其输出到页面上时(跳过api),它就可以工作了。我不明白为什么 下面是不起作用的代码 function my_module_menu() { $items['user/payment/add'] = array( 'title' => t('Add Card'), 'type' => MENU_LOCAL_TASK, 'page c

当我使用API创建Drupal表单并根据需要构造表单时,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输出

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;
}
功能我的模块菜单(){
$items['user/payment/add']=数组(
'title'=>t('Add Card'),
“键入”=>菜单项\u正常\u项,
“页面回调”=>“我的模块添加页面”,
“访问参数”=>数组(“访问内容”),
“重量”=>2,
);
}
功能我的\模块\添加\页面(){
全球$用户;
需要_once“sites/all/libraries/braintree/lib/braintree.php”;
Braintree_配置::环境(“沙盒”);
Braintree_配置::merchantId('xxx');
Braintree_配置::公钥('xxx');
Braintree_配置::privateKey('xxx');
$customer=Braintree\u customer::find($user->uid);
$trData=Braintree\u TransparentRedirect::updateCustomerData(
排列(
'重定向URL'=>'http://www.xxx.com/user/payment',
“customerId”=>$user->uid
)
);
$output=”
名字
姓
";
返回$output;
}
它返回良好,状态代码为200。关于drupal\u get\u表单或drupal\u render的某些内容会破坏braintree验证表单post所需的环境。究竟是什么原因导致了这一切?浏览器的HTML输出在两种方式下都是100%完全相同的,但第一种方式不会进行身份验证


请向我询问详细信息,我会提供这些信息,我非常想弄清楚这一点。

在您的第一个示例中,您在显示表单之前通过
htmlentities
传递
Braintree\u TransparentRedirect::updateCustomerData
的输出。这将导致安培数显示为&;而不是&。由于tr_数据字段是用API密钥签名的,因此它必须是从
Braintree_TransparentRedirect::updateCustomerData
返回的


免责声明:我为Braintree工作

谢谢John!真不敢相信我在这个问题上花了这么长时间——尽管如此,我还是不敢相信我花了这么少时间来安排一切。Braintree应该在这里大喊一声。