Search code examples
phpbraintree

In Braintree is it possible to verify duplicate payment method for just one customer instead of entire vault?


For the Braintree_PaymentMethod::create() function, one of the options is:

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

This appears to be a global compare. i.e. if the credit card information exists in the vault regardless of customer id this will fail.

Is there a way to check for duplicates on a particular customer?


Solution

  • Full disclosure: I work at Braintree. If you have any further questions, feel free to contact support.

    You and Evan are correct: this is the only pre-built way of failing on duplicate creates regardless of customer create. You could achieve what you are trying to do with your own automation, however.

    To do this, simply collect the credit card unique ids that already exist from the customer object. Then when you create the new payment method, compare it with the existing cards:

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

    Depending on what you want to do, you could delete the new payment method or whatever else you need.