2015-12-23 5 views
6

Für die Braintree_PaymentMethod::create() Funktion, eine der Optionen ist:In Braintree ist es möglich, doppelte Zahlungsmethode für nur einen Kunden anstelle des gesamten Tresors zu überprüfen?

'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. 

Dies scheint ein global vergleichen zu sein. Wenn die Kreditkarteninformation unabhängig von der Kundennummer im Tresor existiert, wird dies fehlschlagen.

Gibt es eine Möglichkeit, nach Duplikaten bei einem bestimmten Kunden zu suchen?

+0

Ich kontaktierte Support vor ca. 2 Jahren und die Antwort war nein, aber es lohnt sich sicherlich wieder zu sehen. – Evan

Antwort

7

Volle Enthüllung: Ich arbeite in Braintree. Wenn Sie weitere Fragen haben, wenden Sie sich bitte an support.

Sie und Evan haben Recht: Dies ist die einzige vorgefertigte Möglichkeit, bei doppelten Erstellungen unabhängig vom Kunden zu scheitern. Sie können jedoch erreichen, was Sie mit Ihrer eigenen Automatisierung zu tun versuchen.

Um dies zu tun, sammeln Sie einfach die credit card unique ids, die bereits von the customer object existieren. Dann, wenn Sie create the new payment method, vergleichen Sie es mit den vorhandenen Karten:

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

Je nachdem, was Sie tun möchten, können Sie die neue Zahlungsmethode löschen oder was auch immer Sie brauchen.

+0

Danke für die vollständige Antwort! Irgendwelche Einblicke in warum pro Kunde existiert nicht? – Evan

+0

Nein, außer zu sagen, es gibt viele Möglichkeiten, Probleme wie diese zu lösen. Bei der Veröffentlichung neuer Funktionen suchen wir immer nach Rückmeldungen von Braintree. Bitte gib es weiter! :) –

+0

Danke für die Antwort Raymond! Also ist dieser 'uniqueNumberIdentifier' eine Art Hash auf nur der Kreditkartennummer? Oder alle Daten einschließlich Ablauf? Ist es Händlerspezifisch? – Revent

1

mit Braintree Unterstützung Karo - noch nicht aus der Box zur Verfügung:

Wenn Sie failOnDuplicatePaymentMethod jede Anforderung verwenden doppelte Zahlungsmethode Informationen in den Vault hinzufügen fehl.

Wir verfügen derzeit nicht über die Funktionalität, um zu verhindern, dass ein Kunde eine doppelte Karte zu seinem Profil hinzufügt. Gleichzeitig können doppelte Karten unter mehreren Profilen hinzugefügt werden. Wenn Sie interessiert sind, müssen Sie Ihre eigene Logik aufbauen.

-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, machte ich Soem Änderungen im Code, hier ist der aktualisierte Code:
1. Gebrauchte foreach statt in_array
2. Auch die zusätzliche Karte löschen Wenn doppelte gefunden

$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

Es gibt Syntaxfehler im Code, –

+0

@ harishsharma Bitte aktivieren Sie Ihre PHP-Fehlerberichte und Sie können den Syntaxfehler beheben. Stellen Sie auch den Syntaxfehler in den Kommentar auch. Ich habe nicht gesehen und Syntaxfehler? –

+0

'if ($ cardAlreadyExist)) {' chk diese Zeile, –

Verwandte Themen