I’d like not to create subscriptions but still be able to have the Recurring Billing approach in my SaaS software:
- Signup for a paid plan
 - Apply Transaction Sale function
 - Create braintree customer
 - Save Payment Method Token in DB
 - In the next month (whenever I want) use the Payment Method Token to create a new Transaction Sale
 
All of this without subscription feature. Does Braintree allow it?
Currently I’m having the following problem:
- The user signups for a paid plan
 - The Transaction Sale is executed with the Nonce value
 - I try to create the customer in Braintree using the same Nonce and I get the error “Cannot use a payment_method_nonce more than once”
 
The error makes sense, but how would I match the current user signup with the created customer in braintree in order to later use the Payment Method Token to re-use the Transaction Sale?
https://developer.paypal.com/braintree/docs/guides/customers#create-with-payment-method
// After the Transaction Sale is executed with success I try this:
$result = $gateway->customer()->create(
[
    'firstName' => $customer['name'],
    'company' => $customer['company'],
    'email' => $customer['email'],
    'paymentMethodNonce' => $customer['payment_method_nonce']
]);
This would return the Payment Method Token and I would be able to save in DB like this:
$db->braintree_customer_id = $braintreeCustomer->customer->id; $db->braintree_payment_token = $braintreeCustomer->customer->paymentMethods[0]->token; $db->save();
And in the next month, my software would be able to execute a payment using:
$result = $gateway->transaction()->sale(
[
    'amount' => $price,
    'paymentMethodToken' => $token, // <--- saved in DB
    'options' =>
    [
        'submitForSettlement' => true
    ]
]);
Advertisement
Answer
Solved.
The answer to this question “All of this without subscription feature. Does Braintree allow it?” is Yes.
And about the error “Cannot use a payment_method_nonce more than once”, I had to create firstly the customer using the nonce and then execute the sale using the token.
$result = $gateway->customer()->create(
[
    'firstName' => $customer['name'],
    'company' => $customer['company'],
    'email' => $customer['email'],
    'paymentMethodNonce' => $customer['payment_method_nonce']
]);
// We now execute the payment with the token returned
$braintree->executePayment($result->customer->paymentMethods[0]->token, $total);
Since I save the token in the DB, I’m able to execute the payment again in the next month whenever I want without user interference.