2015-12-23 57 views
6

Dla funkcji Braintree_PaymentMethod::create(), jedną z opcji jest:W Braintree można zweryfikować duplikat metody płatności tylko dla jednego klienta zamiast całego skarbca?

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

To wydaje się być globalny porównania. tj. jeśli informacje o karcie kredytowej znajdują się w skarbcu, niezależnie od identyfikatora klienta, to się nie powiedzie.

Czy istnieje sposób sprawdzenia duplikatów na konkretnym kliencie?

+0

Skontaktowałem się z działem wsparcia około 2 lata temu, a odpowiedź brzmiała "nie", ale z pewnością warto się ponownie przyjrzeć. – Evan

Odpowiedz

7

Pełne ujawnienie: Pracuję w Braintree. Jeśli masz dodatkowe pytania, skontaktuj się z support.

Ty i Evan macie rację: jest to jedyny wbudowany sposób na niepowodzenie duplikacji, niezależnie od tego, czy klient tworzy. Można jednak osiągnąć to, co próbujesz zrobić za pomocą własnej automatyzacji.

Aby to zrobić, po prostu odbierz credit card unique ids, które już istnieją od the customer object. Wtedy, kiedy create the new payment method, porównać je z istniejącymi kartami:

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

W zależności od tego, co chcesz zrobić, można usunąć nową trzeba metodę płatności lub cokolwiek innego.

+0

Dzięki za pełną odpowiedź! Jaki jest wgląd w to, dlaczego klient nie istnieje? – Evan

+0

Nie, z wyjątkiem tego, że istnieje wiele sposobów rozwiązania takich problemów. W wydaniu nowych funkcji zawsze szukamy informacji zwrotnych od wsparcia Braintree. Proszę, dawaj to! :) –

+0

Dzięki za odpowiedź Raymond! Czy to jest 'uniqueNumberIdentifier' jakaś mieszanka tylko na numerze karty kredytowej? Lub wszystkie dane, w tym data wygaśnięcia? Czy to jest specyficzne dla handlowca? – Revent

1

sprawdzone ze wsparciem Braintree - nadal nie jest dostępna po wyjęciu z pudełka:

Jeśli używasz failOnDuplicatePaymentMethod Każdy wniosek, aby dodać zduplikowane informacje metody płatności w Krypcie zawiedzie.

Obecnie nie mamy funkcji, która uniemożliwiałaby klientowi dodanie duplikatu do jego profilu, jednocześnie umożliwiając dodawanie duplikatów kart w wielu profilach. Jeśli jest to coś, czym jesteś zainteresowany, będziesz musiał zbudować własną logikę.

-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, zrobiłem zmiany SOEM w kodzie, Oto zaktualizowany kod:
1. Używane foreach zamiast in_array
2. Również usunąć dodaną kartę Jeśli znaleziono duplikat

$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

Występuje błąd składniowy w kodzie, –

+0

@ harishsharma Włącz raportowanie błędów php i napraw błąd składni. Opublikuj również błąd składni w komentarzu. nie widzę i błąd składni? –

+0

'if ($ cardAlreadyExist)) {' chk this line, –