19 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
20 require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
21 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
22 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
23 require_once DOL_DOCUMENT_ROOT.
'/stripe/config.php';
95 $entity = $conf->entity;
98 $sql =
"SELECT tokenstring";
99 $sql .=
" FROM ".MAIN_DB_PREFIX.
"oauth_token";
100 $sql .=
" WHERE service = '".$this->db->escape($mode).
"'";
101 $sql .=
" AND entity = ".((int) $entity);
103 $sql .=
" AND fk_soc = ".((int) $fk_soc);
105 $sql .=
" AND fk_soc IS NULL";
107 $sql .=
" AND fk_user IS NULL AND fk_adherent IS NULL";
109 dol_syslog(get_class($this).
"::getStripeAccount", LOG_DEBUG);
111 $result = $this->
db->query($sql);
113 if ($this->
db->num_rows($result)) {
114 $obj = $this->
db->fetch_object($result);
115 $tokenstring = $obj->tokenstring;
117 $tmparray = json_decode($tokenstring);
118 $key = empty($tmparray->stripe_user_id) ?
'' : $tmparray->stripe_user_id;
126 dol_syslog(
"No dedicated Stripe Connect account available for entity ".$conf->entity);
140 include_once DOL_DOCUMENT_ROOT.
'/societe/class/societeaccount.class.php';
142 return $societeaccount->getCustomerAccount($id,
'stripe', $status, $site_account);
160 if (empty($object->id)) {
161 dol_syslog(
"customerStripe is called with the parameter object that is not loaded");
168 global $stripearrayofkeysbyenv;
169 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
171 $sql =
"SELECT sa.key_account as key_account, sa.entity";
172 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_account as sa";
173 $sql .=
" WHERE sa.fk_soc = ".((int) $object->id);
174 $sql .=
" AND sa.entity IN (".getEntity(
'societe').
")";
175 $sql .=
" AND sa.site = 'stripe' AND sa.status = ".((int) $status);
176 $sql .=
" AND (sa.site_account IS NULL OR sa.site_account = '' OR sa.site_account = '".$this->db->escape($stripearrayofkeysbyenv[$status][
'publishable_key']).
"')";
177 $sql .=
" AND sa.key_account IS NOT NULL AND sa.key_account <> ''";
179 dol_syslog(get_class($this).
"::customerStripe search stripe customer id for thirdparty id=".$object->id, LOG_DEBUG);
184 $obj = $this->
db->fetch_object(
$resql);
185 $tiers = $obj->key_account;
187 dol_syslog(get_class($this).
"::customerStripe found stripe customer key_account = ".$tiers.
". We will try to read it on Stripe with publishable_key = ".$stripearrayofkeysbyenv[$status][
'publishable_key']);
192 $customer = \Stripe\Customer::retrieve(array(
'id'=>
"$tiers",
'expand[]'=>
'sources'));
195 $customer = \Stripe\Customer::retrieve(array(
'id'=>
"$tiers",
'expand[]'=>
'sources'), array(
"stripe_account" => $key));
199 $this->error = $e->getMessage();
201 } elseif ($createifnotlinkedtostripe) {
204 $dataforcustomer = array(
205 "email" => $object->email,
206 "description" => $object->name,
207 "metadata" => array(
'dol_id'=>$object->id,
'dol_version'=>DOL_VERSION,
'dol_entity'=>$conf->entity,
'ipaddress'=>$ipaddress)
210 $vatcleaned = $object->tva_intra ? $object->tva_intra :
null;
227 global $stripearrayofkeysbyenv;
228 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
231 $customer = \Stripe\Customer::create($dataforcustomer);
233 $customer = \Stripe\Customer::create($dataforcustomer, array(
"stripe_account" => $key));
237 if (!empty($conf->global->STRIPE_SAVE_TAX_IDS)) {
238 if (!empty($vatcleaned)) {
240 if ($object->country_code && $isineec) {
242 $customer->createTaxId($customer->id, array(
'type'=>
'eu_vat',
'value'=>$vatcleaned));
248 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"societe_account (fk_soc, login, key_account, site, site_account, status, entity, date_creation, fk_user_creat)";
249 $sql .=
" VALUES (".((int) $object->id).
", '', '".$this->
db->escape($customer->id).
"', 'stripe', '".$this->
db->escape($stripearrayofkeysbyenv[$status][
'publishable_key']).
"', ".((int) $status).
", ".((int) $conf->entity).
", '".$this->
db->idate(
dol_now()).
"', ".((
int) $user->id).
")";
252 $this->error = $this->
db->lasterror();
255 $this->error = $e->getMessage();
275 $stripepaymentmethod =
null;
279 global $stripearrayofkeysbyenv;
280 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
282 $stripepaymentmethod = \Stripe\PaymentMethod::retrieve((
string) $paymentmethod->id);
284 $stripepaymentmethod = \Stripe\PaymentMethod::retrieve((
string) $paymentmethod->id, array(
"stripe_account" => $key));
287 $this->error = $e->getMessage();
290 return $stripepaymentmethod;
303 $selectedreader =
null;
307 global $stripearrayofkeysbyenv;
308 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
310 $selectedreader = \Stripe\Terminal\Reader::retrieve((
string) $reader);
312 $stripepaymentmethod = \Stripe\Terminal\Reader::retrieve((
string) $reader, array(
"stripe_account" => $key));
315 $this->error = $e->getMessage();
318 return $selectedreader;
346 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 = 1)
350 dol_syslog(get_class($this).
"::getPaymentIntent", LOG_INFO, 1);
354 if (empty($status)) {
355 $service =
'StripeTest';
357 $service =
'StripeLive';
360 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
361 if (!in_array($currency_code, $arrayzerounitcurrency)) {
362 $stripeamount = $amount * 100;
364 $stripeamount = $amount;
367 $fee = $amount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE;
368 if ($fee >= $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL > $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
369 $fee = $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL;
370 } elseif ($fee < $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
371 $fee = $conf->global->STRIPE_APPLICATION_FEE_MINIMAL;
373 if (!in_array($currency_code, $arrayzerounitcurrency)) {
374 $stripefee = round($fee * 100);
376 $stripefee = round($fee);
379 $paymentintent =
null;
388 $sql =
"SELECT pi.ext_payment_id, pi.entity, pi.fk_facture, pi.sourcetype, pi.ext_payment_site";
389 $sql .=
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as pi";
390 $sql .=
" WHERE pi.fk_facture = ".((int) $object->id);
391 $sql .=
" AND pi.sourcetype = '".$this->db->escape($object->element).
"'";
392 $sql .=
" AND pi.entity IN (".getEntity(
'societe').
")";
393 $sql .=
" AND pi.ext_payment_site = '".$this->db->escape($service).
"'";
395 dol_syslog(get_class($this).
"::getPaymentIntent search stripe payment intent for object id = ".$object->id, LOG_DEBUG);
400 $obj = $this->
db->fetch_object(
$resql);
401 $intent = $obj->ext_payment_id;
403 dol_syslog(get_class($this).
"::getPaymentIntent found existing payment intent record");
406 global $stripearrayofkeysbyenv;
407 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
411 $paymentintent = \Stripe\PaymentIntent::retrieve($intent);
413 $paymentintent = \Stripe\PaymentIntent::retrieve($intent, array(
"stripe_account" => $key));
417 $this->error = $e->getMessage();
423 if (empty($paymentintent)) {
426 $metadata = array(
'dol_version'=>DOL_VERSION,
'dol_entity'=>$conf->entity,
'ipaddress'=>$ipaddress);
427 if (is_object($object)) {
428 $metadata[
'dol_type'] = $object->element;
429 $metadata[
'dol_id'] = $object->id;
430 if (is_object($object->thirdparty) && $object->thirdparty->id > 0) {
431 $metadata[
'dol_thirdparty_id'] = $object->thirdparty->id;
436 $paymentmethodtypes = array(
"card");
437 $descriptor =
dol_trunc($tag, 10,
'right',
'UTF-8', 1);
439 $paymentmethodtypes[] =
"sepa_debit";
443 $paymentmethodtypes[] =
"klarna";
446 $paymentmethodtypes[] =
"bancontact";
449 $paymentmethodtypes[] =
"ideal";
452 $paymentmethodtypes[] =
"giropay";
455 $paymentmethodtypes[] =
"sofort";
458 $paymentmethodtypes = array(
"card_present");
461 $dataforintent = array(
462 "confirm" => $confirmnow,
463 "confirmation_method" => $mode,
464 "amount" => $stripeamount,
465 "currency" => $currency_code,
466 "payment_method_types" => $paymentmethodtypes,
467 "description" => $description,
468 "statement_descriptor_suffix" => $descriptor,
469 "statement_descriptor" => $descriptor,
471 "setup_future_usage" =>
"on_session",
472 "metadata" => $metadata
474 if (!is_null($customer)) {
475 $dataforintent[
"customer"] = $customer;
481 unset($dataforintent[
'setup_future_usage']);
485 $dataforintent[
"off_session"] =
true;
488 unset($dataforintent[
'setup_future_usage']);
491 unset($dataforintent[
'setup_future_usage']);
494 unset($dataforintent[
'setup_future_usage']);
495 $dataforintent[
"capture_method"] =
"manual";
496 $dataforintent[
"confirmation_method"] =
"manual";
498 if (!is_null($payment_method)) {
499 $dataforintent[
"payment_method"] = $payment_method;
500 $description .=
' - '.$payment_method;
503 if ($conf->entity !=
getDolGlobalInt(
'STRIPECONNECT_PRINCIPAL') && $stripefee > 0) {
504 $dataforintent[
"application_fee_amount"] = $stripefee;
506 if ($usethirdpartyemailforreceiptemail && is_object($object) && $object->thirdparty->email) {
507 $dataforintent[
"receipt_email"] = $object->thirdparty->email;
512 global $stripearrayofkeysbyenv;
513 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
515 $arrayofoptions = array();
516 if (empty($noidempotency_key)) {
517 $arrayofoptions[
"idempotency_key"] = $description;
521 $arrayofoptions[
"stripe_account"] = $key;
524 dol_syslog(
"dataforintent to create paymentintent = ".var_export($dataforintent,
true));
526 $paymentintent = \Stripe\PaymentIntent::create($dataforintent, $arrayofoptions);
529 if (is_object($object)) {
530 $paymentintentalreadyexists = 0;
532 $sql =
"SELECT pi.rowid";
533 $sql .=
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as pi";
534 $sql .=
" WHERE pi.entity IN (".getEntity(
'societe').
")";
535 $sql .=
" AND pi.ext_payment_site = '".$this->db->escape($service).
"'";
536 $sql .=
" AND pi.ext_payment_id = '".$this->db->escape($paymentintent->id).
"'";
538 dol_syslog(get_class($this).
"::getPaymentIntent search if payment intent already in prelevement_demande", LOG_DEBUG);
543 $obj = $this->
db->fetch_object(
$resql);
545 $paymentintentalreadyexists++;
553 if (!$paymentintentalreadyexists) {
555 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"prelevement_demande (date_demande, fk_user_demande, ext_payment_id, fk_facture, sourcetype, entity, ext_payment_site, amount)";
556 $sql .=
" VALUES ('".$this->db->idate($now).
"', ".((int) $user->id).
", '".$this->
db->escape($paymentintent->id).
"', ".((int) $object->id).
", '".$this->
db->escape($object->element).
"', ".((int) $conf->entity).
", '".$this->
db->escape($service).
"', ".((
float) $amount).
")";
560 $this->error = $this->
db->lasterror();
561 dol_syslog(get_class($this).
"::PaymentIntent failed to insert paymentintent with id=".$paymentintent->id.
" into database.", LOG_ERR);
565 $_SESSION[
"stripe_payment_intent"] = $paymentintent;
567 }
catch (
Stripe\Error\Card $e) {
569 $this->error = $e->getMessage();
570 $this->
code = $e->getStripeCode();
571 $this->declinecode = $e->getDeclineCode();
580 $this->error = $e->getMessage();
582 $this->declinecode =
'';
586 dol_syslog(get_class($this).
"::getPaymentIntent return error=".$error.
" this->error=".$this->error, LOG_INFO, -1);
589 return $paymentintent;
613 public function getSetupIntent($description, $object, $customer, $key, $status, $usethirdpartyemailforreceiptemail = 0, $confirmnow =
false)
617 dol_syslog(
"getSetupIntent description=".$description.
' confirmnow='.$confirmnow, LOG_INFO, 1);
621 if (empty($status)) {
622 $service =
'StripeTest';
624 $service =
'StripeLive';
629 if (empty($setupintent)) {
631 $metadata = array(
'dol_version'=>DOL_VERSION,
'dol_entity'=>$conf->entity,
'ipaddress'=>$ipaddress);
632 if (is_object($object)) {
633 $metadata[
'dol_type'] = $object->element;
634 $metadata[
'dol_id'] = $object->id;
635 if (is_object($object->thirdparty) && $object->thirdparty->id > 0) {
636 $metadata[
'dol_thirdparty_id'] = $object->thirdparty->id;
641 $paymentmethodtypes = array(
"card");
642 if (!empty($conf->global->STRIPE_SEPA_DIRECT_DEBIT)) {
643 $paymentmethodtypes[] =
"sepa_debit";
645 if (!empty($conf->global->STRIPE_BANCONTACT)) {
646 $paymentmethodtypes[] =
"bancontact";
648 if (!empty($conf->global->STRIPE_IDEAL)) {
649 $paymentmethodtypes[] =
"ideal";
652 if (!empty($conf->global->STRIPE_SOFORT)) {
653 $paymentmethodtypes[] =
"sofort";
656 $dataforintent = array(
657 "confirm" => $confirmnow,
658 "payment_method_types" => $paymentmethodtypes,
659 "usage" =>
"off_session",
660 "metadata" => $metadata
662 if (!is_null($customer)) {
663 $dataforintent[
"customer"] = $customer;
665 if (!is_null($description)) {
666 $dataforintent[
"description"] = $description;
672 if ($usethirdpartyemailforreceiptemail && is_object($object) && $object->thirdparty->email) {
673 $dataforintent[
"receipt_email"] = $object->thirdparty->email;
678 global $stripearrayofkeysbyenv;
679 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
681 dol_syslog(
"getSetupIntent ".$stripearrayofkeysbyenv[$status][
'publishable_key'], LOG_DEBUG);
686 $setupintent = \Stripe\SetupIntent::create($dataforintent, array());
689 $setupintent = \Stripe\SetupIntent::create($dataforintent, array(
"stripe_account" => $key));
742 $this->error = $e->getMessage();
747 dol_syslog(
"getSetupIntent ".(is_object($setupintent) ? $setupintent->id :
''), LOG_INFO, -1);
750 dol_syslog(
"getSetupIntent return error=".$error, LOG_INFO, -1);
768 global $conf, $user, $langs;
772 $sql =
"SELECT sa.stripe_card_ref, sa.proprio, sa.exp_date_month, sa.exp_date_year, sa.number, sa.cvn";
773 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_rib as sa";
774 $sql .=
" WHERE sa.rowid = ".((int) $object->id);
775 $sql .=
" AND sa.type = 'card'";
777 dol_syslog(get_class($this).
"::cardStripe search stripe card id for paymentmode id=".$object->id.
", stripeacc=".$stripeacc.
", status=".$status.
", createifnotlinkedtostripe=".$createifnotlinkedtostripe, LOG_DEBUG);
782 $obj = $this->
db->fetch_object(
$resql);
783 $cardref = $obj->stripe_card_ref;
784 dol_syslog(get_class($this).
"::cardStripe cardref=".$cardref);
787 if (empty($stripeacc)) {
788 if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
789 $card = $cu->sources->retrieve($cardref);
791 $card = \Stripe\PaymentMethod::retrieve($cardref);
794 if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
796 $card = $cu->sources->retrieve($cardref);
799 $card = \Stripe\PaymentMethod::retrieve($cardref);
803 $this->error = $e->getMessage();
806 } elseif ($createifnotlinkedtostripe) {
807 $exp_date_month = $obj->exp_date_month;
808 $exp_date_year = $obj->exp_date_year;
809 $number = $obj->number;
811 $cardholdername = $obj->proprio;
815 $dataforcard = array(
816 "source" => array(
'object'=>
'card',
'exp_month'=>$exp_date_month,
'exp_year'=>$exp_date_year,
'number'=>$number,
'cvc'=>$cvc,
'name'=>$cardholdername),
817 "metadata" => array(
'dol_id'=>$object->id,
'dol_version'=>DOL_VERSION,
'dol_entity'=>$conf->entity,
'ipaddress'=>$ipaddress)
824 if (empty($stripeacc)) {
825 if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
826 dol_syslog(
"Try to create card with dataforcard = ".json_encode($dataforcard));
827 $card = $cu->sources->create($dataforcard);
829 $this->error =
'Creation of card on Stripe has failed';
833 if (!empty($stripeacc)) {
834 $connect = $stripeacc.
'/';
836 $url =
'https://dashboard.stripe.com/'.$connect.
'test/customers/'.$cu->id;
838 $url =
'https://dashboard.stripe.com/'.$connect.
'customers/'.$cu->id;
840 $urtoswitchonstripe =
' <a href="'.$url.
'" target="_stripe">'.
img_picto($langs->trans(
'ShowInStripe'),
'globe').
'</a>';
843 $this->error = $langs->trans(
'CreationOfPaymentModeMustBeDoneFromStripeInterface', $urtoswitchonstripe);
846 if (empty($conf->global->STRIPE_USE_INTENT_WITH_AUTOMATIC_CONFIRMATION)) {
847 dol_syslog(
"Try to create card with dataforcard = ".json_encode($dataforcard));
848 $card = $cu->sources->create($dataforcard, array(
"stripe_account" => $stripeacc));
850 $this->error =
'Creation of card on Stripe has failed';
854 if (!empty($stripeacc)) {
855 $connect = $stripeacc.
'/';
857 $url =
'https://dashboard.stripe.com/'.$connect.
'test/customers/'.$cu->id;
859 $url =
'https://dashboard.stripe.com/'.$connect.
'customers/'.$cu->id;
861 $urtoswitchonstripe =
' <a href="'.$url.
'" target="_stripe">'.
img_picto($langs->trans(
'ShowInStripe'),
'globe').
'</a>';
864 $this->error = $langs->trans(
'CreationOfPaymentModeMustBeDoneFromStripeInterface', $urtoswitchonstripe);
869 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"societe_rib";
870 $sql .=
" SET stripe_card_ref = '".$this->db->escape($card->id).
"', card_type = '".$this->
db->escape($card->brand).
"',";
871 $sql .=
" country_code = '".$this->db->escape($card->country).
"',";
872 $sql .=
" approved = ".($card->cvc_check ==
'pass' ? 1 : 0);
873 $sql .=
" WHERE rowid = ".((int) $object->id);
874 $sql .=
" AND type = 'card'";
877 $this->error = $this->
db->lasterror();
881 $this->error = $e->getMessage();
906 global $conf, $user, $langs;
909 $sql =
"SELECT sa.stripe_card_ref, sa.proprio, sa.iban_prefix";
910 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_rib as sa";
911 $sql .=
" WHERE sa.rowid = ".((int) $object->id);
912 $sql .=
" AND sa.type = 'ban'";
915 $soc->fetch($object->fk_soc);
917 dol_syslog(get_class($this).
"::sepaStripe search stripe ban id for paymentmode id=".$object->id.
", stripeacc=".$stripeacc.
", status=".$status.
", createifnotlinkedtostripe=".$createifnotlinkedtostripe, LOG_DEBUG);
922 $obj = $this->
db->fetch_object(
$resql);
923 $cardref = $obj->stripe_card_ref;
924 dol_syslog(get_class($this).
"::sepaStripe cardref=".$cardref);
927 if (empty($stripeacc)) {
928 if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
929 $sepa = $cu->sources->retrieve($cardref);
931 $sepa = \Stripe\PaymentMethod::retrieve($cardref);
934 if (!preg_match(
'/^pm_/', $cardref) && !empty($cu->sources)) {
936 $sepa = $cu->sources->retrieve($cardref);
939 $sepa = \Stripe\PaymentMethod::retrieve($cardref);
943 $this->error = $e->getMessage();
946 } elseif ($createifnotlinkedtostripe) {
947 $iban = $obj->iban_prefix;
950 $dataforcard = array(
951 'type'=>
'sepa_debit',
952 "sepa_debit" => array(
'iban' => $iban),
954 'usage' =>
'reusable',
956 'name' => $soc->name,
958 "metadata" => array(
'dol_id'=>$object->id,
'dol_version'=>DOL_VERSION,
'dol_entity'=>$conf->entity,
'ipaddress'=>$ipaddress)
966 $service =
'StripeTest';
968 if (!empty($conf->global->STRIPE_LIVE) && !
GETPOST(
'forcesandbox',
'alpha')) {
969 $service =
'StripeLive';
973 global $stripearrayofkeysbyenv;
974 $stripeacc = $stripearrayofkeysbyenv[$servicestatus][
'secret_key'];
976 dol_syslog(
"Try to create sepa_debit with data = ".json_encode($dataforcard));
977 $s = new \Stripe\StripeClient($stripeacc);
978 $sepa = $s->sources->create($dataforcard);
980 $this->error =
'Creation of sepa_debit on Stripe has failed';
983 $cs = $cu->createSource($cu->id, array(
'source' => $sepa->id));
985 $this->error =
'Link SEPA <-> Customer failed';
990 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"societe_rib";
991 $sql .=
" SET stripe_card_ref = '".$this->db->escape($sepa->id).
"', card_type = 'sepa_debit',";
992 $sql .=
" stripe_account= '" . $this->
db->escape($cu->id .
"@" . $stripeacc) .
"'";
993 $sql .=
" WHERE rowid = ".((int) $object->id);
994 $sql .=
" AND type = 'ban'";
997 $this->error = $this->
db->lasterror();
1002 $this->error = $e->getMessage();
1030 public function createPaymentStripe($amount, $currency, $origin, $item, $source, $customer, $account, $status = 0, $usethirdpartyemailforreceiptemail = 0, $capture =
true)
1036 if (empty($status)) {
1037 $service =
'StripeTest';
1039 $service =
'StripeLive';
1042 $sql =
"SELECT sa.key_account as key_account, sa.fk_soc, sa.entity";
1043 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe_account as sa";
1044 $sql .=
" WHERE sa.key_account = '".$this->db->escape($customer).
"'";
1046 $sql .=
" AND sa.site = 'stripe' AND sa.status = ".((int) $status);
1048 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1049 $result = $this->
db->query($sql);
1051 if ($this->
db->num_rows($result)) {
1052 $obj = $this->
db->fetch_object($result);
1053 $key = $obj->fk_soc;
1061 $arrayzerounitcurrency = array(
'BIF',
'CLP',
'DJF',
'GNF',
'JPY',
'KMF',
'KRW',
'MGA',
'PYG',
'RWF',
'VND',
'VUV',
'XAF',
'XOF',
'XPF');
1062 if (!in_array($currency, $arrayzerounitcurrency)) {
1063 $stripeamount = $amount * 100;
1065 $stripeamount = $amount;
1070 $societe->fetch($key);
1075 if ($origin ==
'order') {
1077 $order->fetch($item);
1079 $description =
"ORD=".$ref.
".CUS=".$societe->id.
".PM=stripe";
1080 } elseif ($origin ==
'invoice') {
1082 $invoice->fetch($item);
1083 $ref = $invoice->ref;
1084 $description =
"INV=".$ref.
".CUS=".$societe->id.
".PM=stripe";
1090 "dol_id" => (
string) $item,
1091 "dol_type" => (
string) $origin,
1092 "dol_thirdparty_id" => (
string) $societe->id,
1093 'dol_thirdparty_name' => $societe->name,
1094 'dol_version' => DOL_VERSION,
1095 'dol_entity' => $conf->entity,
1096 'ipaddress' => $ipaddress
1101 global $stripearrayofkeysbyenv;
1102 \Stripe\Stripe::setApiKey($stripearrayofkeysbyenv[$status][
'secret_key']);
1104 if (empty($conf->stripeconnect->enabled)) {
1105 if (preg_match(
'/pm_/i', $source)) {
1106 $stripecard = $source;
1107 $amountstripe = $stripeamount;
1110 $amounttopay = $amount;
1111 $servicestatus = $status;
1113 dol_syslog(
"* createPaymentStripe get stripeacc", LOG_DEBUG);
1114 $stripeacc = $stripe->getStripeAccount($service);
1116 dol_syslog(
"* createPaymentStripe Create payment for customer ".$customer->id.
" on source card ".$stripecard->id.
", amounttopay=".$amounttopay.
", amountstripe=".$amountstripe.
", FULLTAG=".$FULLTAG, LOG_DEBUG);
1119 $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $invoice, $customer->id, $stripeacc, $servicestatus, 0,
'automatic',
true, $stripecard->id, 1);
1121 $charge =
new stdClass();
1122 if ($paymentintent->status ==
'succeeded') {
1123 $charge->status =
'ok';
1125 $charge->status =
'failed';
1126 $charge->failure_code = $stripe->code;
1127 $charge->failure_message = $stripe->error;
1128 $charge->failure_declinecode = $stripe->declinecode;
1129 $stripefailurecode = $stripe->code;
1130 $stripefailuremessage = $stripe->error;
1131 $stripefailuredeclinecode = $stripe->declinecode;
1133 } elseif (preg_match(
'/acct_/i', $source)) {
1134 $charge = \Stripe\Charge::create(array(
1135 "amount" =>
"$stripeamount",
1136 "currency" =>
"$currency",
1137 "statement_descriptor_suffix" =>
dol_trunc($description, 10,
'right',
'UTF-8', 1),
1138 "description" =>
"Stripe payment: ".$description,
1139 "capture" => $capture,
1140 "metadata" => $metadata,
1141 "source" =>
"$source"
1144 $paymentarray = array(
1145 "amount" =>
"$stripeamount",
1146 "currency" =>
"$currency",
1147 "statement_descriptor_suffix" =>
dol_trunc($description, 10,
'right',
'UTF-8', 1),
1148 "description" =>
"Stripe payment: ".$description,
1149 "capture" => $capture,
1150 "metadata" => $metadata,
1151 "source" =>
"$source",
1152 "customer" =>
"$customer"
1155 if ($societe->email && $usethirdpartyemailforreceiptemail) {
1156 $paymentarray[
"receipt_email"] = $societe->email;
1159 $charge = \Stripe\Charge::create($paymentarray, array(
"idempotency_key" =>
"$description"));
1163 $fee = $amount * ($conf->global->STRIPE_APPLICATION_FEE_PERCENT / 100) + $conf->global->STRIPE_APPLICATION_FEE;
1164 if ($fee >= $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL && $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL > $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
1165 $fee = $conf->global->STRIPE_APPLICATION_FEE_MAXIMAL;
1166 } elseif ($fee < $conf->global->STRIPE_APPLICATION_FEE_MINIMAL) {
1167 $fee = $conf->global->STRIPE_APPLICATION_FEE_MINIMAL;
1170 if (!in_array($currency, $arrayzerounitcurrency)) {
1171 $stripefee = round($fee * 100);
1173 $stripefee = round($fee);
1176 $paymentarray = array(
1177 "amount" =>
"$stripeamount",
1178 "currency" =>
"$currency",
1179 "statement_descriptor_suffix" =>
dol_trunc($description, 10,
'right',
'UTF-8', 1),
1180 "description" =>
"Stripe payment: ".$description,
1181 "capture" => $capture,
1182 "metadata" => $metadata,
1183 "source" =>
"$source",
1184 "customer" =>
"$customer"
1186 if ($conf->entity != $conf->global->STRIPECONNECT_PRINCIPAL && $stripefee > 0) {
1187 $paymentarray[
"application_fee_amount"] = $stripefee;
1189 if ($societe->email && $usethirdpartyemailforreceiptemail) {
1190 $paymentarray[
"receipt_email"] = $societe->email;
1193 if (preg_match(
'/pm_/i', $source)) {
1194 $stripecard = $source;
1195 $amountstripe = $stripeamount;
1198 $amounttopay = $amount;
1199 $servicestatus = $status;
1201 dol_syslog(
"* createPaymentStripe get stripeacc", LOG_DEBUG);
1202 $stripeacc = $stripe->getStripeAccount($service);
1204 dol_syslog(
"* createPaymentStripe Create payment on card ".$stripecard->id.
", amounttopay=".$amounttopay.
", amountstripe=".$amountstripe.
", FULLTAG=".$FULLTAG, LOG_DEBUG);
1207 $paymentintent = $stripe->getPaymentIntent($amounttopay, $currency, $FULLTAG, $description, $invoice, $customer->id, $stripeacc, $servicestatus, 0,
'automatic',
true, $stripecard->id, 1);
1209 $charge =
new stdClass();
1210 if ($paymentintent->status ==
'succeeded') {
1211 $charge->status =
'ok';
1212 $charge->id = $paymentintent->id;
1214 $charge->status =
'failed';
1215 $charge->failure_code = $stripe->code;
1216 $charge->failure_message = $stripe->error;
1217 $charge->failure_declinecode = $stripe->declinecode;
1220 $charge = \Stripe\Charge::create($paymentarray, array(
"idempotency_key" =>
"$description",
"stripe_account" =>
"$account"));
1223 if (isset($charge->id)) {
1226 $return->statut =
'success';
1227 $return->id = $charge->id;
1229 if (preg_match(
'/pm_/i', $source)) {
1230 $return->message =
'Payment retrieved by card status = '.$charge->status;
1232 if ($charge->source->type ==
'card') {
1233 $return->message = $charge->source->card->brand.
" ....".$charge->source->card->last4;
1234 } elseif ($charge->source->type ==
'three_d_secure') {
1236 $src = \Stripe\Source::retrieve(
"".$charge->source->three_d_secure->card, array(
1237 "stripe_account" => $stripe->getStripeAccount($service)
1239 $return->message = $src->card->brand.
" ....".$src->card->last4;
1241 $return->message = $charge->id;
1244 }
catch (\
Stripe\Error\Card $e) {
1245 include DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
1247 $body = $e->getJsonBody();
1248 $err = $body[
'error'];
1250 $return->statut =
'error';
1251 $return->id = $err[
'charge'];
1252 $return->type = $err[
'type'];
1253 $return->code = $err[
'code'];
1254 $return->message = $err[
'message'];
1255 $body =
"Error: <br>".$return->id.
" ".$return->message.
" ";
1256 $subject =
'[Alert] Payment error using Stripe';
1257 $cmailfile =
new CMailFile($subject, $conf->global->ONLINE_PAYMENT_SENDEMAIL, $conf->global->MAIN_INFO_SOCIETE_MAIL, $body);
1258 $cmailfile->sendfile();
1261 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
1262 }
catch (\
Stripe\Error\RateLimit $e) {
1265 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
1266 }
catch (\
Stripe\Error\InvalidRequest $e) {
1269 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
1270 }
catch (\
Stripe\Error\Authentication $e) {
1274 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
1275 }
catch (\
Stripe\Error\ApiConnection $e) {
1278 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
1279 }
catch (\
Stripe\Error\Base $e) {
1283 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
1287 dol_syslog($e->getMessage(), LOG_WARNING, 0,
'_stripe');
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class to manage customers orders.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
Class for CompanyPaymentMode.
Class to manage invoices.
Class for SocieteAccount.
Class to manage third parties objects (customers, suppliers, prospects...)
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=1)
Get the Stripe payment intent.
getSetupIntent($description, $object, $customer, $key, $status, $usethirdpartyemailforreceiptemail=0, $confirmnow=false)
Get the Stripe payment intent.
getPaymentMethodStripe($paymentmethod, $key='', $status=0)
Get the Stripe payment method Object from its ID.
sepaStripe($cu, CompanyPaymentMode $object, $stripeacc='', $status=0, $createifnotlinkedtostripe=0)
Get the Stripe SEPA of a company payment mode.
getStripeCustomerAccount($id, $status=0, $site_account='')
getStripeCustomerAccount
cardStripe($cu, CompanyPaymentMode $object, $stripeacc='', $status=0, $createifnotlinkedtostripe=0)
Get the Stripe card of a company payment mode (option to create it on Stripe if not linked yet is no ...
createPaymentStripe($amount, $currency, $origin, $item, $source, $customer, $account, $status=0, $usethirdpartyemailforreceiptemail=0, $capture=true)
Create charge.
__construct($db)
Constructor.
getStripeAccount($mode='StripeTest', $fk_soc=0, $entity=-1)
Return main company OAuth Connect stripe account.
customerStripe(Societe $object, $key='', $status=0, $createifnotlinkedtostripe=0)
Get the Stripe customer of a thirdparty (with option to create it in Stripe if not linked yet).
getSelectedReader($reader, $key='', $status=0)
Get the Stripe reader Object from its ID.
isInEEC($object)
Return if a country of an object is inside the EEC (European Economic Community)
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getUserRemoteIP()
Return the IP of remote user.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
if(!defined( 'CSRFCHECK_WITH_TOKEN'))
div float
Buy price without taxes.
$conf db
API class for accounts.
print *****$script_file(".$version.") pid code
! Closing after partial payment: discount_vat, badcustomer or badsupplier, bankcharge,...