21if (!defined(
'NOLOGIN')) {
24if (!defined(
'NOCSRFCHECK')) {
25 define(
"NOCSRFCHECK", 1);
27if (!defined(
'NOIPCHECK')) {
28 define(
'NOIPCHECK',
'1');
30if (!defined(
'NOBROWSERNOTIF')) {
31 define(
'NOBROWSERNOTIF',
'1');
35$entity = (!empty($_GET[
'entity']) ? (int) $_GET[
'entity'] : (!empty($_POST[
'entity']) ? (int) $_POST[
'entity'] : 1));
36if (is_numeric($entity)) {
37 define(
"DOLENTITY", $entity);
41if (!defined(
'USESUFFIXINLOG')) {
42 define(
'USESUFFIXINLOG',
'_stripeipn');
46require
'../../main.inc.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/lib/admin.lib.php';
48require_once DOL_DOCUMENT_ROOT.
'/user/class/user.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/ccountry.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/compta/paiement/class/paiement.class.php';
52require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
53require_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
54require_once DOL_DOCUMENT_ROOT.
'/compta/prelevement/class/bonprelevement.class.php';
55require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
56require_once DOL_DOCUMENT_ROOT.
'/core/class/CMailFile.class.php';
57require_once DOL_DOCUMENT_ROOT.
'/includes/stripe/stripe-php/init.php';
58require_once DOL_DOCUMENT_ROOT.
'/stripe/class/stripe.class.php';
67if (GETPOSTISSET(
'connect')) {
68 if (GETPOSTISSET(
'test')) {
70 $service =
'StripeTest';
74 $service =
'StripeLive';
78 if (GETPOSTISSET(
'test')) {
80 $service =
'StripeTest';
84 $service =
'StripeLive';
89if (!isModEnabled(
'stripe')) {
93if (empty($endpoint_secret)) {
99 $user =
new User($db);
116$payload = @file_get_contents(
"php://input");
117$sig_header = empty($_SERVER[
"HTTP_STRIPE_SIGNATURE"]) ?
'' : $_SERVER[
"HTTP_STRIPE_SIGNATURE"];
121 $fh = fopen(DOL_DATA_ROOT.
'/dolibarr_stripeipn_payload.log',
'w+');
123 fwrite($fh,
dol_print_date(
dol_now(
'gmt'),
'standard').
' IPN Called. service='.$service.
' HTTP_STRIPE_SIGNATURE='.$sig_header.
"\n");
124 fwrite($fh, $payload);
126 dolChmod(DOL_DATA_ROOT.
'/dolibarr_stripeipn_payload.log');
133 $event = \Stripe\Webhook::constructEvent($payload, $sig_header, $endpoint_secret);
134}
catch (UnexpectedValueException $e) {
136 dol_syslog(
"***** Stripe IPN was called with UnexpectedValueException (invalid payload) service=".$service);
137 dol_syslog(
"***** Stripe IPN was called with UnexpectedValueException (invalid payload) service=".$service, LOG_DEBUG, 0,
'_payment');
140 dol_syslog(
"***** Stripe IPN was called with SignatureVerificationException service=".$service);
141 dol_syslog(
"***** Stripe IPN was called with SignatureVerificationException service=".$service, LOG_DEBUG, 0,
'_payment');
142 httponly_accessforbidden(
'Invalid signature. May be a hook for an event created by another Stripe env or a hack attempt ? Check setup of your keys whsec_...', 400);
144 dol_syslog(
"***** Stripe IPN was called with Exception (".$e->getMessage().
") service=".$service);
145 dol_syslog(
"***** Stripe IPN was called with Exception (".$e->getMessage().
") service=".$service, LOG_DEBUG, 0,
'_payment');
154if (isModEnabled(
'multicompany') && !empty(
$conf->stripeconnect->enabled) && is_object($mc)) {
155 $sql =
"SELECT entity";
156 $sql .=
" FROM ".MAIN_DB_PREFIX.
"oauth_token";
157 $sql .=
" WHERE service = '".$db->escape($service).
"' and tokenstring LIKE '%".$db->escape($db->escapeforlike($event->account)).
"%'";
159 dol_syslog(get_class($db).
"::fetch", LOG_DEBUG);
160 dol_syslog(get_class($db).
"::fetch", LOG_DEBUG, 0,
'_payment');
161 $result = $db->query($sql);
163 if ($db->num_rows($result)) {
164 $obj = $db->fetch_object($result);
172 $ret = $mc->switchEntity($key);
185dol_syslog(
"***** Stripe IPN was called with event->type=".$event->type.
" service=".$service);
186dol_syslog(
"***** Stripe IPN was called with event->type=".$event->type.
" service=".$service, LOG_DEBUG, 0,
'_payment');
193if ($event->type ==
'payout.created' &&
getDolGlobalString(
'STRIPE_AUTO_RECORD_PAYOUT')) {
195 dol_syslog(
"object = ".var_export($event->data,
true));
196 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
200 $result =
dolibarr_set_const($db, $service.
"_NEXTPAYOUT", date(
'Y-m-d H:i:s', $event->data->object->arrival_date),
'chaine', 0,
'',
$conf->entity);
203 $subject =
'['.$societeName.
'] Notification - Stripe payout scheduled';
204 if (!empty($user->email)) {
215 $message =
"A bank transfer of ".price2num($event->data->object->amount / 100).
" ".$event->data->object->currency.
" should arrive in your account the ".
dol_print_date($event->data->object->arrival_date,
'dayhour');
231 $ret = $mailfile->sendfile();
236 http_response_code(500);
239} elseif ($event->type ==
'payout.paid' &&
getDolGlobalString(
'STRIPE_AUTO_RECORD_PAYOUT')) {
241 dol_syslog(
"object = ".var_export($event->data,
true));
242 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
247 $langs->load(
"errors");
250 $label = $event->data->object->description;
251 $amount = $event->data->object->amount / 100;
252 $amount_to = $event->data->object->amount / 100;
253 require_once DOL_DOCUMENT_ROOT.
'/compta/bank/class/account.class.php';
255 $accountfrom =
new Account($db);
256 $accountfrom->fetch(
getDolGlobalInt(
'STRIPE_BANK_ACCOUNT_FOR_PAYMENTS'));
259 $accountto->fetch(
getDolGlobalInt(
'STRIPE_BANK_ACCOUNT_FOR_BANKTRANSFERS'));
261 if (($accountto->id != $accountfrom->id) && empty($error)) {
262 $bank_line_id_from = 0;
263 $bank_line_id_to = 0;
276 $bank_line_id_from = $accountfrom->addline($dateo, $typefrom, $label, -1 * (
float)
price2num($amount), $numChqOrOpe, 0, $user,
'',
'',
'',
null,
'',
null,
'Record payout from public/stripe/ipn.php');
278 if (!($bank_line_id_from > 0)) {
282 $bank_line_id_to = $accountto->addline($dateo, $typeto, $label, (
float)
price2num($amount), $numChqOrOpe, 0, $user,
'',
'',
'',
null,
'',
null,
'Record payout from public/stripe/ipn.php');
284 if (!($bank_line_id_to > 0)) {
290 $result = $accountfrom->add_url_line($bank_line_id_from, $bank_line_id_to, DOL_URL_ROOT.
'/compta/bank/line.php?rowid=',
'(banktransfert)',
'banktransfert');
292 if (!($result > 0)) {
296 $result = $accountto->add_url_line($bank_line_id_to, $bank_line_id_from, DOL_URL_ROOT.
'/compta/bank/line.php?rowid=',
'(banktransfert)',
'banktransfert');
298 if (!($result > 0)) {
310 $subject =
'['.$societeName.
'] Notification - Stripe payout done';
311 if (!empty($user->email)) {
322 $message =
"A bank transfer of ".price2num($event->data->object->amount / 100).
" ".$event->data->object->currency.
" has been done to your account the ".
dol_print_date($event->data->object->arrival_date,
'dayhour');
338 $ret = $mailfile->sendfile();
345 http_response_code(500);
348} elseif ($event->type ==
'customer.source.created') {
350} elseif ($event->type ==
'customer.source.updated') {
352} elseif ($event->type ==
'customer.source.delete') {
354} elseif ($event->type ==
'customer.deleted') {
357 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"societe_account WHERE key_account = '".$db->escape($event->data->object->id).
"' AND site = 'stripe'";
360} elseif ($event->type ==
'payment_intent.succeeded') {
362 dol_syslog(
"object = ".var_export($event->data,
true));
363 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
365 include_once DOL_DOCUMENT_ROOT .
'/compta/paiement/class/paiement.class.php';
366 global $stripearrayofkeysbyenv;
368 $object = $event->data->object;
370 $ipaddress =
$object->metadata->ipaddress;
372 $currencyCodeType = strtoupper(
$object->currency);
373 $paymentmethodstripeid =
$object->payment_method;
374 $customer_id =
$object->customer;
376 $paymentTypeCode =
"";
377 $paymentTypeCodeInDolibarr =
"";
379 $payment_amountInDolibarr = 0;
381 dol_syslog(
"Try to find a payment in database for the payment_intent id = ".$TRANSACTIONID);
382 dol_syslog(
"Try to find a payment in database for the payment_intent id = ".$TRANSACTIONID, LOG_DEBUG, 0,
'_payment');
384 $sql =
"SELECT pi.rowid, pi.fk_facture, pi.fk_prelevement_bons, pi.amount, pi.type, pi.traite";
385 $sql .=
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as pi";
386 $sql .=
" WHERE pi.ext_payment_id = '".$db->escape($TRANSACTIONID).
"'";
387 $sql .=
" AND pi.ext_payment_site = '".$db->escape($service).
"'";
389 $result = $db->query($sql);
391 $obj = $db->fetch_object($result);
393 if ($obj->type ==
'ban') {
395 $directdebitorcreditransfer_id = $obj->fk_prelevement_bons;
397 if ($obj->traite == 1) {
400 $invoice_id = $obj->fk_facture;
401 $payment_amountInDolibarr = $obj->amount;
402 $paymentTypeCodeInDolibarr = $obj->type;
404 dol_syslog(
"Found a request in database to pay with direct debit generated (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
")");
405 dol_syslog(
"Found a request in database to pay with direct debit generated (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
")", LOG_DEBUG, 0,
'_payment');
407 dol_syslog(
"Found a request in database not yet generated (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
"). Was the order deleted after being sent ?", LOG_WARNING);
408 dol_syslog(
"Found a request in database not yet generated (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
"). Was the order deleted after being sent ?", LOG_WARNING, 0,
'_payment');
411 if ($obj->type ==
'card' || empty($obj->type)) {
413 if ($obj->traite == 0) {
415 $invoice_id = $obj->fk_facture;
416 $payment_amountInDolibarr = $obj->amount;
417 $paymentTypeCodeInDolibarr = empty($obj->type) ?
'card' : $obj->type;
419 dol_syslog(
"Found a request in database to pay with card (pdid = ".$pdid.
"). We should fix status traite to 1");
420 dol_syslog(
"Found a request in database to pay with card (pdid = ".$pdid.
"). We should fix status traite to 1", LOG_DEBUG, 0,
'_payment');
422 dol_syslog(
"Found a request in database to pay with card (pdid = ".$pdid.
") already set to traite=1. Nothing to fix.");
423 dol_syslog(
"Found a request in database to pay with card (pdid = ".$pdid.
") already set to traite=1. Nothing to fix.", LOG_DEBUG, 0,
'_payment');
427 dol_syslog(
"Payment intent ".$TRANSACTIONID.
" not found into database, so ignored.");
428 dol_syslog(
"Payment intent ".$TRANSACTIONID.
" not found into database, so ignored.", LOG_DEBUG, 0,
'_payment');
429 http_response_code(200);
430 print
"Payment intent ".$TRANSACTIONID.
" not found into database, so ignored.";
434 http_response_code(500);
435 print $db->lasterror();
439 if ($paymentTypeCodeInDolibarr) {
442 $stripeacc = $stripearrayofkeysbyenv[$servicestatus][
'secret_key'];
444 dol_syslog(
"Get the Stripe payment object for the payment method id = ".json_encode($paymentmethodstripeid));
445 dol_syslog(
"Get the Stripe payment object for the payment method id = ".json_encode($paymentmethodstripeid), LOG_DEBUG, 0,
'_payment');
447 $s = new \Stripe\StripeClient($stripeacc);
449 $paymentmethodstripe = $s->paymentMethods->retrieve($paymentmethodstripeid);
450 $paymentTypeCode = $paymentmethodstripe->type;
451 if ($paymentTypeCode ==
"ban" || $paymentTypeCode ==
"sepa_debit") {
452 $paymentTypeCode =
"PRE";
453 } elseif ($paymentTypeCode ==
"card") {
454 $paymentTypeCode =
"CB";
457 $payment_amount = $payment_amountInDolibarr;
462 $postactionmessages = array();
464 if ($paymentTypeCode ==
"CB" && ($paymentTypeCodeInDolibarr ==
'card' || empty($paymentTypeCodeInDolibarr))) {
470 dol_syslog(
"TODO update flag traite to 1", LOG_DEBUG, 0,
'_payment');
471 } elseif ($paymentTypeCode ==
"PRE" && $paymentTypeCodeInDolibarr ==
'ban') {
476 $paiement->datepaye = $now;
477 $paiement->date = $now;
478 if ($currencyCodeType ==
$conf->currency) {
479 $paiement->amounts = [$invoice_id => $payment_amount];
481 $paiement->multicurrency_amounts = [$invoice_id => $payment_amount];
483 $postactionmessages[] =
'Payment was done in a currency ('.$currencyCodeType.
') other than the expected currency of company ('.
$conf->currency.
')';
484 $ispostactionok = -1;
490 $paiement->paiementcode = $paymentTypeCode;
491 $sql =
"SELECT id FROM ".MAIN_DB_PREFIX.
"c_paiement";
492 $sql .=
" WHERE code = '".$db->escape($paymentTypeCode).
"'";
493 $sql .=
" AND entity IN (".getEntity(
'c_paiement').
")";
494 $resql = $db->query($sql);
496 $obj = $db->fetch_object($resql);
497 $paiement->paiementid = $obj->id;
502 $paiement->num_payment =
'';
503 $paiement->note_public =
'';
504 $paiement->note_private =
'Stripe Sepa payment received by IPN service listening webhooks - ' .
dol_print_date($now,
'standard') .
' (TZ server) using servicestatus=' . $servicestatus . ($ipaddress ?
' from ip ' . $ipaddress :
'') .
' - Transaction ID = ' . $TRANSACTIONID;
505 $paiement->ext_payment_id = $TRANSACTIONID.
':'.$customer_id.
'@'.$stripearrayofkeysbyenv[$servicestatus][
'publishable_key'];
506 $paiement->ext_payment_site = $service;
509 $sql =
"SELECT p.rowid FROM ".MAIN_DB_PREFIX.
"paiement as p";
510 $sql .=
" WHERE p.ext_payment_id = '".$db->escape($paiement->ext_payment_id).
"'";
511 $sql .=
" AND p.ext_payment_site = '".$db->escape($paiement->ext_payment_site).
"'";
512 $result = $db->query($sql);
514 if ($db->num_rows($result)) {
516 dol_syslog(
'* Payment for ext_payment_id '.$paiement->ext_payment_id.
' already done. We do not recreate the payment');
517 dol_syslog(
'* Payment for ext_payment_id '.$paiement->ext_payment_id.
' already done. We do not recreate the payment', LOG_DEBUG, 0,
'_payment');
523 if (!$error && !$ispaymentdone) {
524 dol_syslog(
'* Record payment type PRE for invoice id ' . $invoice_id .
'. It includes closing of invoice and regenerating document.');
525 dol_syslog(
'* Record payment type PRE for invoice id ' . $invoice_id .
'. It includes closing of invoice and regenerating document.', LOG_DEBUG, 0,
'_payment');
528 $paiement_id = $paiement->create($user, 1);
529 if ($paiement_id < 0) {
530 $postactionmessages[] = $paiement->error . ($paiement->error ?
' ' :
'') . implode(
"<br>\n", $paiement->errors);
531 $ispostactionok = -1;
534 dol_syslog(
"Failed to create the payment for invoice id " . $invoice_id);
535 dol_syslog(
"Failed to create the payment for invoice id " . $invoice_id, LOG_DEBUG, 0,
'_payment');
537 $postactionmessages[] =
'Payment created';
539 dol_syslog(
"The payment has been created for invoice id " . $invoice_id);
540 dol_syslog(
"The payment has been created for invoice id " . $invoice_id, LOG_DEBUG, 0,
'_payment');
544 if (!$error && isModEnabled(
'bank')) {
547 $sql =
"SELECT p.rowid, p.fk_bank FROM ".MAIN_DB_PREFIX.
"paiement as p";
548 $sql .=
" WHERE p.ext_payment_id = '".$db->escape($paiement->ext_payment_id).
"'";
549 $sql .=
" AND p.ext_payment_site = '".$db->escape($paiement->ext_payment_site).
"'";
550 $sql .=
" AND p.fk_bank <> 0";
551 $result = $db->query($sql);
553 if ($db->num_rows($result)) {
555 $obj = $db->fetch_object($result);
556 dol_syslog(
'* Payment already linked to bank record '.$obj->fk_bank.
' . We do not recreate the link');
557 dol_syslog(
'* Payment already linked to bank record '.$obj->fk_bank.
' . We do not recreate the link', LOG_DEBUG, 0,
'_payment');
560 if (!$ispaymentdone) {
562 dol_syslog(
'* Add payment to bank', LOG_DEBUG, 0,
'_payment');
565 $paymentmethod =
'stripe';
568 if ($bankaccountid > 0) {
569 $label =
'(CustomerInvoicePayment)';
570 $result = $paiement->addPaymentToBank($user,
'payment', $label, $bankaccountid, $customer_id,
'');
572 $postactionmessages[] = $paiement->error . ($paiement->error ?
' ' :
'') . implode(
"<br>\n", $paiement->errors);
573 $ispostactionok = -1;
576 $postactionmessages[] =
'Bank transaction of payment created (by ipn.php file)';
579 $postactionmessages[] =
'Setup of bank account to use in module ' . $paymentmethod .
' was not set. No way to record the payment.';
580 $ispostactionok = -1;
586 if (!$error && isModEnabled(
'prelevement')) {
589 $sql =
"SELECT dp.fk_prelevement_bons as idbon";
590 $sql .=
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as dp";
591 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"prelevement_bons as pb";
592 $sql .=
" ON pb.rowid = dp.fk_prelevement_bons";
593 $sql .=
" WHERE dp.fk_facture = ".((int) $invoice_id);
594 $sql .=
" AND dp.sourcetype = 'facture'";
595 $sql .=
" AND dp.ext_payment_id = '".$db->escape($TRANSACTIONID).
"'";
596 $sql .=
" AND dp.traite = 1";
597 $sql .=
" AND statut = ".((int) $bon::STATUS_TRANSFERED);
598 $result = $db->query($sql);
600 if ($db->num_rows($result)) {
601 $obj = $db->fetch_object($result);
602 $idbon = $obj->idbon;
603 dol_syslog(
'* Prelevement must be set to credited');
604 dol_syslog(
'* Prelevement must be set to credited', LOG_DEBUG, 0,
'_payment');
606 dol_syslog(
'* Prelevement not found or already credited');
607 dol_syslog(
'* Prelevement not found or already credited', LOG_DEBUG, 0,
'_payment');
610 $postactionmessages[] = $db->lasterror();
611 $ispostactionok = -1;
615 if (!$error && !empty($idbon)) {
616 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"prelevement_bons";
617 $sql .=
" SET fk_user_credit = ".((int) $user->id);
618 $sql .=
", statut = ".((int) $bon::STATUS_CREDITED);
619 $sql .=
", date_credit = '".$db->idate($now).
"'";
620 $sql .=
", credite = 1";
621 $sql .=
" WHERE rowid = ".((int) $idbon);
622 $sql .=
" AND statut = ".((int) $bon::STATUS_TRANSFERED);
624 $result = $db->query($sql);
626 $postactionmessages[] = $db->lasterror();
627 $ispostactionok = -1;
632 if (!$error && !empty($idbon)) {
633 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"prelevement_lignes";
634 $sql .=
" SET statut = 2";
635 $sql .=
" WHERE fk_prelevement_bons = ".((int) $idbon);
636 $result = $db->query($sql);
638 $postactionmessages[] = $db->lasterror();
639 $ispostactionok = -1;
647 http_response_code(200);
651 http_response_code(500);
655 dol_syslog(
"The payment mode of this payment is ".$paymentTypeCode.
" in Stripe and ".$paymentTypeCodeInDolibarr.
" in Dolibarr. This case is not managed by the IPN");
656 dol_syslog(
"The payment mode of this payment is ".$paymentTypeCode.
" in Stripe and ".$paymentTypeCodeInDolibarr.
" in Dolibarr. This case is not managed by the IPN", LOG_DEBUG, 0,
'_payment');
659 dol_syslog(
"Nothing to do in database because we don't know paymentTypeIdInDolibarr");
660 dol_syslog(
"Nothing to do in database because we don't know paymentTypeIdInDolibarr", LOG_DEBUG, 0,
'_payment');
662} elseif ($event->type ==
'payment_intent.payment_failed') {
664 dol_syslog(
"A try to make a payment has failed");
665 dol_syslog(
"A try to make a payment has failed", LOG_DEBUG, 0,
'_payment');
667 $object = $event->data->object;
668 $ipaddress =
$object->metadata->ipaddress;
669 $currencyCodeType = strtoupper(
$object->currency);
670 $paymentmethodstripeid =
$object->payment_method;
671 $customer_id =
$object->customer;
673 $chargesdataarray = array();
679 $objpaymentmodetype =
'';
680 if (!empty(
$object->charges)) {
681 $chargesdataarray =
$object->charges->data;
682 foreach ($chargesdataarray as $chargesdata) {
683 $objpayid = $chargesdata->id;
684 $objpaydesc = $chargesdata->description;
686 if ($chargesdata->metadata->dol_type ==
'facture') {
687 $objinvoiceid = $chargesdata->metadata->dol_id;
689 $objerrcode = $chargesdata->outcome->reason;
690 $objerrmessage = $chargesdata->outcome->seller_message;
692 $objpaymentmodetype = $chargesdata->payment_method_details->type;
696 if (!empty(
$object->last_payment_error)) {
698 $objpayid =
$object->latest_charge;
699 $objpaydesc =
$object->description;
701 if (
$object->metadata->dol_type ==
'facture') {
702 $objinvoiceid =
$object->metadata->dol_id;
704 $objerrcode = empty(
$object->last_payment_error->code) ?
$object->last_payment_error->decline_code :
$object->last_payment_error->code;
705 $objerrmessage =
$object->last_payment_error->message;
707 $objpaymentmodetype =
$object->last_payment_error->payment_method->type;
710 dol_syslog(
"objpayid=".$objpayid.
" objpaymentmodetype=".$objpaymentmodetype.
" objerrcode=".$objerrcode);
711 dol_syslog(
"objpayid=".$objpayid.
" objpaymentmodetype=".$objpaymentmodetype.
" objerrcode=".$objerrcode, LOG_DEBUG, 0,
'_payment');
714 if ($objpaymentmodetype ==
'sepa_debit') {
717 require_once DOL_DOCUMENT_ROOT.
'/comm/action/class/actioncomm.class.php';
720 if ($objinvoiceid > 0) {
721 require_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
723 $invoice->fetch($objinvoiceid);
725 $actioncomm->userownerid = 0;
726 $actioncomm->percentage = -1;
728 $actioncomm->type_code =
'AC_OTH_AUTO';
729 $actioncomm->code =
'AC_PAYMENT_STRIPE_IPN_SEPA_KO';
731 $actioncomm->datep = $now;
732 $actioncomm->datef = $now;
734 $actioncomm->socid = $invoice->socid;
735 $actioncomm->fk_project = $invoice->fk_project;
736 $actioncomm->elementid = $invoice->id;
737 $actioncomm->elementtype =
'invoice';
741 $actioncomm->note_private =
'Error returned on payment id '.$objpayid.
' after SEPA payment request '.$objpaydesc.
'<br>Error code is: '.$objerrcode.
'<br>Error message is: '.$objerrmessage;
742 $actioncomm->label =
'Payment error (SEPA Stripe)';
744 $result = $actioncomm->create($user);
747 dol_syslog($actioncomm->error, LOG_ERR, 0,
'_payment');
755 http_response_code(500);
759} elseif ($event->type ==
'checkout.session.completed') {
761} elseif ($event->type ==
'payment_method.attached') {
762 dol_syslog(
"object = ".var_export($event->data,
true));
763 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
766 require_once DOL_DOCUMENT_ROOT.
'/societe/class/companypaymentmode.class.php';
767 require_once DOL_DOCUMENT_ROOT.
'/societe/class/societeaccount.class.php';
772 $idthirdparty = $societeaccount->getThirdPartyID($db->escape($event->data->object->customer),
'stripe', $servicestatus);
773 if ($idthirdparty > 0) {
776 $companypaymentmode->stripe_card_ref = $event->data->object->id;
777 $companypaymentmode->fk_soc = $idthirdparty;
778 $companypaymentmode->bank =
null;
779 $companypaymentmode->label =
'';
780 $companypaymentmode->number = $event->data->object->id;
781 $companypaymentmode->last_four = $event->data->object->card->last4;
782 $companypaymentmode->card_type = $event->data->object->card->branding;
784 $companypaymentmode->owner_name = $event->data->object->billing_details->name;
785 $companypaymentmode->proprio = $companypaymentmode->owner_name;
787 $companypaymentmode->exp_date_month = (int) $event->data->object->card->exp_month;
788 $companypaymentmode->exp_date_year = (int) $event->data->object->card->exp_year;
789 $companypaymentmode->cvn =
null;
790 $companypaymentmode->datec = $event->data->object->created;
791 $companypaymentmode->default_rib = 0;
792 $companypaymentmode->type = $event->data->object->type;
793 $companypaymentmode->country_code = $event->data->object->card->country;
794 $companypaymentmode->status = $servicestatus;
800 $result = $companypaymentmode->create($user);
808 http_response_code(500);
813} elseif ($event->type ==
'payment_method.updated') {
814 dol_syslog(
"object = ".var_export($event->data,
true));
815 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
818 require_once DOL_DOCUMENT_ROOT.
'/societe/class/companypaymentmode.class.php';
820 $companypaymentmode->fetch(0,
'', 0,
'',
" AND stripe_card_ref = '".$db->escape($event->data->object->id).
"'");
821 if ($companypaymentmode->id > 0) {
823 $companypaymentmode->bank =
null;
824 $companypaymentmode->label =
'';
825 $companypaymentmode->number = $db->escape($event->data->object->id);
826 $companypaymentmode->last_four = $db->escape($event->data->object->card->last4);
827 $companypaymentmode->proprio = $db->escape($event->data->object->billing_details->name);
828 $companypaymentmode->owner_name = $db->escape($event->data->object->billing_details->name);
829 $companypaymentmode->exp_date_month = (int) $event->data->object->card->exp_month;
830 $companypaymentmode->exp_date_year = (int) $event->data->object->card->exp_year;
831 $companypaymentmode->cvn =
null;
832 $companypaymentmode->datec = (int) $event->data->object->created;
833 $companypaymentmode->default_rib = 0;
834 $companypaymentmode->type = $db->escape($event->data->object->type);
835 $companypaymentmode->country_code = $db->escape($event->data->object->card->country);
836 $companypaymentmode->status = $servicestatus;
840 $result = $companypaymentmode->update($user);
851} elseif ($event->type ==
'payment_method.detached') {
854 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"societe_rib WHERE number = '".$db->escape($event->data->object->id).
"' and status = ".((int) $servicestatus);
857} elseif ($event->type ==
'charge.succeeded') {
859} elseif ($event->type ==
'charge.failed') {
861} elseif (($event->type ==
'source.chargeable') && ($event->data->object->type ==
'three_d_secure') && ($event->data->object->three_d_secure->authenticated ==
true)) {
863} elseif ($event->type ==
'charge.dispute.closed') {
865 dol_syslog(
"object = ".var_export($event->data,
true));
866 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
867} elseif ($event->type ==
'charge.dispute.funds_withdrawn') {
869 dol_syslog(
"object = ".var_export($event->data,
true));
870 dol_syslog(
"object = ".var_export($event->data,
true), LOG_DEBUG, 0,
'_payment');
872 global $stripearrayofkeysbyenv;
875 $object = $event->data->object;
876 $TRANSACTIONID =
$object->payment_intent;
877 $ipaddress =
$object->metadata->ipaddress;
879 $currencyCodeType = strtoupper(
$object->currency);
880 $paymentmethodstripeid =
$object->payment_method;
881 $customer_id =
$object->customer;
883 $amountdisputestripe =
$object->amoutndispute;
884 $amountdispute = $amountdisputestripe;
887 $paymentTypeCode =
"";
888 $paymentTypeCodeInDolibarr =
"";
890 $payment_amountInDolibarr = 0;
892 dol_syslog(
"Try to find the payment in database for the payment_intent id = ".$TRANSACTIONID);
893 dol_syslog(
"Try to find the payment in database for the payment_intent id = ".$TRANSACTIONID, LOG_DEBUG, 0,
'_payment');
895 $sql =
"SELECT pi.rowid, pi.fk_facture, pi.fk_prelevement_bons, pi.amount, pi.type, pi.traite";
896 $sql .=
" FROM ".MAIN_DB_PREFIX.
"prelevement_demande as pi";
897 $sql .=
" WHERE pi.ext_payment_id = '".$db->escape($TRANSACTIONID).
"'";
898 $sql .=
" AND pi.ext_payment_site = '".$db->escape($service).
"'";
900 $result = $db->query($sql);
902 $obj = $db->fetch_object($result);
904 if ($obj->type ==
'ban') {
907 $invoice_id = $obj->fk_facture;
908 $directdebitorcreditransfer_id = $obj->fk_prelevement_bons;
909 $payment_amountInDolibarr = $obj->amount;
910 $paymentTypeCodeInDolibarr = $obj->type;
912 dol_syslog(
"Found the payment intent for ban in database (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
")");
913 dol_syslog(
"Found the payment intent for ban in database (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
")", LOG_DEBUG, 0,
'_payment');
915 if ($obj->type ==
'card' || empty($obj->type)) {
918 $invoice_id = $obj->fk_facture;
919 $directdebitorcreditransfer_id = 0;
920 $payment_amountInDolibarr = $obj->amount;
921 $paymentTypeCodeInDolibarr = empty($obj->type) ?
'card' : $obj->type;
923 dol_syslog(
"Found the payment intent for card in database (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
")");
924 dol_syslog(
"Found the payment intent for card in database (pdid = ".$pdid.
" directdebitorcreditransfer_id=".$directdebitorcreditransfer_id.
")", LOG_DEBUG, 0,
'_payment');
927 dol_syslog(
"Payment intent ".$TRANSACTIONID.
" not found into database, so ignored.");
928 dol_syslog(
"Payment intent ".$TRANSACTIONID.
" not found into database, so ignored.", LOG_DEBUG, 0,
'_payment');
929 http_response_code(200);
930 print
"Payment intent ".$TRANSACTIONID.
" not found into database, so ignored.";
934 http_response_code(500);
935 print $db->lasterror();
940 dol_syslog(
"objinvoiceid=".$invoice_id, LOG_DEBUG, 0,
'_payment');
941 $tmpinvoice =
new Facture($db);
942 $tmpinvoice->fetch($invoice_id);
943 $tmpinvoice->fetch_thirdparty();
945 dol_syslog(
"The payment disputed is ".$amountdispute.
" and the invoice is ".$payment_amountInDolibarr);
946 dol_syslog(
"The payment disputed is ".$amountdispute.
" and the invoice is ".$payment_amountInDolibarr, LOG_DEBUG, 0,
'_payment');
948 if ($amountdispute != $payment_amountInDolibarr) {
949 http_response_code(500);
950 print
"The payment disputed is ".$amountdispute.
" and the invoice is ".$payment_amountInDolibarr.
". Amount differs, we don't know what to do.";
954 $accountfrom =
new Account($db);
955 $accountfrom->fetch(
getDolGlobalInt(
'STRIPE_BANK_ACCOUNT_FOR_PAYMENTS'));
961 $amounts[$tmpinvoice->id] = -1 * $payment_amountInDolibarr;
963 $paiement->datepaye =
dol_now();
964 $paiement->amounts = $amounts;
969 $paiement->paiementid =
dol_getIdFromCode($db,
'PRE',
'c_paiement',
'code',
'id', 1);
970 $paiement->num_payment =
$object->id;
971 $paiement->note_public =
'Fund withdrawn by bank. Reason: '.$reason;
972 $paiement->note_private =
'';
973 $paiement->fk_account = $accountfrom->id;
977 $alreadytransferedinaccounting = $tmpinvoice->getVentilExportCompta();
979 if ($alreadytransferedinaccounting) {
982 $errormsg =
'Error: the invoice '.$tmpinvoice->id.
' is already transferred into accounting. Don\'t know what to do.';
990 $errormsg = $tmpinvoice->error.implode(
', ', $tmpinvoice->errors);
996 $paiement_id = $paiement->create($user, 0, $tmpinvoice->thirdparty);
997 if ($paiement_id < 0) {
998 $errormsg = $paiement->error.implode(
', ', $paiement->errors);
1006 http_response_code(500);
1010 http_response_code(500);
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
Class to manage bank accounts.
Class to manage agenda events (actions)
Class to manage withdrawal receipts.
Class to send emails (with attachments or not) Usage: $mailfile = new CMailFile($subject,...
Class for CompanyPaymentMode.
Class to manage invoices.
const STATUS_VALIDATED
Validated (need to be paid)
const STATUS_CLOSED
Classified paid.
Class to manage payments of customer invoices.
Class for SocieteAccount.
Stripe class @TODO No reason to extend CommonObject.
Class to manage Dolibarr users.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolChmod($filepath, $newmask='')
Change mod of a file.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dolGetFirstLastname($firstname, $lastname, $nameorder=-1)
Return firstname and lastname in correct order.
getUserRemoteIP($trusted=0)
Return the real IP of remote user.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
if(!defined( 'NOREQUIREMENU')) if(!empty(GETPOST('seteventmessages', 'alpha'))) if(!function_exists("llxHeader")) top_httphead($contenttype='text/html', $forcenocache=0)
Show HTTP header.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
httponly_accessforbidden($message='1', $http_response_code=403, $stringalreadysanitized=0)
Show a message to say access is forbidden and stop program.