diff --git a/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php b/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php index a41ade1e01b..495f439eb09 100644 --- a/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php +++ b/htdocs/core/triggers/interface_80_modStripe_Stripe.class.php @@ -135,7 +135,7 @@ class InterfaceStripe if ($action == 'COMPANY_MODIFY') { dol_syslog("Trigger '" . $this->name . "' for action '$action' launched by " . __FILE__ . ". id=" . $object->id); if ($stripe->getStripeAccount($service) && $object->client != 0) { - $cu = $stripe->customerStripe($object->id, $stripe->getStripeAccount($service)); + $cu = $stripe->customerStripe($object, $stripe->getStripeAccount($service)); if ($cu) { if ($conf->entity == '1') { $customer = \Stripe\Customer::retrieve("$cu->id"); @@ -153,7 +153,7 @@ class InterfaceStripe } } elseif ($action == 'COMPANY_DELETE') { dol_syslog("Trigger '" . $this->name . "' for action '$action' launched by " . __FILE__ . ". id=" . $object->id); - $cu = $stripe->customerStripe($object->id, $stripe->getStripeAccount($service)); + $cu = $stripe->customerStripe($object, $stripe->getStripeAccount($service)); if ($cu) { if ($conf->entity == 1) { $customer = \Stripe\Customer::retrieve("$cu->id"); diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang index 3db64381797..f096248bc39 100644 --- a/htdocs/langs/en_US/stripe.lang +++ b/htdocs/langs/en_US/stripe.lang @@ -59,3 +59,4 @@ ExpiryDate=Expiry Date CVN=CVN DeleteACard=Delete Card record ConfirmDeleteCard=Are you sure you want to delete this Card record? +CreateCustomerOnStripe=Create customer on Stripe diff --git a/htdocs/societe/class/societeaccount.class.php b/htdocs/societe/class/societeaccount.class.php index 08b3617e540..111da0c46ea 100644 --- a/htdocs/societe/class/societeaccount.class.php +++ b/htdocs/societe/class/societeaccount.class.php @@ -263,8 +263,10 @@ class SocieteAccount extends CommonObject $sql.= " WHERE sa.fk_soc = " . $id; $sql.= " AND sa.entity IN (".getEntity('societe').")"; $sql.= " AND sa.site = '".$this->db->escape($site)."' AND sa.status = ".((int) $status); + $sql.= " AND key_account IS NOT NULL AND key_account <> ''"; + //$sql.= " ORDER BY sa.key_account DESC"; - dol_syslog(get_class($this) . "::getCustomerAccount Try to find the system customer id of thirdparty id=".$id." (exemple: cu_.... for stripe)", LOG_DEBUG); + dol_syslog(get_class($this) . "::getCustomerAccount Try to find the system customer id of thirdparty id=".$id." (exemple: cus_.... for stripe)", LOG_DEBUG); $result = $this->db->query($sql); if ($result) { if ($this->db->num_rows($result)) { diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 9365511b78d..28eaa1abacc 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -41,6 +41,7 @@ require_once DOL_DOCUMENT_ROOT.'/stripe/class/stripe.class.php'; $langs->loadLangs(array("companies","commercial","banks","bills")); + // Security check $socid = GETPOST("socid","int"); if ($user->societe_id) $socid=$user->societe_id; @@ -82,8 +83,8 @@ if (! empty($conf->stripe->enabled)) } $stripe = new Stripe($db); - $stripeacc = $stripe->getStripeAccount($service); // Stripe OAuth connect account of dolibarr user (no network access here) - $stripecu = $stripe->getStripeCustomerAccount($object->id, $servicestatus); // Get thirdparty cu_... + $stripeacc = $stripe->getStripeAccount($service); // Get Stripe OAuth connect account (no network access here) + $stripecu = $stripe->getStripeCustomerAccount($object->id, $servicestatus); // Get remote Stripe customer 'cus_...' (no network access here) } @@ -474,6 +475,7 @@ if (empty($reshook)) $_POST['lang_id'] = GETPOST('lang_idrib'.GETPOST('companybankid')); $_POST['model'] = GETPOST('modelrib'.GETPOST('companybankid')); } + $id = $socid; $upload_dir = $conf->societe->multidir_output[$object->entity]; $permissioncreate=$user->rights->societe->creer; @@ -484,6 +486,29 @@ if (empty($reshook)) // Action for stripe if (! empty($conf->stripe->enabled) && class_exists('Stripe')) { + if ($action == 'synccustomertostripe') + { + if ($object->client == 0) + { + $error++; + setEventMessages('ThisThirdpartyIsNotACustomer', null, 'errors'); + } + else + { + // Creation of Stripe customer + update of societe_account + $cu = $stripe->customerStripe($object, $stripeacc, $servicestatus, 1); + if (! $cu) + { + $error++; + setEventMessages($stripe->error, $stripe->errors, 'errors'); + } + else + { + $stripecu = $cu->id; + } + } + } + if ($action == 'setkey_account') { $error = 0; @@ -655,7 +680,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' if ($object->client) { print ''; - print $langs->trans('CustomerCode').''; + print $langs->trans('CustomerCode').''; print $object->code_client; if ($object->check_codeclient() <> 0) print ' ('.$langs->trans("WrongCustomerCode").')'; print ''; @@ -682,6 +707,17 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' print ''; //print $stripecu; print $form->editfieldval("StripeCustomerId", 'key_account', $stripecu, $object, $permissiontowrite, 'string', '', null, null, '', 1, '', 'socid'); + print ''; + if (empty($stripecu)) + { + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'; + } print ''; } @@ -698,20 +734,20 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' { $morehtmlright=''.$langs->trans("Add").''; } - print load_fiche_titre($langs->trans('StripePaymentModes').($stripeacc?' ('.$stripeacc.')':''), $morehtmlright, ''); + print load_fiche_titre($langs->trans('StripePaymentModes').($stripeacc?' ('.$stripeacc.')':' (API mode)'), $morehtmlright, ''); $listofsources = array(); - if (is_object($stripe) && $stripeacc) + if (is_object($stripe)) { try { - $customerstripe=$stripe->customerStripe($object->id, $stripeacc, $servicestatus); + $customerstripe=$stripe->customerStripe($object, $stripeacc, $servicestatus); if ($customerstripe->id) { $listofsources=$customerstripe->sources->data; } } catch(Exception $e) { - dol_syslog("Failed to get strip customer for thirdparty id =".$object->id); + dol_syslog("Error when searching/loading Stripe customer for thirdparty id =".$object->id); } } @@ -816,10 +852,6 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' $i++; } } - else - { - print $langs->trans("NoPaymentMethodOnFile"); - } } else dol_print_error($db); } diff --git a/htdocs/stripe/class/actions_stripe.class.php b/htdocs/stripe/class/actions_stripe.class.php index baeba001edf..0451c1d4782 100644 --- a/htdocs/stripe/class/actions_stripe.class.php +++ b/htdocs/stripe/class/actions_stripe.class.php @@ -99,7 +99,7 @@ class ActionsStripeconnect $this->resprints.= ''; $stripe=new Stripe($db); if ($stripe->getStripeAccount($service)&&$object->client!=0) { - $customer=$stripe->customerStripe($object->id,$stripe->getStripeAccount($service)); + $customer=$stripe->customerStripe($object,$stripe->getStripeAccount($service)); $this->resprints.= $customer->id; } else { @@ -117,8 +117,9 @@ class ActionsStripeconnect $this->resprints.= ''; $this->resprints.= ''; $stripe=new Stripe($db); - if ($stripe->getStripeAccount($service)&&$object->fk_soc>'0') { - $customer=$stripe->customerStripe($object->fk_soc,$stripe->getStripeAccount($service)); + if ($stripe->getStripeAccount($service) && $object->fk_soc > 0) { + $object->fetch_thirdparty(); + $customer=$stripe->customerStripe($object->thirdparty, $stripe->getStripeAccount($service)); $this->resprints.= $customer->id; } else { @@ -135,7 +136,8 @@ class ActionsStripeconnect $this->resprints.= ''; $stripe=new Stripe($db); if (7==4) { - $customer=$stripe->customerStripe($object->id,$stripe->getStripeAccount($service)); + $object->fetch_thirdparty(); + $customer=$stripe->customerStripe($object,$stripe->getStripeAccount($service)); $this->resprints.= $customer->id; } else { @@ -154,7 +156,8 @@ class ActionsStripeconnect $this->resprints.= ''; $stripe=new Stripe($db); if (7==4) { - $customer=$stripe->customerStripe($object->id,$stripe->getStripeAccount($service)); + $object->fetch_thirdparty(); + $customer=$stripe->customerStripe($object,$stripe->getStripeAccount($service)); $this->resprints.= $customer->id; } else { diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index 5f86c45f696..cf02ec6b65b 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -20,7 +20,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; -require_once DOL_DOCUMENT_ROOT.'/stripe/config.php'; +require_once DOL_DOCUMENT_ROOT.'/stripe/config.php'; // This set stripe global env /** @@ -86,6 +86,7 @@ class Stripe extends CommonObject dol_print_error($this->db); } + dol_syslog("No dedicated Stipe Connect account available for entity".$conf->entity); return $key; } @@ -102,30 +103,33 @@ class Stripe extends CommonObject include_once DOL_DOCUMENT_ROOT.'/societe/class/societeaccount.class.php'; $societeaccount = new SocieteAccount($this->db); - return $societeaccount->getCustomerAccount($id, 'stripe', $status); // Get thirdparty cu_... + return $societeaccount->getCustomerAccount($id, 'stripe', $status); // Get thirdparty cus_... } /** * Get the Stripe customer of a thirdparty (with option to create it if not linked yet) * - * @param int $id Id of third party - * @param string $key Stripe account acc_.... + * @param Societe $object Object thirdparty to check, or create on stripe (create on strip also update the stripe_account table for current entity) + * @param string $key ''=Use common API. If not '', it is the Stripe connect account 'acc_....' to use Stripe connect * @param int $status Status (0=test, 1=live) * @param int $createifnotlinkedtostripe 1=Create the stripe customer and the link if the thirdparty is not yet linked to a stripe customer - * @return \Stripe\StripeObject|\Stripe\ApiResource|null Stripe Customer or null if not found + * @return \Stripe\StripeCustomer|null Stripe Customer or null if not found */ - public function customerStripe($id, $key, $status=0, $createifnotlinkedtostripe=0) + public function customerStripe($object, $key='', $status=0, $createifnotlinkedtostripe=0) { - global $conf; + global $conf, $user; - $sql = "SELECT sa.key_account as key_account, sa.entity"; // key_account is cu_.... + $customer = null; + + $sql = "SELECT sa.key_account as key_account, sa.entity"; // key_account is cus_.... $sql.= " FROM " . MAIN_DB_PREFIX . "societe_account as sa"; - $sql.= " WHERE sa.fk_soc = " . $id; + $sql.= " WHERE sa.fk_soc = " . $object->id; $sql.= " AND sa.entity IN (".getEntity('societe').")"; $sql.= " AND sa.site = 'stripe' AND sa.status = ".((int) $status); + $sql.= " AND key_account IS NOT NULL AND key_account <> ''"; - dol_syslog(get_class($this) . "::fetch", LOG_DEBUG); + dol_syslog(get_class($this) . "::fetch search stripe customer id for thirdparty id=".$object->id, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { $num = $this->db->num_rows($resql); @@ -133,41 +137,52 @@ class Stripe extends CommonObject { $obj = $this->db->fetch_object($resql); $tiers = $obj->key_account; - if ($conf->entity == 1) { - $customer = \Stripe\Customer::retrieve("$tiers"); - } else { - $customer = \Stripe\Customer::retrieve("$tiers", array( - "stripe_account" => $key - )); + try { + if (empty($key)) { // If the Stripe connect account not set, we use common API usage + $customer = \Stripe\Customer::retrieve("$tiers"); + } else { + $customer = \Stripe\Customer::retrieve("$tiers", array("stripe_account" => $key)); + } + } + catch(Exception $e) + { + } } elseif ($createifnotlinkedtostripe) { - $soc = new Societe($this->db); - $soc->fetch($id); + $dataforcustomer = array( + "email" => $object->email, + "business_vat_id" => $object->tva_intra, + "description" => $object->name, + "metadata" => array('dol_id'=>$object->id, 'dol_version'=>DOL_VERSION, 'dol_entity'=>$conf->entity) + ); - if ($conf->entity == 1) { - $customer = \Stripe\Customer::create(array( - "email" => $soc->email, - "business_vat_id" => $soc->tva_intra, - "description" => $soc->name - )); - } else { - $customer = \Stripe\Customer::create(array( - "email" => $soc->email, - "business_vat_id" => $soc->tva_intra, - "description" => $soc->name - ), array( - "stripe_account" => $key - )); + //$a = \Stripe\Stripe::getApiKey(); + //var_dump($a);var_dump($key);exit; + try { + if (empty($key)) { // If the Stripe connect account not set, we use common API usage + $customer = \Stripe\Customer::create($dataforcustomer); + } else { + $customer = \Stripe\Customer::create($dataforcustomer, array("stripe_account" => $key)); + } + $customer_id = $customer->id; + + $sql = "INSERT INTO " . MAIN_DB_PREFIX . "societe_account (fk_soc, login, key_account, site, status, entity, date_creation, fk_user_creat)"; + $sql .= " VALUES (".$object->id.", '', '".$this->db->escape($customer_id)."', 'stripe', " . $status . ", " . $conf->entity . ", '".$this->db->idate(dol_now())."', ".$user->id.")"; + $resql = $this->db->query($sql); + if (! $resql) + { + $this->error = $this->db->lasterror(); + } + } + catch(Exception $e) + { + //print $e->getMessage(); } - $customer_id = $customer->id; - - $sql = "INSERT INTO " . MAIN_DB_PREFIX . "societe_account (fk_soc, key_account, site, status, entity)"; - $sql .= " VALUES (".$id.", '".$this->db->escape($customer_id)."', 'stripe', " . $status . "," . $conf->entity . ")"; - $resql = $this->db->query($sql); } } + return $customer; } @@ -178,8 +193,8 @@ class Stripe extends CommonObject * @param string $currency EUR, GPB... * @param string $origin order, invoice, contract... * @param int $item if of element to pay - * @param string $source src_xxxxx or card_xxxxx or ac_xxxxx - * @param string $customer Stripe account ref 'cu_xxxxxxxxxxxxx' via customerStripe() + * @param string $source src_xxxxx or card_xxxxx + * @param string $customer Stripe customer ref 'cus_xxxxxxxxxxxxx' via customerStripe() * @param string $account Stripe account ref 'acc_xxxxxxxxxxxxx' via getStripeAccount() * @param int $status Status (0=test, 1=live) * @return Stripe diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php index 31959b3516f..db982e878f9 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/stripe/config.php @@ -15,44 +15,38 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * Set Stripe environment: set the ApiKey and AppInfo */ /** -* \file htdocs/public/stripe/config.php +* \file htdocs/stripe/config.php * \ingroup Stripe * \brief Page to move config in api */ -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; +require_once DOL_DOCUMENT_ROOT.'/includes/stripe/lib/Stripe.php'; global $stripe; global $conf; -//use \includes\stripe as stripe; -$stripe = array(); +$stripearrayofkeys = array(); if (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox','alpha')) { - $stripe = array( + $stripearrayofkeys = array( "secret_key" => $conf->global->STRIPE_TEST_SECRET_KEY, "publishable_key" => $conf->global->STRIPE_TEST_PUBLISHABLE_KEY ); } else { - $stripe = array( + $stripearrayofkeys = array( "secret_key" => $conf->global->STRIPE_LIVE_SECRET_KEY, "publishable_key" => $conf->global->STRIPE_LIVE_PUBLISHABLE_KEY ); } -require_once DOL_DOCUMENT_ROOT."/includes/stripe/lib/Stripe.php"; -require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; - -\Stripe\Stripe::setApiKey($stripe['secret_key']); - -require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; - +\Stripe\Stripe::setApiKey($stripearrayofkeys['secret_key']); \Stripe\Stripe::setAppInfo("Stripe", DOL_VERSION, "https://www.dolibarr.org"); // add dolibarr version