2012-11-25 3 views
0

API를 사용하여 Drupal 양식을 만들고 필요에 따라 양식을 작성할 때 Braintree는 인증 예외를 반환합니다. 동일한 렌더링 된 HTML을 페이지에 출력하면 (API 건너 뛰기) 작동합니다. 나는 이유를 이해할 수 없다!Drupal Form API 및 BrainTree 예외 인증

아래 코드는 작동하지 않습니다.

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; 
} 

이 drupal_get_form에 대한 200 일의 상태 코드로 미세 반환 또는 drupal_render는 braintree가 양식 게시를 인증하는 데 필요한 환경을 종료합니다. 세상에서 무엇이 이것을 일으킬 수 있습니까? 브라우저 HTML 출력은 정확히 두 가지 방법으로 모두 100 %이지만 첫 번째 방법은 인증되지 않습니다.

자세한 내용은 제게 물어보십시오. 나는이 정보를 제공하기 위해 필사적입니다.

답변

1

첫 번째 예에서는 양식을 표시하기 전에 Braintree_TransparentRedirect::updateCustomerData ~ htmlentities의 출력을 전달합니다. 이렇게하면 앰퍼샌드가 & amp로 표시됩니다. & 대신. tr_data 필드는 API 키로 서명되었으므로 정확하게 Braintree_TransparentRedirect::updateCustomerData에서 반환 된 것이어야합니다.

면책 조항 : Braintree

+0

감사합니다. John! 나는이 문제에 대해 너무 오래 동안 보냈다는 것을 믿을 수 없다. 나는 모든 것을 준비하는 데 너무 시간을 보냈다는 것을 믿을 수 없다고 말했다. 브레인 트리는 여기서 큰 소리로 외칠 자격이있어. –