Merge pull request #7232 from turbo124/v5-develop

Fixes for SEPA token billing
This commit is contained in:
David Bomba 2022-02-23 11:02:25 +11:00 committed by GitHub
commit 3bd003bc9a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 155 additions and 116 deletions

View File

@ -13,6 +13,7 @@ namespace App\Console\Commands;
use App; use App;
use App\Factory\ClientContactFactory; use App\Factory\ClientContactFactory;
use App\Factory\VendorContactFactory;
use App\Models\Account; use App\Models\Account;
use App\Models\Client; use App\Models\Client;
use App\Models\ClientContact; use App\Models\ClientContact;
@ -72,7 +73,7 @@ class CheckData extends Command
/** /**
* @var string * @var string
*/ */
protected $signature = 'ninja:check-data {--database=} {--fix=} {--client_id=} {--paid_to_date=} {--client_balance=}'; protected $signature = 'ninja:check-data {--database=} {--fix=} {--client_id=} {--vendor_id=} {--paid_to_date=} {--client_balance=}';
/** /**
* @var string * @var string
@ -112,6 +113,7 @@ class CheckData extends Command
$this->checkClientBalances(); $this->checkClientBalances();
$this->checkContacts(); $this->checkContacts();
$this->checkVendorContacts();
$this->checkEntityInvitations(); $this->checkEntityInvitations();
$this->checkCompanyData(); $this->checkCompanyData();
@ -248,6 +250,65 @@ class CheckData extends Command
} }
private function checkVendorContacts()
{
// check for contacts with the contact_key value set
$contacts = DB::table('vendor_contacts')
->whereNull('contact_key')
->orderBy('id')
->get(['id']);
$this->logMessage($contacts->count().' contacts without a contact_key');
if ($contacts->count() > 0) {
$this->isValid = false;
}
if ($this->option('fix') == 'true') {
foreach ($contacts as $contact) {
DB::table('vendor_contacts')
->where('id', '=', $contact->id)
->whereNull('contact_key')
->update([
'contact_key' => Str::random(config('ninja.key_length')),
]);
}
}
// check for missing contacts
$vendors = DB::table('vendors')
->leftJoin('vendor_contacts', function ($join) {
$join->on('vendor_contacts.vendor_id', '=', 'vendors.id')
->whereNull('vendor_contacts.deleted_at');
})
->groupBy('vendors.id', 'vendors.user_id', 'vendors.company_id')
->havingRaw('count(vendor_contacts.id) = 0');
if ($this->option('vendor_id')) {
$vendors->where('vendors.id', '=', $this->option('vendor_id'));
}
$vendors = $vendors->get(['vendors.id', 'vendors.user_id', 'vendors.company_id']);
$this->logMessage($vendors->count().' vendors without any contacts');
if ($vendors->count() > 0) {
$this->isValid = false;
}
if ($this->option('fix') == 'true') {
foreach ($vendors as $vendor) {
$this->logMessage("Fixing missing vendor contacts #{$vendor->id}");
$new_contact = VendorContactFactory::create($vendor->company_id, $vendor->user_id);
$new_contact->vendor_id = $vendor->id;
$new_contact->contact_key = Str::random(40);
$new_contact->is_primary = true;
$new_contact->save();
}
}
}
private function checkFailedJobs() private function checkFailedJobs()
{ {
if (config('ninja.testvars.travis')) { if (config('ninja.testvars.travis')) {

View File

@ -168,10 +168,10 @@ class CreateEntityPdf implements ShouldQueue
]), ]),
'variables' => $variables, 'variables' => $variables,
'options' => [ 'options' => [
'all_pages_header' => $this->client->getSetting('all_pages_header'), 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'),
'all_pages_footer' => $this->client->getSetting('all_pages_footer'), 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'),
], ],
'process_markdown' => $this->client->company->markdown_enabled, 'process_markdown' => $this->entity->client->company->markdown_enabled,
]; ];
$maker = new PdfMakerService($state); $maker = new PdfMakerService($state);

View File

@ -149,6 +149,7 @@ class Gateway extends StaticModel
GatewayType::BECS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded','payment_intent.succeeded']], GatewayType::BECS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded','payment_intent.succeeded']],
GatewayType::IDEAL => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded','payment_intent.succeeded']], GatewayType::IDEAL => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded','payment_intent.succeeded']],
GatewayType::ACSS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded','payment_intent.succeeded']], GatewayType::ACSS => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded','payment_intent.succeeded']],
GatewayType::FPX => ['refund' => true, 'token_billing' => true, 'webhooks' => ['source.chargeable', 'charge.succeeded']],
]; ];
break; break;
case 57: case 57:

View File

@ -47,7 +47,7 @@ class SEPA
$data['country'] = $this->stripe->client->country->iso_3166_2; $data['country'] = $this->stripe->client->country->iso_3166_2;
$data['payment_hash'] = $this->stripe->payment_hash->hash; $data['payment_hash'] = $this->stripe->payment_hash->hash;
$intent = \Stripe\PaymentIntent::create([ $intent_data = [
'amount' => $data['stripe_amount'], 'amount' => $data['stripe_amount'],
'currency' => 'eur', 'currency' => 'eur',
'payment_method_types' => ['sepa_debit'], 'payment_method_types' => ['sepa_debit'],
@ -58,19 +58,12 @@ class SEPA
'payment_hash' => $this->stripe->payment_hash->hash, 'payment_hash' => $this->stripe->payment_hash->hash,
'gateway_type_id' => GatewayType::SEPA, 'gateway_type_id' => GatewayType::SEPA,
], ],
], $this->stripe->stripe_connect_auth); ];
$intent = \Stripe\PaymentIntent::create($intent_data, $this->stripe->stripe_connect_auth);
$data['pi_client_secret'] = $intent->client_secret; $data['pi_client_secret'] = $intent->client_secret;
if (count($data['tokens']) > 0) {
$setup_intent = $this->stripe->stripe->setupIntents->create([
'payment_method_types' => ['sepa_debit'],
'customer' => $this->stripe->findOrCreateCustomer()->id,
]);
$data['si_client_secret'] = $setup_intent->client_secret;
}
$this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, ['stripe_amount' => $data['stripe_amount']]); $this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, ['stripe_amount' => $data['stripe_amount']]);
$this->stripe->payment_hash->save(); $this->stripe->payment_hash->save();

View File

@ -263,9 +263,7 @@ class Helpers
} }
return $value; return $value;
// $x = str_replace(["\n", "<br>"], ["\r", "<br>"], $value); // $x = str_replace(["\n", "<br>"], ["\r", "<br>"], $value);
// return $x; // return $x;
} }

View File

@ -1,2 +1,2 @@
/*! For license information please see stripe-sepa.js.LICENSE.txt */ /*! For license information please see stripe-sepa.js.LICENSE.txt */
(()=>{var e,t,n,o;function a(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){function e(t,n){var o=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"setupStripe",(function(){o.stripeConnect?o.stripe=Stripe(o.key,{stripeAccount:o.stripeConnect}):o.stripe=Stripe(o.key);var e=o.stripe.elements(),t={style:{base:{color:"#32325d",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',fontSmoothing:"antialiased",fontSize:"16px","::placeholder":{color:"#aab7c4"},":-webkit-autofill":{color:"#32325d"}},invalid:{color:"#fa755a",iconColor:"#fa755a",":-webkit-autofill":{color:"#fa755a"}}},supportedCountries:["SEPA"],placeholderCountry:document.querySelector('meta[name="country"]').content};return o.iban=e.create("iban",t),o.iban.mount("#sepa-iban"),o})),r(this,"handle",(function(){var e=document.getElementById("errors");Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach((function(e){return e.addEventListener("click",(function(e){document.getElementById("stripe--payment-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=e.target.dataset.token}))})),document.getElementById("toggle-payment-with-new-bank-account").addEventListener("click",(function(e){document.getElementById("stripe--payment-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value=""})),document.getElementById("pay-now").addEventListener("click",(function(t){return 0!==document.querySelector("input[name=token]").value.length?(document.querySelector("#errors").hidden=!0,document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),void o.stripe.confirmSepaDebitSetup(document.querySelector("meta[name=si-client-secret").content,{payment_method:document.querySelector("input[name=token]").value}).then((function(e){if(!e.error)return document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.setupIntent),document.querySelector("#server-response").submit();console.error(error)})).catch((function(t){e.textContent=t,e.hidden=!1}))):""===document.getElementById("sepa-name").value?(document.getElementById("sepa-name").focus(),e.textContent=document.querySelector("meta[name=translation-name-required]").content,void(e.hidden=!1)):""===document.getElementById("sepa-email-address").value?(document.getElementById("sepa-email-address").focus(),e.textContent=document.querySelector("meta[name=translation-email-required]").content,void(e.hidden=!1)):document.getElementById("sepa-mandate-acceptance").checked?(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),void o.stripe.confirmSepaDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{sepa_debit:o.iban,billing_details:{name:document.getElementById("sepa-name").value,email:document.getElementById("sepa-email-address").value}}}).then((function(e){return e.error?o.handleFailure(e.error.message):o.handleSuccess(e)}))):(e.textContent=document.querySelector("meta[name=translation-terms-required]").content,e.hidden=!1,void console.log("Terms"))}))})),this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=n}var t,n,o;return t=e,(n=[{key:"handleSuccess",value:function(e){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);var t=document.querySelector('input[name="token-billing-checkbox"]:checked');t&&(document.querySelector('input[name="store_card"]').value=t.value),document.getElementById("server-response").submit()}},{key:"handleFailure",value:function(e){var t=document.getElementById("errors");t.textContent="",t.textContent=e,t.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}}])&&a(t.prototype,n),o&&a(t,o),e}();new c(null!==(e=null===(t=document.querySelector('meta[name="stripe-publishable-key"]'))||void 0===t?void 0:t.content)&&void 0!==e?e:"",null!==(n=null===(o=document.querySelector('meta[name="stripe-account-id"]'))||void 0===o?void 0:o.content)&&void 0!==n?n:"").setupStripe().handle()})(); (()=>{var e,t,n,a;function o(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c=function(){function e(t,n){var a=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),r(this,"setupStripe",(function(){a.stripeConnect?a.stripe=Stripe(a.key,{stripeAccount:a.stripeConnect}):a.stripe=Stripe(a.key);var e=a.stripe.elements(),t={style:{base:{color:"#32325d",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',fontSmoothing:"antialiased",fontSize:"16px","::placeholder":{color:"#aab7c4"},":-webkit-autofill":{color:"#32325d"}},invalid:{color:"#fa755a",iconColor:"#fa755a",":-webkit-autofill":{color:"#fa755a"}}},supportedCountries:["SEPA"],placeholderCountry:document.querySelector('meta[name="country"]').content};return a.iban=e.create("iban",t),a.iban.mount("#sepa-iban"),document.getElementById("sepa-name").value=document.querySelector("meta[name=client_name]").content,document.getElementById("sepa-email-address").value=document.querySelector("meta[name=client_email]").content,a})),r(this,"handle",(function(){var e=document.getElementById("errors");Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach((function(e){return e.addEventListener("click",(function(e){document.getElementById("stripe--payment-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=e.target.dataset.token}))})),document.getElementById("toggle-payment-with-new-bank-account").addEventListener("click",(function(e){document.getElementById("stripe--payment-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value=""})),document.getElementById("pay-now").addEventListener("click",(function(t){if(console.log(document.querySelector("input[name=token]").value),0!==document.querySelector("input[name=token]").value.length)document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),a.stripe.confirmSepaDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:document.querySelector("input[name=token]").value}).then((function(e){return e.error?a.handleFailure(e.error.message):a.handleSuccess(e)}));else{if(""===document.getElementById("sepa-name").value)return document.getElementById("sepa-name").focus(),e.textContent=document.querySelector("meta[name=translation-name-required]").content,void(e.hidden=!1);if(""===document.getElementById("sepa-email-address").value)return document.getElementById("sepa-email-address").focus(),e.textContent=document.querySelector("meta[name=translation-email-required]").content,void(e.hidden=!1);if(!document.getElementById("sepa-mandate-acceptance").checked)return e.textContent=document.querySelector("meta[name=translation-terms-required]").content,void(e.hidden=!1);document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),a.stripe.confirmSepaDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{sepa_debit:a.iban,billing_details:{name:document.getElementById("sepa-name").value,email:document.getElementById("sepa-email-address").value}}}).then((function(e){return e.error?a.handleFailure(e.error.message):a.handleSuccess(e)}))}}))})),this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=n}var t,n,a;return t=e,(n=[{key:"handleSuccess",value:function(e){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);var t=document.querySelector('input[name="token-billing-checkbox"]:checked');t&&(document.querySelector('input[name="store_card"]').value=t.value),document.getElementById("server-response").submit()}},{key:"handleFailure",value:function(e){var t=document.getElementById("errors");t.textContent="",t.textContent=e,t.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}}])&&o(t.prototype,n),a&&o(t,a),e}();new c(null!==(e=null===(t=document.querySelector('meta[name="stripe-publishable-key"]'))||void 0===t?void 0:t.content)&&void 0!==e?e:"",null!==(n=null===(a=document.querySelector('meta[name="stripe-account-id"]'))||void 0===a?void 0:a.content)&&void 0!==n?n:"").setupStripe().handle()})();

