mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Merge pull request #7232 from turbo124/v5-develop
Fixes for SEPA token billing
This commit is contained in:
commit
3bd003bc9a
@ -13,6 +13,7 @@ namespace App\Console\Commands;
|
||||
|
||||
use App;
|
||||
use App\Factory\ClientContactFactory;
|
||||
use App\Factory\VendorContactFactory;
|
||||
use App\Models\Account;
|
||||
use App\Models\Client;
|
||||
use App\Models\ClientContact;
|
||||
@ -72,7 +73,7 @@ class CheckData extends Command
|
||||
/**
|
||||
* @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
|
||||
@ -112,6 +113,7 @@ class CheckData extends Command
|
||||
$this->checkClientBalances();
|
||||
|
||||
$this->checkContacts();
|
||||
$this->checkVendorContacts();
|
||||
$this->checkEntityInvitations();
|
||||
$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()
|
||||
{
|
||||
if (config('ninja.testvars.travis')) {
|
||||
|
@ -168,10 +168,10 @@ class CreateEntityPdf implements ShouldQueue
|
||||
]),
|
||||
'variables' => $variables,
|
||||
'options' => [
|
||||
'all_pages_header' => $this->client->getSetting('all_pages_header'),
|
||||
'all_pages_footer' => $this->client->getSetting('all_pages_footer'),
|
||||
'all_pages_header' => $this->entity->client->getSetting('all_pages_header'),
|
||||
'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);
|
||||
|
@ -149,6 +149,7 @@ class Gateway extends StaticModel
|
||||
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::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;
|
||||
case 57:
|
||||
|
@ -47,7 +47,7 @@ class SEPA
|
||||
$data['country'] = $this->stripe->client->country->iso_3166_2;
|
||||
$data['payment_hash'] = $this->stripe->payment_hash->hash;
|
||||
|
||||
$intent = \Stripe\PaymentIntent::create([
|
||||
$intent_data = [
|
||||
'amount' => $data['stripe_amount'],
|
||||
'currency' => 'eur',
|
||||
'payment_method_types' => ['sepa_debit'],
|
||||
@ -58,19 +58,12 @@ class SEPA
|
||||
'payment_hash' => $this->stripe->payment_hash->hash,
|
||||
'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;
|
||||
|
||||
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->save();
|
||||
|
||||
|
@ -263,9 +263,7 @@ class Helpers
|
||||
}
|
||||
|
||||
return $value;
|
||||
|
||||
// $x = str_replace(["\n", "<br>"], ["\r", "<br>"], $value);
|
||||
|
||||
// return $x;
|
||||
}
|
||||
|
||||
|
2
public/js/clients/payments/stripe-sepa.js
vendored
2
public/js/clients/payments/stripe-sepa.js
vendored
@ -1,2 +1,2 @@
|
||||
/*! 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()})();
|
@ -27,7 +27,7 @@
|
||||
"/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/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/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",
|
||||
|
76
resources/js/clients/payments/stripe-sepa.js
vendored
76
resources/js/clients/payments/stripe-sepa.js
vendored
@ -17,26 +17,21 @@ class ProcessSEPA {
|
||||
|
||||
setupStripe = () => {
|
||||
|
||||
if (this.stripeConnect){
|
||||
// this.stripe.stripeAccount = this.stripeConnect;
|
||||
if (this.stripeConnect) {
|
||||
|
||||
this.stripe = Stripe(this.key, {
|
||||
stripeAccount: this.stripeConnect,
|
||||
});
|
||||
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.stripe = Stripe(this.key);
|
||||
}
|
||||
|
||||
|
||||
|
||||
const elements = this.stripe.elements();
|
||||
var style = {
|
||||
base: {
|
||||
color: '#32325d',
|
||||
fontFamily:
|
||||
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
|
||||
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
|
||||
fontSmoothing: 'antialiased',
|
||||
fontSize: '16px',
|
||||
'::placeholder': {
|
||||
@ -65,6 +60,10 @@ class ProcessSEPA {
|
||||
};
|
||||
this.iban = elements.create('iban', options);
|
||||
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;
|
||||
};
|
||||
|
||||
@ -97,51 +96,31 @@ class ProcessSEPA {
|
||||
});
|
||||
|
||||
document.getElementById('pay-now').addEventListener('click', (e) => {
|
||||
if (
|
||||
document.querySelector('input[name=token]').value.length !== 0
|
||||
) {
|
||||
document.querySelector('#errors').hidden = true;
|
||||
|
||||
console.log(document.querySelector('input[name=token]').value);
|
||||
|
||||
if (document.querySelector('input[name=token]').value.length !== 0) {
|
||||
|
||||
document.getElementById('pay-now').disabled = true;
|
||||
document
|
||||
.querySelector('#pay-now > svg')
|
||||
.classList.remove('hidden');
|
||||
document
|
||||
.querySelector('#pay-now > span')
|
||||
.classList.add('hidden');
|
||||
document.querySelector('#pay-now > svg').classList.remove('hidden');
|
||||
document.querySelector('#pay-now > span').classList.add('hidden');
|
||||
|
||||
this.stripe
|
||||
.confirmSepaDebitSetup(
|
||||
document.querySelector('meta[name=si-client-secret')
|
||||
.content,
|
||||
{
|
||||
payment_method: document.querySelector(
|
||||
'input[name=token]'
|
||||
).value,
|
||||
.confirmSepaDebitPayment(
|
||||
document.querySelector('meta[name=pi-client-secret')
|
||||
.content, {
|
||||
payment_method: document.querySelector('input[name=token]').value
|
||||
}
|
||||
)
|
||||
.then((result) => {
|
||||
if (result.error) {
|
||||
console.error(error);
|
||||
|
||||
return;
|
||||
return this.handleFailure(result.error.message);
|
||||
}
|
||||
|
||||
document.querySelector(
|
||||
'input[name="gateway_response"]'
|
||||
).value = JSON.stringify(result.setupIntent);
|
||||
|
||||
return document
|
||||
.querySelector('#server-response')
|
||||
.submit();
|
||||
})
|
||||
.catch((error) => {
|
||||
errors.textContent = error;
|
||||
errors.hidden = false;
|
||||
return this.handleSuccess(result);
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (document.getElementById('sepa-name').value === '') {
|
||||
document.getElementById('sepa-name').focus();
|
||||
@ -166,19 +145,21 @@ class ProcessSEPA {
|
||||
'meta[name=translation-terms-required]'
|
||||
).content;
|
||||
errors.hidden = false;
|
||||
console.log('Terms');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
document.getElementById('pay-now').disabled = true;
|
||||
document.querySelector('#pay-now > svg').classList.remove('hidden');
|
||||
document.querySelector('#pay-now > span').classList.add('hidden');
|
||||
|
||||
|
||||
|
||||
this.stripe
|
||||
.confirmSepaDebitPayment(
|
||||
document.querySelector('meta[name=pi-client-secret')
|
||||
.content,
|
||||
{
|
||||
.content, {
|
||||
payment_method: {
|
||||
sepa_debit: this.iban,
|
||||
billing_details: {
|
||||
@ -198,6 +179,9 @@ class ProcessSEPA {
|
||||
|
||||
return this.handleSuccess(result);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
@ -232,10 +216,10 @@ class ProcessSEPA {
|
||||
}
|
||||
|
||||
const publishableKey =
|
||||
document.querySelector('meta[name="stripe-publishable-key"]')?.content ??
|
||||
document.querySelector('meta[name="stripe-publishable-key"]') ? .content ? ?
|
||||
'';
|
||||
|
||||
const stripeConnect =
|
||||
document.querySelector('meta[name="stripe-account-id"]')?.content ?? '';
|
||||
document.querySelector('meta[name="stripe-account-id"]') ? .content ? ? '';
|
||||
|
||||
new ProcessSEPA(publishableKey, stripeConnect).setupStripe().handle();
|
||||
|
@ -6,6 +6,8 @@
|
||||
<meta name="amount" content="{{ $stripe_amount }}">
|
||||
<meta name="country" content="{{ $country }}">
|
||||
<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="si-client-secret" content="{{ $si_client_secret ?? '' }}">
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user