From bf4a0e46aa3bdd56aee844c7646be6569d8b6a6c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Mar 2018 21:07:45 +0100 Subject: [PATCH] Add a credit card on stripe --- htdocs/langs/en_US/stripe.lang | 1 + htdocs/societe/paymentmodes.php | 53 ++++++++++++++- htdocs/stripe/class/stripe.class.php | 96 ++++++++++++++++++++++++++-- 3 files changed, 144 insertions(+), 6 deletions(-) diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang index f096248bc39..df42e31878a 100644 --- a/htdocs/langs/en_US/stripe.lang +++ b/htdocs/langs/en_US/stripe.lang @@ -60,3 +60,4 @@ CVN=CVN DeleteACard=Delete Card record ConfirmDeleteCard=Are you sure you want to delete this Card record? CreateCustomerOnStripe=Create customer on Stripe +CreateCardOnStripe=Create card on Stripe diff --git a/htdocs/societe/paymentmodes.php b/htdocs/societe/paymentmodes.php index 73a6b62c181..6fe4b0c64a0 100644 --- a/htdocs/societe/paymentmodes.php +++ b/htdocs/societe/paymentmodes.php @@ -508,6 +508,42 @@ if (empty($reshook)) } } } + if ($action == 'synccardtostripe') + { + $companypaymentmode = new CompanyPaymentMode($db); + $companypaymentmode->fetch($id); + + if ($companypaymentmode->type != 'card') + { + $error++; + setEventMessages('ThisPaymentModeIsNotACard', null, 'errors'); + } + else + { + // Get the Stripe customer + $cu = $stripe->customerStripe($object, $stripeacc, $servicestatus); + if (! $cu) + { + $error++; + setEventMessages($stripe->error, $stripe->errors, 'errors'); + } + + if (! $error) + { + // Creation of Stripe card + update of societe_account + $card = $stripe->cardStripe($cu, $companypaymentmode, $stripeacc, $servicestatus, 1); + if (! $card) + { + $error++; + setEventMessages($stripe->error, $stripe->errors, 'errors'); + } + else + { + $stripecard = $card->id; + } + } + } + } if ($action == 'setkey_account') { @@ -612,6 +648,16 @@ llxHeader(); $head=societe_prepare_head($object); +// Show sandbox warning +/*if (! empty($conf->paypal->enabled) && (! empty($conf->global->PAYPAL_API_SANDBOX) || GETPOST('forcesandbox','alpha'))) // We can force sand box with param 'forcesandbox' +{ + dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode','Paypal'),'','warning'); +}*/ +if (! empty($conf->stripe->enabled) && (empty($conf->global->STRIPE_LIVE) || GETPOST('forcesandbox','alpha'))) +{ + dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode','Stripe'),'','warning'); +} + // Load Bank account if (! $id) { @@ -810,7 +856,7 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' print ''; print ''; if ($companypaymentmodetemp->last_four) print '....'.$companypaymentmodetemp->last_four; - if ($companypaymentmodetemp->exp_date_month || $companypaymentmodetemp->exp_date_year) print ' - '.$companypaymentmodetemp->exp_date_month.'/'.$companypaymentmodetemp->exp_date_year.''; + if ($companypaymentmodetemp->exp_date_month || $companypaymentmodetemp->exp_date_year) print ' - '.sprintf("%02d", $companypaymentmodetemp->exp_date_month).'/'.$companypaymentmodetemp->exp_date_year.''; print ''; if ($companypaymentmodetemp->country_code) { @@ -838,6 +884,11 @@ if ($socid && $action != 'edit' && $action != 'create' && $action != 'editcard' print ''; if ($user->rights->societe->creer) { + if ($stripecu && empty($companypaymentmodetemp->stripe_card_ref)) + { + print ''.$langs->trans("CreateCardOnStripe").''; + } + print ''; print img_picto($langs->trans("Modify"),'edit'); print ''; diff --git a/htdocs/stripe/class/stripe.class.php b/htdocs/stripe/class/stripe.class.php index cf02ec6b65b..82aca6580ef 100644 --- a/htdocs/stripe/class/stripe.class.php +++ b/htdocs/stripe/class/stripe.class.php @@ -110,13 +110,13 @@ class Stripe extends CommonObject /** * Get the Stripe customer of a thirdparty (with option to create it if not linked yet) * - * @param Societe $object Object thirdparty to check, or create on stripe (create on strip also update the stripe_account table for current entity) + * @param Societe $object Object thirdparty to check, or create on stripe (create on stripe 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\StripeCustomer|null Stripe Customer or null if not found */ - public function customerStripe($object, $key='', $status=0, $createifnotlinkedtostripe=0) + public function customerStripe(Societe $object, $key='', $status=0, $createifnotlinkedtostripe=0) { global $conf, $user; @@ -166,10 +166,9 @@ class Stripe extends CommonObject } 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.")"; + $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) { @@ -178,14 +177,101 @@ class Stripe extends CommonObject } catch(Exception $e) { - //print $e->getMessage(); + $this->error = $e->getMessage(); } } } + else + { + dol_print_error($this->db); + } return $customer; } + /** + * Get the Stripe card of a company payment mode (with option to create it if not linked yet) + * + * @param \Stripe\StripeCustomer $cu Object stripe customer + * @param CompanyPaymentMode $object Object companypaymentmode to check, or create on stripe (create on stripe also update the societe_rib 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 card and the link if the card is not yet linked to a stripe card + * @return \Stripe\StripeCard|null Stripe Card or null if not found + */ + public function cardStripe($cu, CompanyPaymentMode $object, $key='', $status=0, $createifnotlinkedtostripe=0) + { + global $conf, $user; + + $customer = null; + + $sql = "SELECT sa.stripe_card_ref as stripe_card_ref"; // key_account is cus_.... + $sql.= " FROM " . MAIN_DB_PREFIX . "societe_rib as sa"; + $sql.= " WHERE sa.rowid = " . $object->id; + //$sql.= " AND sa.entity IN (".getEntity('societe').")"; + $sql.= " AND sa.type = 'card'"; + + dol_syslog(get_class($this) . "::fetch search stripe card id for paymentmode id=".$object->id, LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + if ($num) + { + $obj = $this->db->fetch_object($resql); + $cardref = $obj->stripe_card_ref; + if ($cardref) + { + try { + if (empty($key)) { // If the Stripe connect account not set, we use common API usage + $card = \Stripe\Card::retrieve("$cardref"); + } else { + $card = \Stripe\Card::retrieve("$cardref", array("stripe_account" => $key)); + } + } + catch(Exception $e) + { + + } + } + elseif ($createifnotlinkedtostripe) + { + $dataforcard = array( + "source" => 'eee', + "metadata" => array('dol_id'=>$object->id, 'dol_version'=>DOL_VERSION, 'dol_entity'=>$conf->entity) + ); + + //$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 + $card = $cu->sources->create($dataforcard); + } else { + $card = $cu->sources->create($dataforcard, array("stripe_account" => $key)); + } + + $sql = "UPDATE INTO " . MAIN_DB_PREFIX . "societe_rib (fk_soc, login, key_account, site, status, entity, date_creation, fk_user_creat)"; + $sql .= " VALUES (".$object->id.", '', '".$this->db->escape($card->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) + { + $this->error = $e->getMessage(); + } + } + } + } + else + { + dol_print_error($this->db); + } + + return $card; + } + /** * Create charge with public/payment/newpayment.php, stripe/card.php, cronjobs or REST API *