View File

@ -27,7 +27,7 @@
"/js/clients/payments/square-credit-card.js": "/js/clients/payments/square-credit-card.js?id=8f05ce6bd2d6cae7e5f2", "/js/clients/payments/square-credit-card.js": "/js/clients/payments/square-credit-card.js?id=8f05ce6bd2d6cae7e5f2",
"/js/clients/statements/view.js": "/js/clients/statements/view.js?id=4ed4c8a09803ddd0a9a7", "/js/clients/statements/view.js": "/js/clients/statements/view.js?id=4ed4c8a09803ddd0a9a7",
"/js/clients/payments/razorpay-aio.js": "/js/clients/payments/razorpay-aio.js?id=c36ab5621413ef1de7c8", "/js/clients/payments/razorpay-aio.js": "/js/clients/payments/razorpay-aio.js?id=c36ab5621413ef1de7c8",
"/js/clients/payments/stripe-sepa.js": "/js/clients/payments/stripe-sepa.js?id=2daa1a70aa5f8e6988f5", "/js/clients/payments/stripe-sepa.js": "/js/clients/payments/stripe-sepa.js?id=da7b16ffaf5645535c7c",
"/js/clients/payment_methods/authorize-checkout-card.js": "/js/clients/payment_methods/authorize-checkout-card.js?id=61becda97682c7909f29", "/js/clients/payment_methods/authorize-checkout-card.js": "/js/clients/payment_methods/authorize-checkout-card.js?id=61becda97682c7909f29",
"/js/clients/payments/stripe-giropay.js": "/js/clients/payments/stripe-giropay.js?id=2a973971ed2b890524ee", "/js/clients/payments/stripe-giropay.js": "/js/clients/payments/stripe-giropay.js?id=2a973971ed2b890524ee",
"/js/clients/payments/stripe-acss.js": "/js/clients/payments/stripe-acss.js?id=41367f4e80e52a0ab436", "/js/clients/payments/stripe-acss.js": "/js/clients/payments/stripe-acss.js?id=41367f4e80e52a0ab436",

