2015-12-23 7 views
6

Per la funzione Braintree_PaymentMethod::create(), una delle opzioni è:In Braintree è possibile verificare il metodo di pagamento duplicato per un solo cliente, invece di tutto il caveau?

'failOnDuplicatePaymentMethod' 
bool 

If this option is passed and the payment method has already been added to the Vault, the request will fail. This option will not work with PayPal payment methods. 

Questo sembra essere un confronto globale. Ad esempio, se le informazioni sulla carta di credito esistono nel vault, indipendentemente dall'id del cliente, ciò fallirà.

C'è un modo per controllare i duplicati su un determinato cliente?

+0

ho contattato il supporto di questo ~ 2 anni fa e la risposta era no, ma è sicuramente merita di essere esaminata di nuovo. – Evan

risposta

7

Divulgazione completa: lavoro a Braintree. Se hai ulteriori domande, non esitare a contattare support.

Tu ed Evan sono corretti: questo è l'unico modo predefinito di non riuscire su duplicati crea indipendentemente dalla creazione del cliente. Potresti ottenere ciò che stai cercando di fare con la tua automazione, comunque.

Per fare ciò, è sufficiente raccogliere lo credit card unique ids già esistente da the customer object. Poi, quando si create the new payment method, confronta con le carte esistenti:

function extractUniqueId($creditCard){ 
    return $creditCard->uniqueNumberIdentifier; 
} 

$customer = Braintree_Customer::find('your_customer'); 
$unique_ids = array_map(extractUniqueId,$customer->creditCards); 

$result = Braintree_PaymentMethod::create(array(
    'customerId' => 'your_customer', 
    'paymentMethodNonce' => 'fake-valid-discover-nonce', 
)); 

if ($result->success) { 
    if(in_array(extractUniqueId($result->paymentMethod), $unique_ids)) { 
     echo "Do your duplicate logic"; 
    } else { 
     echo "Continue with your unique logic"; 
    } 
} 

A seconda di cosa si vuole fare, si potrebbe eliminare il nuovo metodo di pagamento o qualsiasi altra cosa che vi serve.

+0

Grazie per la risposta completa! Qualche informazione sul perché per cliente non esiste? – Evan

+0

No, se non per dire ci sono molti modi per risolvere problemi come questi. Nel rilasciare nuove funzionalità guardiamo sempre al feedback dal supporto di Braintree. Per favore continua a darlo! :) –

+0

Grazie per la risposta Raymond! Quindi questo 'uniqueNumberIdentifier' è una specie di hash sul solo numero della carta di credito? O tutti i dati inclusa la scadenza? È specifico del commerciante? – Revent

1

Controllato con il supporto di Braintree - ancora non disponibile, fuori dalla scatola:

Se si utilizza failOnDuplicatePaymentMethod qualsiasi richiesta di aggiungere le informazioni duplicate metodo di pagamento nel caveau fallirà.

Attualmente non disponiamo della funzionalità per impedire a un cliente di aggiungere una scheda duplicata al proprio profilo, pur consentendo di aggiungere schede duplicate in più profili. Se questo è qualcosa che ti interessa, dovrai sviluppare la tua logica.

-1
// Search for customer in Braintree Vault 
try $braintree_result_find = Braintree_Customer::find($cust_id); 

// prepare Braintree sale, but do not execute (yet) 
$sale_array = array(
    'amount' => $amt, 
    // other braintree Parameters 
    'options' => array(
     'submitForSettlement' => true, 
     'storeInVaultOnSuccess' => $save_cc_chk_bool 
    ) 
); 

// customer does not yet exist in Braintree Vault 
if (!isset($braintree_result_find) || !$braintree_result_find) 
    $sale_array["customer"]['id'] = $cust_id; 
// customer does exist in Braintree Vault 
else 
    $sale_array['customerId'] = $cust_id; 

$braintree_result_sale = Braintree_Transaction::sale($sale_array); 
0

@Raymond Berg, ho fatto cambiamenti soem nel codice, Ecco il codice aggiornato: foreach
1. usato al posto di in_array
2. Elimina anche la scheda aggiunto Se trovato duplicato

$customer = Braintree_Customer::find('your_customer'); 
$unique_ids = array_map(extractUniqueId,$customer->creditCards); 

$result = Braintree_PaymentMethod::create(array(
    'customerId' => 'your_customer', 
    'paymentMethodNonce' => 'fake-valid-discover-nonce', 
)); 

if ($result->success) { 
    $cardAlreadyExist = false; 
$currentPaymentMethod = $this->extractUniqueId($result->paymentMethod); 
//The in_array function was not working so I used foreach to check if  card identifier exist or not 
    foreach ($unique_ids as $key => $uid) { 
     if($currentPaymentMethod == $uid->uniqueNumberIdentifier) 
     { 
      $cardAlreadyExist = true; 
//Here you have to delete the currently added card 
      $payment_token = $result->paymentMethod->token; 
      Braintree_PaymentMethod::delete($payment_token); 
     } 
} 


    if($cardAlreadyExist) { 
     echo "Do your duplicate logic"; 
    } else { 
     echo "Continue with your unique logic"; 
    } 

} 
+0

Ci sono errori di sintassi nel codice, –

+0

@ harishsharma Abilita la segnalazione degli errori php e puoi correggere l'errore di sintassi. Pubblica anche l'errore di sintassi nel commento. non ho visto e errore di sintassi? –

+0

'if ($ cardAlreadyExist)) {' chk questa linea, –

Problemi correlati