dolibarr  20.0.0-alpha
stripe.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2017 Alexandre Spangaro <aspangaro@open-dsi.fr>
3  * Copyright (C) 2017 Olivier Geffroy <jeff@jeffinfo.com>
4  * Copyright (C) 2017 Saasprov <saasprov@gmail.com>
5  * Copyright (C) 2018-2022 Thibault FOUCART <support@ptibogxiv.net>
6  * Copyright (C) 2018 Frédéric France <frederic.france@netlogic.fr>
7  * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <https://www.gnu.org/licenses/>.
21  */
22 
29 // Load Dolibarr environment
30 require '../../main.inc.php';
31 require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php';
32 require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
33 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
34 require_once DOL_DOCUMENT_ROOT.'/product/class/html.formproduct.class.php';
35 require_once DOL_DOCUMENT_ROOT.'/stripe/class/stripe.class.php';
36 
37 $servicename = 'Stripe';
38 
39 // Load translation files required by the page
40 $langs->loadLangs(array('admin', 'other', 'paypal', 'paybox', 'stripe'));
41 
42 if (empty($user->admin)) {
44 }
45 if (empty($conf->stripe->enabled)) {
47 }
48 
49 $action = GETPOST('action', 'aZ09');
50 
51 
52 /*
53  * Actions
54  */
55 
56 if ($action == 'setvalue' && $user->admin) {
57  $db->begin();
58 
59  if (empty($conf->stripeconnect->enabled)) {
60  $result = dolibarr_set_const($db, "STRIPE_TEST_PUBLISHABLE_KEY", GETPOST('STRIPE_TEST_PUBLISHABLE_KEY', 'alpha'), 'chaine', 0, '', $conf->entity);
61  if (!($result > 0)) {
62  $error++;
63  }
64  $result = dolibarr_set_const($db, "STRIPE_TEST_SECRET_KEY", GETPOST('STRIPE_TEST_SECRET_KEY', 'alpha'), 'chaine', 0, '', $conf->entity);
65  if (!($result > 0)) {
66  $error++;
67  }
68  $result = dolibarr_set_const($db, "STRIPE_TEST_WEBHOOK_ID", GETPOST('STRIPE_TEST_WEBHOOK_ID', 'alpha'), 'chaine', 0, '', $conf->entity);
69  if (!($result > 0)) {
70  $error++;
71  }
72  $result = dolibarr_set_const($db, "STRIPE_TEST_WEBHOOK_KEY", GETPOST('STRIPE_TEST_WEBHOOK_KEY', 'alpha'), 'chaine', 0, '', $conf->entity);
73  if (!($result > 0)) {
74  $error++;
75  }
76  $result = dolibarr_set_const($db, "STRIPE_LIVE_PUBLISHABLE_KEY", GETPOST('STRIPE_LIVE_PUBLISHABLE_KEY', 'alpha'), 'chaine', 0, '', $conf->entity);
77  if (!($result > 0)) {
78  $error++;
79  }
80  $result = dolibarr_set_const($db, "STRIPE_LIVE_SECRET_KEY", GETPOST('STRIPE_LIVE_SECRET_KEY', 'alpha'), 'chaine', 0, '', $conf->entity);
81  if (!($result > 0)) {
82  $error++;
83  }
84  $result = dolibarr_set_const($db, "STRIPE_LIVE_WEBHOOK_ID", GETPOST('STRIPE_LIVE_WEBHOOK_ID', 'alpha'), 'chaine', 0, '', $conf->entity);
85  if (!($result > 0)) {
86  $error++;
87  }
88  $result = dolibarr_set_const($db, "STRIPE_LIVE_WEBHOOK_KEY", GETPOST('STRIPE_LIVE_WEBHOOK_KEY', 'alpha'), 'chaine', 0, '', $conf->entity);
89  if (!($result > 0)) {
90  $error++;
91  }
92  }
93  $result = dolibarr_set_const($db, "ONLINE_PAYMENT_CREDITOR", GETPOST('ONLINE_PAYMENT_CREDITOR', 'alpha'), 'chaine', 0, '', $conf->entity);
94  if (!($result > 0)) {
95  $error++;
96  }
97  $result = dolibarr_set_const($db, "STRIPE_BANK_ACCOUNT_FOR_PAYMENTS", GETPOSTINT('STRIPE_BANK_ACCOUNT_FOR_PAYMENTS'), 'chaine', 0, '', $conf->entity);
98  if (!($result > 0)) {
99  $error++;
100  }
101  $result = dolibarr_set_const($db, "STRIPE_USER_ACCOUNT_FOR_ACTIONS", GETPOSTINT('STRIPE_USER_ACCOUNT_FOR_ACTIONS'), 'chaine', 0, '', $conf->entity);
102  if (!($result > 0)) {
103  $error++;
104  }
105  $result = dolibarr_set_const($db, "STRIPE_BANK_ACCOUNT_FOR_BANKTRANSFERS", GETPOSTINT('STRIPE_BANK_ACCOUNT_FOR_BANKTRANSFERS'), 'chaine', 0, '', $conf->entity);
106  if (!($result > 0)) {
107  $error++;
108  }
109  if (GETPOSTISSET('STRIPE_LOCATION')) {
110  $result = dolibarr_set_const($db, "STRIPE_LOCATION", GETPOST('STRIPE_LOCATION', 'alpha'), 'chaine', 0, '', $conf->entity);
111  if (!$result > 0) {
112  $error++;
113  }
114  }
115  $result = dolibarr_set_const($db, "ONLINE_PAYMENT_CSS_URL", GETPOST('ONLINE_PAYMENT_CSS_URL', 'alpha'), 'chaine', 0, '', $conf->entity);
116  if (!($result > 0)) {
117  $error++;
118  }
119  $result = dolibarr_set_const($db, "ONLINE_PAYMENT_MESSAGE_FORM", GETPOST('ONLINE_PAYMENT_MESSAGE_FORM', 'restricthtml'), 'chaine', 0, '', $conf->entity);
120  if (!($result > 0)) {
121  $error++;
122  }
123  $result = dolibarr_set_const($db, "ONLINE_PAYMENT_MESSAGE_OK", GETPOST('ONLINE_PAYMENT_MESSAGE_OK', 'restricthtml'), 'chaine', 0, '', $conf->entity);
124  if (!($result > 0)) {
125  $error++;
126  }
127  $result = dolibarr_set_const($db, "ONLINE_PAYMENT_MESSAGE_KO", GETPOST('ONLINE_PAYMENT_MESSAGE_KO', 'restricthtml'), 'chaine', 0, '', $conf->entity);
128  if (!($result > 0)) {
129  $error++;
130  }
131  $result = dolibarr_set_const($db, "ONLINE_PAYMENT_SENDEMAIL", GETPOST('ONLINE_PAYMENT_SENDEMAIL'), 'chaine', 0, '', $conf->entity);
132  if (!($result > 0)) {
133  $error++;
134  }
135  // Stock decrement
136  //$result = dolibarr_set_const($db, "ONLINE_PAYMENT_WAREHOUSE", (GETPOST('ONLINE_PAYMENT_WAREHOUSE', 'alpha') > 0 ? GETPOST('ONLINE_PAYMENT_WAREHOUSE', 'alpha') : ''), 'chaine', 0, '', $conf->entity);
137  //if (! $result > 0)
138  // $error ++;
139 
140  // Payment token for URL
141  $result = dolibarr_set_const($db, "PAYMENT_SECURITY_TOKEN", GETPOST('PAYMENT_SECURITY_TOKEN', 'alpha'), 'chaine', 0, '', $conf->entity);
142  if (!($result > 0)) {
143  $error++;
144  }
145  if (empty($conf->use_javascript_ajax)) {
146  $result = dolibarr_set_const($db, "PAYMENT_SECURITY_TOKEN_UNIQUE", GETPOST('PAYMENT_SECURITY_TOKEN_UNIQUE', 'alpha'), 'chaine', 0, '', $conf->entity);
147  if (!($result > 0)) {
148  $error++;
149  }
150  }
151 
152  if (!$error) {
153  $db->commit();
154  setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
155  } else {
156  $db->rollback();
157  dol_print_error($db);
158  }
159 }
160 
161 if ($action == "setlive") {
162  $liveenable = GETPOSTINT('value');
163  $res = dolibarr_set_const($db, "STRIPE_LIVE", $liveenable, 'yesno', 0, '', $conf->entity);
164  if ($res > 0) {
165  setEventMessages($langs->trans("SetupSaved"), null, 'mesgs');
166  } else {
167  setEventMessages($langs->trans("Error"), null, 'errors');
168  }
169 }
170 //TODO: import script for stripe account saving in alone or connect mode for stripe.class.php
171 
172 
173 /*
174  * View
175  */
176 
177 $form = new Form($db);
178 $formproduct = new FormProduct($db);
179 
180 llxHeader('', $langs->trans("StripeSetup"));
181 
182 $linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
183 print load_fiche_titre($langs->trans("ModuleSetup").' Stripe', $linkback);
184 
185 $head = stripeadmin_prepare_head();
186 
187 print '<form method="POST" action="'.$_SERVER["PHP_SELF"].'">';
188 print '<input type="hidden" name="token" value="'.newToken().'">';
189 print '<input type="hidden" name="action" value="setvalue">';
190 
191 print dol_get_fiche_head($head, 'stripeaccount', '', -1);
192 
193 $stripearrayofwebhookevents = array('account.updated', 'payout.created', 'payout.paid', 'charge.pending', 'charge.refunded', 'charge.succeeded', 'charge.failed', 'payment_intent.succeeded', 'payment_intent.payment_failed', 'payment_method.attached', 'payment_method.updated', 'payment_method.card_automatically_updated', 'payment_method.detached', 'source.chargeable', 'customer.deleted');
194 
195 print '<span class="opacitymedium">'.$langs->trans("StripeDesc")."</span><br>\n";
196 
197 print '<br>';
198 
199 print '<div class="div-table-responsive-no-min">';
200 print '<table class="noborder centpercent">';
201 print '<tr class="liste_titre">';
202 print '<td>'.$langs->trans("AccountParameter").'</td>';
203 print '<td>'.$langs->trans("Value").'</td>';
204 print '<td></td>';
205 print "</tr>\n";
206 
207 print '<tr class="oddeven">';
208 print '<td>';
209 print $langs->trans("StripeLiveEnabled").'</td><td>';
210 if ($conf->use_javascript_ajax) {
211  print ajax_constantonoff('STRIPE_LIVE');
212 } else {
213  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
214  print $form->selectarray("STRIPE_LIVE", $arrval, $conf->global->STRIPE_LIVE);
215 }
216 print '</td><td></td></tr>';
217 
218 if (empty($conf->stripeconnect->enabled)) {
219  print '<tr class="oddeven"><td>';
220  print '<span class="fieldrequired">'.$langs->trans("STRIPE_TEST_PUBLISHABLE_KEY").'</span></td><td>';
221  print '<input class="minwidth300" type="text" name="STRIPE_TEST_PUBLISHABLE_KEY" value="' . getDolGlobalString('STRIPE_TEST_PUBLISHABLE_KEY').'" placeholder="'.$langs->trans("Example").': pk_test_xxxxxxxxxxxxxxxxxxxxxxxx">';
222  print '</td><td></td></tr>';
223 
224  print '<tr class="oddeven"><td>';
225  print '<span class="titlefield fieldrequired">'.$langs->trans("STRIPE_TEST_SECRET_KEY").'</span></td><td>';
226  print '<input class="minwidth300" type="text" name="STRIPE_TEST_SECRET_KEY" value="' . getDolGlobalString('STRIPE_TEST_SECRET_KEY').'" placeholder="'.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx">';
227  print '</td><td></td></tr>';
228 
229  print '<tr class="oddeven"><td>';
230  print '<span class="titlefield">'.$langs->trans("STRIPE_TEST_WEBHOOK_KEY").'</span></td><td>';
231  if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
232  print '<input class="minwidth300" type="text" name="STRIPE_TEST_WEBHOOK_ID" value="'.getDolGlobalString('STRIPE_TEST_WEBHOOK_ID').'" placeholder="'.$langs->trans("Example").': we_xxxxxxxxxxxxxxxxxxxxxxxx">';
233  print '<br>';
234  }
235  print '<input class="minwidth300" type="text" name="STRIPE_TEST_WEBHOOK_KEY" value="'.getDolGlobalString('STRIPE_TEST_WEBHOOK_KEY').'" placeholder="'.$langs->trans("Example").': whsec_xxxxxxxxxxxxxxxxxxxxxxxx">';
236  $out = img_picto('', 'globe').' <span class="opacitymedium">'.$langs->trans("ToOfferALinkForTestWebhook").'</span> ';
237  $url = dol_buildpath('/public/stripe/ipn.php', 3);
238  $url .= '?test=1';
239  //global $dolibarr_main_instance_unique_id;
240  //$url .= '&securitykey='.dol_hash('stripeipn-'.$dolibarr_main_instance_unique_id.'-'.$conf->global->STRIPE_TEST_PUBLISHABLE_KEY, 'md5');
241  $out .= '<input type="text" id="onlinetestwebhookurl" class="minwidth500" value="'.$url.'" disabled>';
242  $out .= ajax_autoselect("onlinetestwebhookurl", 0);
243  print '<br>'.$out;
244  print '</td><td>';
245  if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
246  if (getDolGlobalString('STRIPE_TEST_WEBHOOK_KEY') && getDolGlobalString('STRIPE_TEST_SECRET_KEY') && getDolGlobalString('STRIPE_TEST_WEBHOOK_ID')) {
247  if (utf8_check($conf->global->STRIPE_TEST_SECRET_KEY)) {
248  try {
249  \Stripe\Stripe::setApiKey($conf->global->STRIPE_TEST_SECRET_KEY);
250  $endpoint = \Stripe\WebhookEndpoint::retrieve($conf->global->STRIPE_TEST_WEBHOOK_ID);
251  $endpoint->enabled_events = $stripearrayofwebhookevents;
252  if (GETPOST('webhook', 'alpha') == $conf->global->STRIPE_TEST_WEBHOOK_ID) {
253  if (!GETPOST('status', 'alpha')) {
254  $endpoint->disabled = true;
255  } else {
256  $endpoint->disabled = false;
257  }
258  }
259  $endpoint->url = $url;
260  // @phan-suppress-next-line PhanDeprecatedFunction
261  $endpoint->save();
262 
263  if ($endpoint->status == 'enabled') {
264  print '<a class="reposition" href="'.$_SERVER['PHP_SELF'].'?action=ipn&webhook='.$endpoint->id.'&status=0">';
265  print img_picto($langs->trans("Activated"), 'switch_on');
266  } else {
267  print '<a class="reposition" href="'.$_SERVER['PHP_SELF'].'?action=ipn&webhook='.$endpoint->id.'&status=1">';
268  print img_picto($langs->trans("Disabled"), 'switch_off');
269  }
270  } catch (Exception $e) {
271  print $e->getMessage();
272  }
273  } else {
274  print 'Bad value for the secret key. Reenter and save it again to fix this.';
275  }
276  } else {
277  print img_picto($langs->trans("Inactive"), 'statut5');
278  }
279  }
280  print'</td></tr>';
281 } else {
282  print '<tr class="oddeven"><td>'.$langs->trans("StripeConnect").'</td>';
283  print '<td><b>'.$langs->trans("StripeConnect_Mode").'</b><br>';
284  print $langs->trans("STRIPE_APPLICATION_FEE_PLATFORM").' ';
285  print price($conf->global->STRIPE_APPLICATION_FEE_PERCENT);
286  print '% + ';
287  print price($conf->global->STRIPE_APPLICATION_FEE);
288  print ' '.$langs->getCurrencySymbol($conf->currency).' '.$langs->trans("minimum").' '.price($conf->global->STRIPE_APPLICATION_FEE_MINIMAL).' '.$langs->getCurrencySymbol($conf->currency);
289  print '</td><td></td></tr>';
290 }
291 
292 if (empty($conf->stripeconnect->enabled)) {
293  print '<tr class="oddeven"><td>';
294  print '<span class="fieldrequired">'.$langs->trans("STRIPE_LIVE_PUBLISHABLE_KEY").'</span></td><td>';
295  print '<input class="minwidth300" type="text" name="STRIPE_LIVE_PUBLISHABLE_KEY" value="'.getDolGlobalString('STRIPE_LIVE_PUBLISHABLE_KEY').'" placeholder="'.$langs->trans("Example").': pk_live_xxxxxxxxxxxxxxxxxxxxxxxx">';
296  print '</td><td></td></tr>';
297 
298  print '<tr class="oddeven"><td>';
299  print '<span class="fieldrequired">'.$langs->trans("STRIPE_LIVE_SECRET_KEY").'</span></td><td>';
300  print '<input class="minwidth300" type="text" name="STRIPE_LIVE_SECRET_KEY" value="'.getDolGlobalString('STRIPE_LIVE_SECRET_KEY').'" placeholder="'.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx">';
301  print '</td><td></td></tr>';
302 
303  print '<tr class="oddeven"><td>';
304  print '<span class="titlefield">'.$langs->trans("STRIPE_LIVE_WEBHOOK_KEY").'</span></td><td>';
305  if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
306  print '<input class="minwidth300" type="text" name="STRIPE_LIVE_WEBHOOK_ID" value="'.getDolGlobalString('STRIPE_LIVE_WEBHOOK_ID').'" placeholder="'.$langs->trans("Example").': we_xxxxxxxxxxxxxxxxxxxxxxxx">';
307  print '<br>';
308  }
309  print '<input class="minwidth300" type="text" name="STRIPE_LIVE_WEBHOOK_KEY" value="'.getDolGlobalString('STRIPE_LIVE_WEBHOOK_KEY').'" placeholder="'.$langs->trans("Example").': whsec_xxxxxxxxxxxxxxxxxxxxxxxx">';
310  $out = img_picto('', 'globe', 'class="pictofixedwidth"').' <span class="opacitymedium">'.$langs->trans("ToOfferALinkForLiveWebhook").'</span> ';
311  $url = dol_buildpath('/public/stripe/ipn.php', 3);
312  //global $dolibarr_main_instance_unique_id;
313  //$url .= '?securitykey='.dol_hash('stripeipn-'.$dolibarr_main_instance_unique_id.'-'.$conf->global->STRIPE_LIVE_PUBLISHABLE_KEY, 'md5');
314  $out .= '<input type="text" id="onlinelivewebhookurl" class="minwidth500" value="'.$url.'" disabled>';
315  $out .= ajax_autoselect("onlinelivewebhookurl", 0);
316  print '<br>'.$out;
317  print '</td><td>';
318  if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
319  if (getDolGlobalString('STRIPE_LIVE_WEBHOOK_KEY') && getDolGlobalString('STRIPE_LIVE_SECRET_KEY') && getDolGlobalString('STRIPE_LIVE_WEBHOOK_ID')) {
320  if (utf8_check($conf->global->STRIPE_TEST_SECRET_KEY)) {
321  try {
322  \Stripe\Stripe::setApiKey($conf->global->STRIPE_LIVE_SECRET_KEY);
323  $endpoint = \Stripe\WebhookEndpoint::retrieve($conf->global->STRIPE_LIVE_WEBHOOK_ID);
324  $endpoint->enabled_events = $stripearrayofwebhookevents;
325  if (GETPOST('webhook', 'alpha') == $conf->global->STRIPE_LIVE_WEBHOOK_ID) {
326  if (empty(GETPOST('status', 'alpha'))) {
327  $endpoint->disabled = true;
328  } else {
329  $endpoint->disabled = false;
330  }
331  }
332  $endpoint->url = $url;
333  // @phan-suppress-next-line PhanDeprecatedFunction
334  $endpoint->save();
335  if ($endpoint->status == 'enabled') {
336  print '<a class="reposition" href="'.$_SERVER['PHP_SELF'].'?action=ipn&webhook='.$endpoint->id.'&status=0">';
337  print img_picto($langs->trans("Activated"), 'switch_on');
338  } else {
339  print '<a class="reposition" href="'.$_SERVER['PHP_SELF'].'?action=ipn&webhook='.$endpoint->id.'&status=1">';
340  print img_picto($langs->trans("Disabled"), 'switch_off');
341  }
342  } catch (Exception $e) {
343  print $e->getMessage();
344  }
345  }
346  } else {
347  print img_picto($langs->trans("Inactive"), 'statut5');
348  }
349  }
350  print '</td></tr>';
351 }
352 
353 print '</table>';
354 print '</div>';
355 
356 print '<br>';
357 
358 
359 print '<div class="div-table-responsive-no-min">';
360 print '<table class="noborder centpercent">';
361 print '<tr class="liste_titre">';
362 print '<td>'.$langs->trans("UsageParameter").'</td>';
363 print '<td>'.$langs->trans("Value").'</td>';
364 print "</tr>\n";
365 
366 print '<tr class="oddeven"><td>';
367 print $langs->trans("PublicVendorName").'</td><td>';
368 print '<input class="minwidth300" type="text" name="ONLINE_PAYMENT_CREDITOR" value="'.getDolGlobalString('ONLINE_PAYMENT_CREDITOR').'">';
369 print ' &nbsp; <span class="opacitymedium">'.$langs->trans("Example").': '.$mysoc->name.'</span>';
370 print '</td></tr>';
371 
372 print '<tr class="oddeven"><td>';
373 print $langs->trans("StripeUserAccountForActions").'</td><td>';
374 print img_picto('', 'user', 'class="pictofixedwidth"').$form->select_dolusers(getDolGlobalString('STRIPE_USER_ACCOUNT_FOR_ACTIONS'), 'STRIPE_USER_ACCOUNT_FOR_ACTIONS', 0);
375 print '</td></tr>';
376 
377 print '<tr class="oddeven"><td>';
378 print $langs->trans("BankAccount").'</td><td>';
379 print img_picto('', 'bank_account', 'class="pictofixedwidth"');
380 $form->select_comptes(getDolGlobalString('STRIPE_BANK_ACCOUNT_FOR_PAYMENTS'), 'STRIPE_BANK_ACCOUNT_FOR_PAYMENTS', 0, '', 1);
381 print '</td></tr>';
382 
383 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // What is this for ?
384  print '<tr class="oddeven"><td>';
385  print $langs->trans("BankAccountForBankTransfer").'</td><td>';
386  print img_picto('', 'bank_account', 'class="pictofixedwidth"');
387  $form->select_comptes(getDolGlobalString('STRIPE_BANK_ACCOUNT_FOR_BANKTRANSFERS'), 'STRIPE_BANK_ACCOUNT_FOR_BANKTRANSFERS', 0, '', 1);
388  print '</td></tr>';
389 }
390 
391 // Card Present for Stripe Terminal
392 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
393  print '<tr class="oddeven"><td>';
394  print $langs->trans("STRIPE_CARD_PRESENT").'</td><td>';
395  if ($conf->use_javascript_ajax) {
396  print ajax_constantonoff('STRIPE_CARD_PRESENT');
397  } else {
398  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
399  print $form->selectarray("STRIPE_CARD_PRESENT", $arrval, $conf->global->STRIPE_CARD_PRESENT);
400  }
401  print '</td></tr>';
402 }
403 
404 // Locations for Stripe Terminal
405 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
406  print '<tr class="oddeven"><td>';
407  print $langs->trans("TERMINAL_LOCATION").'</td><td>';
408  $service = 'StripeTest';
409  $servicestatus = 0;
410  if (getDolGlobalString('STRIPE_LIVE') && !GETPOST('forcesandbox', 'alpha')) {
411  $service = 'StripeLive';
412  $servicestatus = 1;
413  }
414 
415  try {
416  global $stripearrayofkeysbyenv;
417  $site_account = $stripearrayofkeysbyenv[$servicestatus]['secret_key'];
418  if (!empty($site_account)) {
419  \Stripe\Stripe::setApiKey($site_account);
420  }
421  if (isModEnabled('stripe') && (!getDolGlobalString('STRIPE_LIVE') || GETPOST('forcesandbox', 'alpha'))) {
422  $service = 'StripeTest';
423  $servicestatus = '0';
424  dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode', 'Stripe'), '', 'warning');
425  } else {
426  $service = 'StripeLive';
427  $servicestatus = '1';
428  }
429  $stripe = new Stripe($db);
430  if (!empty($site_account)) {
431  // If $site_account not defined, then key not set and no way to call API Location
432  $stripeacc = $stripe->getStripeAccount($service);
433  if ($stripeacc) {
434  $locations = \Stripe\Terminal\Location::all('', array("stripe_account" => $stripeacc));
435  } else {
436  $locations = \Stripe\Terminal\Location::all();
437  }
438  }
439  } catch (Exception $e) {
440  print $e->getMessage().'<br>';
441  }
442 
443  // Define the array $location
444  $location = array();
445  $location[""] = $langs->trans("NotDefined");
446  if (!empty($locations)) {
447  foreach ($locations as $tmplocation) {
448  $location[$tmplocation->id] = $tmplocation->display_name;
449  }
450  }
451 
452  print $form->selectarray("STRIPE_LOCATION", $location, getDolGlobalString('STRIPE_LOCATION'));
453  print '</td></tr>';
454 }
455 
456 print '<tr class="oddeven"><td>';
457 print $langs->trans("STRIPE_SEPA_DIRECT_DEBIT").'</td><td>';
458 if ($conf->use_javascript_ajax) {
459  print ajax_constantonoff('STRIPE_SEPA_DIRECT_DEBIT');
460 } else {
461  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
462  print $form->selectarray("STRIPE_SEPA_DIRECT_DEBIT", $arrval, getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT'));
463 }
464 print '</td></tr>';
465 
466 
467 // Activate Klarna
468 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
469  print '<tr class="oddeven"><td>';
470  print $langs->trans("STRIPE_KLARNA").'</td><td>';
471  if ($conf->use_javascript_ajax) {
472  print ajax_constantonoff('STRIPE_KLARNA');
473  } else {
474  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
475  print $form->selectarray("STRIPE_KLARNA", $arrval, $conf->global->STRIPE_KLARNA);
476  }
477  print '</td></tr>';
478 }
479 
480 // Activate Bancontact
481 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
482  print '<tr class="oddeven"><td>';
483  print $langs->trans("STRIPE_BANCONTACT").'</td><td>';
484  if ($conf->use_javascript_ajax) {
485  print ajax_constantonoff('STRIPE_BANCONTACT');
486  } else {
487  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
488  print $form->selectarray("STRIPE_BANCONTACT", $arrval, $conf->global->STRIPE_BANCONTACT);
489  }
490  print ' &nbsp; <span class="opacitymedium">'.$langs->trans("ExampleOnlyForBECustomers").'</span>';
491  print '</td></tr>';
492 }
493 
494 // Activate iDEAL
495 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
496  print '<tr class="oddeven"><td>';
497  print $langs->trans("STRIPE_IDEAL").'</td><td>';
498  if ($conf->use_javascript_ajax) {
499  print ajax_constantonoff('STRIPE_IDEAL');
500  } else {
501  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
502  print $form->selectarray("STRIPE_IDEAL", $arrval, $conf->global->STRIPE_SEPA_DIRECT_DEBIT);
503  }
504  print ' &nbsp; <span class="opacitymedium">'.$langs->trans("ExampleOnlyForNLCustomers").'</span>';
505  print '</td></tr>';
506 }
507 
508 // Activate Giropay
509 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
510  print '<tr class="oddeven"><td>';
511  print $langs->trans("STRIPE_GIROPAY").'</td><td>';
512  if ($conf->use_javascript_ajax) {
513  print ajax_constantonoff('STRIPE_GIROPAY');
514  } else {
515  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
516  print $form->selectarray("STRIPE_GIROPAY", $arrval, $conf->global->STRIPE_GIROPAY);
517  }
518  print ' &nbsp; <span class="opacitymedium">'.$langs->trans("ExampleOnlyForDECustomers").'</span>';
519  print '</td></tr>';
520 }
521 
522 // Activate Sofort
523 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) { // TODO Not used by current code
524  print '<tr class="oddeven"><td>';
525  print $langs->trans("STRIPE_SOFORT").'</td><td>';
526  if ($conf->use_javascript_ajax) {
527  print ajax_constantonoff('STRIPE_SOFORT');
528  } else {
529  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
530  print $form->selectarray("STRIPE_SOFORT", $arrval, $conf->global->STRIPE_SOFORT);
531  }
532  print ' &nbsp; <span class="opacitymedium">'.$langs->trans("ExampleOnlyForATBEDEITNLESCustomers").'</span>';
533  print '</td></tr>';
534 }
535 
536 print '<tr class="oddeven"><td>';
537 print $langs->trans("CSSUrlForPaymentForm").'</td><td>';
538 print '<input class="width500" type="text" name="ONLINE_PAYMENT_CSS_URL" value="' . getDolGlobalString('ONLINE_PAYMENT_CSS_URL').'">';
539 print ' &nbsp; <span class="opacitymedium">'.$langs->trans("Example").': http://mysite/mycss.css</span>';
540 print '</td></tr>';
541 
542 print '<tr class="oddeven"><td>';
543 print $langs->trans("MessageForm").'</td><td>';
544 $doleditor = new DolEditor('ONLINE_PAYMENT_MESSAGE_FORM', $conf->global->ONLINE_PAYMENT_MESSAGE_FORM, '', 100, 'dolibarr_details', 'In', false, true, true, ROWS_2, '90%');
545 $doleditor->Create();
546 print '</td></tr>';
547 
548 print '<tr class="oddeven"><td>';
549 print $langs->trans("MessageOK").'</td><td>';
550 $doleditor = new DolEditor('ONLINE_PAYMENT_MESSAGE_OK', $conf->global->ONLINE_PAYMENT_MESSAGE_OK, '', 100, 'dolibarr_details', 'In', false, true, true, ROWS_2, '90%');
551 $doleditor->Create();
552 print '</td></tr>';
553 
554 print '<tr class="oddeven"><td>';
555 print $langs->trans("MessageKO").'</td><td>';
556 $doleditor = new DolEditor('ONLINE_PAYMENT_MESSAGE_KO', $conf->global->ONLINE_PAYMENT_MESSAGE_KO, '', 100, 'dolibarr_details', 'In', false, true, true, ROWS_2, '90%');
557 $doleditor->Create();
558 print '</td></tr>';
559 
560 print '<tr class="oddeven"><td>';
561 print $langs->trans("ONLINE_PAYMENT_SENDEMAIL").'</td><td>';
562 print img_picto('', 'email', 'class="pictofixedwidth"');
563 print '<input class="minwidth200" type="text" name="ONLINE_PAYMENT_SENDEMAIL" value="' . getDolGlobalString('ONLINE_PAYMENT_SENDEMAIL').'">';
564 print ' &nbsp; <span class="opacitymedium">'.$langs->trans("Example").': myemail@myserver.com, Payment service &lt;myemail2@myserver2.com&gt;</span>';
565 print '</td></tr>';
566 
567 print '</table>';
568 print '</div>';
569 
570 print '<br>';
571 
572 print '<div class="div-table-responsive-no-min">';
573 print '<table class="noborder centpercent">';
574 
575 print '<tr class="liste_titre">';
576 print '<td>'.$langs->trans("UrlGenerationParameters").'</td>';
577 print '<td>'.$langs->trans("Value").'</td>';
578 print "</tr>\n";
579 
580 // Payment token for URL
581 print '<tr class="oddeven"><td>';
582 print $langs->trans("SecurityToken").'</td><td>';
583 print '<input class="minwidth300" type="text" id="PAYMENT_SECURITY_TOKEN" name="PAYMENT_SECURITY_TOKEN" value="' . getDolGlobalString('PAYMENT_SECURITY_TOKEN').'">';
584 if (!empty($conf->use_javascript_ajax)) {
585  print '&nbsp;'.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_token" class="linkobject"');
586 }
587 if (getDolGlobalString('PAYMENT_SECURITY_ACCEPT_ANY_TOKEN')) {
588  $langs->load("errors");
589  print img_warning($langs->trans("WarningTheHiddenOptionIsOn", 'PAYMENT_SECURITY_ACCEPT_ANY_TOKEN'), '', 'pictowarning marginleftonly');
590 }
591 print '</td></tr>';
592 
593 print '<tr class="oddeven"><td>';
594 print $langs->trans("SecurityTokenIsUnique").'</td><td>';
595 if ($conf->use_javascript_ajax) {
596  print ajax_constantonoff('PAYMENT_SECURITY_TOKEN_UNIQUE', null, null, 0, 0, 1);
597 } else {
598  $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
599  print $form->selectarray("PAYMENT_SECURITY_TOKEN_UNIQUE", $arrval, $conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE);
600 }
601 print '</td></tr>';
602 
603 print '</table>';
604 print '</div>';
605 
606 print dol_get_fiche_end();
607 
608 print $form->buttonsSaveCancel("Save", '');
609 
610 print '</form>';
611 
612 print '<br><br>';
613 
614 
615 $token = '';
616 
617 include DOL_DOCUMENT_ROOT.'/core/tpl/onlinepaymentlinks.tpl.php';
618 
619 print info_admin($langs->trans("ExampleOfTestCreditCard", '4242424242424242 (no 3DSecure) or 4000000000003063 (3DSecure required) or 4000002760003184 (3DSecure2 required on all transaction) or 4000003800000446 (3DSecure2 required, the off-session allowed)', '4000000000000101', '4000000000000069', '4000000000000341'));
620 
621 if (getDolGlobalString('STRIPE_SEPA_DIRECT_DEBIT')) {
622  print info_admin($langs->trans("ExampleOfTestBankAcountForSEPA", 'AT611904300234573201 (pending->succeed) or AT861904300235473202 (pending->failed)'));
623 }
624 
625 
626 
627 if (!empty($conf->use_javascript_ajax)) {
628  print "\n".'<script type="text/javascript">';
629  print '$(document).ready(function () {
630  $("#apidoc").hide();
631  $("#apidoca").click(function() {
632  console.log("We click on apidoca show/hide");
633  $("#apidoc").show();
634  $("#apidoca").hide();
635  return false;
636  });
637  });';
638  print '</script>';
639 }
640 
641 // End of page
642 llxFooter();
643 $db->close();
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).
Definition: admin.lib.php:655
ajax_constantonoff($code, $input=array(), $entity=null, $revertonoff=0, $strict=0, $forcereload=0, $marginleftonlyshort=2, $forcenoajax=0, $setzeroinsteadofdel=0, $suffix='', $mode='', $morecss='inline-block')
On/off button for constant.
Definition: ajax.lib.php:646
if(!defined('NOREQUIRESOC')) if(!defined('NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined('NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined('NOREQUIREAJAX')) llxHeader()
Empty header.
Definition: wrapper.php:56
llxFooter()
Empty footer.
Definition: wrapper.php:70
Class to manage a WYSIWYG editor.
Class to manage generation of HTML components Only common components must be here.
Class with static methods for building HTML components related to products Only components common to ...
Stripe class.
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
ajax_autoselect($htmlname, $addlink='', $textonlink='Link')
Make content of an input box selected when we click into input field.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information in HTML for admin users or standard users.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_htmloutput_mesg($mesgstring='', $mesgarray=array(), $style='ok', $keepembedded=0)
Print formatted messages to output (Used to show messages on html output).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
utf8_check($str)
Check if a string is in UTF8.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.
stripeadmin_prepare_head()
Define head array for tabs of stripe tools setup pages.
Definition: stripe.lib.php:31