New Add option to disable idempotency when using Stripe payments.
This commit is contained in:
parent
607c38775d
commit
bc2a949bab
@ -1725,6 +1725,7 @@ if ($action != 'dopayment')
|
|||||||
{
|
{
|
||||||
// If STRIPE_PICTO_FOR_PAYMENT is 'cb' we show a picto of a crdit card instead of stripe
|
// If STRIPE_PICTO_FOR_PAYMENT is 'cb' we show a picto of a crdit card instead of stripe
|
||||||
print '<br><div class="button buttonpayment" id="div_dopayment_stripe"><span class="fa fa-credit-card"></span> <input class="" type="submit" id="dopayment_stripe" name="dopayment_stripe" value="'.$langs->trans("StripeDoPayment").'">';
|
print '<br><div class="button buttonpayment" id="div_dopayment_stripe"><span class="fa fa-credit-card"></span> <input class="" type="submit" id="dopayment_stripe" name="dopayment_stripe" value="'.$langs->trans("StripeDoPayment").'">';
|
||||||
|
print '<input type="hidden" name="noidempotency" value="'.GETPOST('noidempotency', 'int').'">';
|
||||||
print '<br>';
|
print '<br>';
|
||||||
print '<span class="buttonpaymentsmall">'.$langs->trans("CreditOrDebitCard").'</span>';
|
print '<span class="buttonpaymentsmall">'.$langs->trans("CreditOrDebitCard").'</span>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
@ -1858,12 +1859,12 @@ if (preg_match('/^dopayment/', $action)) // If we choosed/click on the payment
|
|||||||
|
|
||||||
$service = 'StripeLive';
|
$service = 'StripeLive';
|
||||||
$servicestatus = 1;
|
$servicestatus = 1;
|
||||||
|
|
||||||
if (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))
|
if (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox', 'alpha'))
|
||||||
{
|
{
|
||||||
$service = 'StripeTest';
|
$service = 'StripeTest';
|
||||||
$servicestatus = 0;
|
$servicestatus = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
$stripe = new Stripe($db);
|
$stripe = new Stripe($db);
|
||||||
$stripeacc = $stripe->getStripeAccount($service);
|
$stripeacc = $stripe->getStripeAccount($service);
|
||||||
$stripecu = null;
|
$stripecu = null;
|
||||||
@ -1871,7 +1872,10 @@ if (preg_match('/^dopayment/', $action)) // If we choosed/click on the payment
|
|||||||
|
|
||||||
if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION))
|
if (! empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION))
|
||||||
{
|
{
|
||||||
$paymentintent=$stripe->getPaymentIntent($amount, $currency, $tag, 'Stripe payment: '.$fulltag.(is_object($object)?' ref='.$object->ref:''), $object, $stripecu, $stripeacc, $servicestatus);
|
$noidempotency_key = (GETPOSTISSET('noidempotency') ? GETPOST('noidempotency', 'int') : 0); // By default noidempotency is unset, so we must use a different tag/ref for each payment. If set, we can pay several times the same tag/ref.
|
||||||
|
$paymentintent=$stripe->getPaymentIntent($amount, $currency, $tag, 'Stripe payment: '.$fulltag.(is_object($object)?' ref='.$object->ref:''), $object, $stripecu, $stripeacc, $servicestatus, 0, 'automatic', false, null, 0, $noidempotency_key);
|
||||||
|
// The paymentintnent has status 'requires_payment_method' (even if paymentintent was already payed)
|
||||||
|
//var_dump($paymentintent);
|
||||||
if ($stripe->error) setEventMessages($stripe->error, null, 'errors');
|
if ($stripe->error) setEventMessages($stripe->error, null, 'errors');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -318,9 +318,10 @@ class Stripe extends CommonObject
|
|||||||
* @param boolean $confirmnow false=default, true=try to confirm immediatly after create (if conditions are ok)
|
* @param boolean $confirmnow false=default, true=try to confirm immediatly after create (if conditions are ok)
|
||||||
* @param string $payment_method 'pm_....' (if known)
|
* @param string $payment_method 'pm_....' (if known)
|
||||||
* @param string $off_session If we use an already known payment method to pay off line.
|
* @param string $off_session If we use an already known payment method to pay off line.
|
||||||
|
* @param string $noidempotency_key Do not use the idempotency_key when creating the PaymentIntent
|
||||||
* @return \Stripe\PaymentIntent|null Stripe PaymentIntent or null if not found and failed to create
|
* @return \Stripe\PaymentIntent|null Stripe PaymentIntent or null if not found and failed to create
|
||||||
*/
|
*/
|
||||||
public function getPaymentIntent($amount, $currency_code, $tag, $description = '', $object = null, $customer = null, $key = null, $status = 0, $usethirdpartyemailforreceiptemail = 0, $mode = 'automatic', $confirmnow = false, $payment_method = null, $off_session = 0)
|
public function getPaymentIntent($amount, $currency_code, $tag, $description = '', $object = null, $customer = null, $key = null, $status = 0, $usethirdpartyemailforreceiptemail = 0, $mode = 'automatic', $confirmnow = false, $payment_method = null, $off_session = 0, $noidempotency_key = 0)
|
||||||
{
|
{
|
||||||
global $conf;
|
global $conf;
|
||||||
|
|
||||||
@ -352,9 +353,10 @@ class Stripe extends CommonObject
|
|||||||
if (is_object($object))
|
if (is_object($object))
|
||||||
{
|
{
|
||||||
// Warning. If a payment was tried and failed, a payment intent was created.
|
// Warning. If a payment was tried and failed, a payment intent was created.
|
||||||
// But if we change someting on object to pay (amount or other), reusing same payment intent is not allowed.
|
// But if we change someting on object to pay (amount or other that does not change the idempotency key), reusing same payment intent is not allowed.
|
||||||
// Recommanded solution is to recreate a new payment intent each time we need one (old one will be automatically closed after a delay),
|
// Recommanded solution is to recreate a new payment intent each time we need one (old one will be automatically closed after a delay), Stripe will
|
||||||
// that's why i comment the part of code to retreive a payment intent with object id (never mind if we cumulate payment intent with old that will not be used)
|
// automatically return the existing payment intent if idempotency is provided when we try to create the new one.
|
||||||
|
// That's why we can comment the part of code to retreive a payment intent with object id (never mind if we cumulate payment intent with old ones that will not be used)
|
||||||
/*
|
/*
|
||||||
$sql = "SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site";
|
$sql = "SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site";
|
||||||
$sql.= " FROM " . MAIN_DB_PREFIX . "prelevement_facture_demande as pi";
|
$sql.= " FROM " . MAIN_DB_PREFIX . "prelevement_facture_demande as pi";
|
||||||
@ -445,14 +447,15 @@ class Stripe extends CommonObject
|
|||||||
global $stripearrayofkeysbyenv;
|
global $stripearrayofkeysbyenv;
|
||||||
\Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status]['secret_key']);
|
\Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status]['secret_key']);
|
||||||
|
|
||||||
// Note: If all data for payment intent are same than a previous on, even if we use 'create', Stripe will return ID of the old existing payment intent.
|
$arrayofoptions = array();
|
||||||
if (empty($key)) { // If the Stripe connect account not set, we use common API usage
|
if (empty($noidempotency_key)) {
|
||||||
$paymentintent = \Stripe\PaymentIntent::create($dataforintent, array("idempotency_key" => "$description"));
|
$arrayofoptions["idempotency_key"] = $description;
|
||||||
//$paymentintent = \Stripe\PaymentIntent::create($dataforintent, array());
|
|
||||||
} else {
|
|
||||||
$paymentintent = \Stripe\PaymentIntent::create($dataforintent, array("idempotency_key" => "$description", "stripe_account" => $key));
|
|
||||||
//$paymentintent = \Stripe\PaymentIntent::create($dataforintent, array("stripe_account" => $key));
|
|
||||||
}
|
}
|
||||||
|
// Note: If all data for payment intent are same than a previous on, even if we use 'create', Stripe will return ID of the old existing payment intent.
|
||||||
|
if (! empty($key)) { // If the Stripe connect account not set, we use common API usage
|
||||||
|
$arrayofoptions["stripe_account"] = $key;
|
||||||
|
}
|
||||||
|
$paymentintent = \Stripe\PaymentIntent::create($dataforintent, $arrayofoptions);
|
||||||
|
|
||||||
// Store the payment intent
|
// Store the payment intent
|
||||||
if (is_object($object))
|
if (is_object($object))
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php';
|
require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php';
|
||||||
require_once DOL_DOCUMENT_ROOT.'/includes/stripe/lib/Stripe.php';
|
require_once DOL_DOCUMENT_ROOT.'/includes/stripe/lib/Stripe.php';
|
||||||
|
|
||||||
global $stripe;
|
//global $stripe;
|
||||||
global $conf;
|
global $conf;
|
||||||
global $stripearrayofkeysbyenv;
|
global $stripearrayofkeysbyenv;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user