View File

@ -17,26 +17,21 @@ class ProcessSEPA {
setupStripe = () => { setupStripe = () => {
if (this.stripeConnect){ if (this.stripeConnect) {
// this.stripe.stripeAccount = this.stripeConnect;
this.stripe = Stripe(this.key, {
this.stripe = Stripe(this.key, { stripeAccount: this.stripeConnect,
stripeAccount: this.stripeConnect, });
});
} else {
}
else {
this.stripe = Stripe(this.key); this.stripe = Stripe(this.key);
} }
const elements = this.stripe.elements(); const elements = this.stripe.elements();
var style = { var style = {
base: { base: {
color: '#32325d', color: '#32325d',
fontFamily: fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
fontSmoothing: 'antialiased', fontSmoothing: 'antialiased',
fontSize: '16px', fontSize: '16px',
'::placeholder': { '::placeholder': {
@ -65,6 +60,10 @@ class ProcessSEPA {
}; };
this.iban = elements.create('iban', options); this.iban = elements.create('iban', options);
this.iban.mount('#sepa-iban'); this.iban.mount('#sepa-iban');
document.getElementById('sepa-name').value = document.querySelector('meta[name=client_name]').content;
document.getElementById('sepa-email-address').value = document.querySelector('meta[name=client_email]').content;
return this; return this;
}; };
@ -97,107 +96,92 @@ class ProcessSEPA {
}); });
document.getElementById('pay-now').addEventListener('click', (e) => { document.getElementById('pay-now').addEventListener('click', (e) => {
if (
document.querySelector('input[name=token]').value.length !== 0 console.log(document.querySelector('input[name=token]').value);
) {
document.querySelector('#errors').hidden = true; if (document.querySelector('input[name=token]').value.length !== 0) {
document.getElementById('pay-now').disabled = true; document.getElementById('pay-now').disabled = true;
document document.querySelector('#pay-now > svg').classList.remove('hidden');
.querySelector('#pay-now > svg') document.querySelector('#pay-now > span').classList.add('hidden');
.classList.remove('hidden');
document
.querySelector('#pay-now > span')
.classList.add('hidden');
this.stripe this.stripe
.confirmSepaDebitSetup( .confirmSepaDebitPayment(
document.querySelector('meta[name=si-client-secret') document.querySelector('meta[name=pi-client-secret')
.content, .content, {
{ payment_method: document.querySelector('input[name=token]').value
payment_method: document.querySelector(
'input[name=token]'
).value,
} }
) )
.then((result) => { .then((result) => {
if (result.error) { if (result.error) {
console.error(error); return this.handleFailure(result.error.message);
return;
} }
document.querySelector( return this.handleSuccess(result);
'input[name="gateway_response"]'
).value = JSON.stringify(result.setupIntent);
return document
.querySelector('#server-response')
.submit();
})
.catch((error) => {
errors.textContent = error;
errors.hidden = false;
}); });
return; } else {
}
if (document.getElementById('sepa-name').value === '') { if (document.getElementById('sepa-name').value === '') {
document.getElementById('sepa-name').focus(); document.getElementById('sepa-name').focus();
errors.textContent = document.querySelector( errors.textContent = document.querySelector(
'meta[name=translation-name-required]' 'meta[name=translation-name-required]'
).content; ).content;
errors.hidden = false; errors.hidden = false;
return; return;
} }
if (document.getElementById('sepa-email-address').value === '') { if (document.getElementById('sepa-email-address').value === '') {
document.getElementById('sepa-email-address').focus(); document.getElementById('sepa-email-address').focus();
errors.textContent = document.querySelector( errors.textContent = document.querySelector(
'meta[name=translation-email-required]' 'meta[name=translation-email-required]'
).content; ).content;
errors.hidden = false; errors.hidden = false;
return; return;
} }
if (!document.getElementById('sepa-mandate-acceptance').checked) { if (!document.getElementById('sepa-mandate-acceptance').checked) {
errors.textContent = document.querySelector( errors.textContent = document.querySelector(
'meta[name=translation-terms-required]' 'meta[name=translation-terms-required]'
).content; ).content;
errors.hidden = false; errors.hidden = false;
console.log('Terms');
return;
}
document.getElementById('pay-now').disabled = true; return;
document.querySelector('#pay-now > svg').classList.remove('hidden'); }
document.querySelector('#pay-now > span').classList.add('hidden');
this.stripe
.confirmSepaDebitPayment( document.getElementById('pay-now').disabled = true;
document.querySelector('meta[name=pi-client-secret') document.querySelector('#pay-now > svg').classList.remove('hidden');
.content, document.querySelector('#pay-now > span').classList.add('hidden');
{
payment_method: {
sepa_debit: this.iban,
billing_details: { this.stripe
name: document.getElementById('sepa-name') .confirmSepaDebitPayment(
.value, document.querySelector('meta[name=pi-client-secret')
email: document.getElementById( .content, {
'sepa-email-address' payment_method: {
).value, sepa_debit: this.iban,
billing_details: {
name: document.getElementById('sepa-name')
.value,
email: document.getElementById(
'sepa-email-address'
).value,
},
}, },
}, }
} )
) .then((result) => {
.then((result) => { if (result.error) {
if (result.error) { return this.handleFailure(result.error.message);
return this.handleFailure(result.error.message); }
}
return this.handleSuccess(result);
});
}
return this.handleSuccess(result);
});
}); });
}; };
@ -232,10 +216,10 @@ class ProcessSEPA {
} }
const publishableKey = const publishableKey =
document.querySelector('meta[name="stripe-publishable-key"]')?.content ?? document.querySelector('meta[name="stripe-publishable-key"]') ? .content ? ?
''; '';
const stripeConnect = const stripeConnect =
document.querySelector('meta[name="stripe-account-id"]')?.content ?? ''; document.querySelector('meta[name="stripe-account-id"]') ? .content ? ? '';
new ProcessSEPA(publishableKey, stripeConnect).setupStripe().handle(); new ProcessSEPA(publishableKey, stripeConnect).setupStripe().handle();

View File

@ -6,6 +6,8 @@
<meta name="amount" content="{{ $stripe_amount }}"> <meta name="amount" content="{{ $stripe_amount }}">
<meta name="country" content="{{ $country }}"> <meta name="country" content="{{ $country }}">
<meta name="customer" content="{{ $customer }}"> <meta name="customer" content="{{ $customer }}">
<meta name="client_name" content="{{ $client->present()->name() }}">
<meta name="client_email" content="{{ $client->present()->email() }}">
<meta name="pi-client-secret" content="{{ $pi_client_secret }}"> <meta name="pi-client-secret" content="{{ $pi_client_secret }}">
<meta name="si-client-secret" content="{{ $si_client_secret ?? '' }}"> <meta name="si-client-secret" content="{{ $si_client_secret ?? '' }}">