1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-14 07:02:34 +01:00
invoiceninja/resources/js/clients/payments/process.js
Benjamin Beganović e93bdffc0b
Fixes for Stripe payments (#3542)
* Payment fixes:
- Added new "process.js" inside of webpack.mix.js
- BasePaymentDriver now accepts raw array, no explode
- StripePaymentDriver now accepts raw array, no explode
- Removed 'form-control' class from #card-element
- New credit_card for processing payment

* Production build of assets
2020-03-26 00:08:37 +11:00

124 lines
3.3 KiB
JavaScript
Vendored

/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
class ProcessStripePayment {
constructor(key, usingToken) {
this.key = key;
this.usingToken = usingToken;
}
setupStripe() {
this.stripe = Stripe(this.key);
this.elements = this.stripe.elements();
return this;
}
createElement() {
this.cardElement = this.elements.create("card");
return this;
}
mountCardElement() {
this.cardElement.mount("#card-element");
return this;
}
completePaymentUsingToken() {
let payNowButton = document.getElementById("pay-now-with-token");
this.stripe
.handleCardPayment(payNowButton.dataset.secret, {
payment_method: payNowButton.dataset.token
})
.then(result => {
if (result.error) {
return this.handleFailure(result.error.message);
}
return this.handleSuccess(result);
});
}
completePaymentWithoutToken() {
let payNowButton = document.getElementById("pay-now");
let cardHolderName = document.getElementById("cardholder-name");
this.stripe
.handleCardPayment(payNowButton.dataset.secret, this.cardElement, {
payment_method_data: {
billing_details: { name: cardHolderName.value }
}
})
.then(result => {
if (result.error) {
return this.handleFailure(result.error.message);
}
return this.handleSuccess(result);
});
}
handleSuccess(result) {
document.querySelector(
'input[name="gateway_response"]'
).value = JSON.stringify(result.paymentIntent);
let tokenBillingCheckbox = document.querySelector(
'input[name="token-billing-checkbox"]'
);
if (tokenBillingCheckbox) {
document.querySelector('input[name="store_card"]').value =
tokenBillingCheckbox.checked;
}
document.getElementById("server-response").submit();
}
handleFailure(message) {
let errors = document.getElementById("errors");
errors.textContent = "";
errors.textContent = message;
errors.hidden = false;
}
handle() {
this.setupStripe();
if (this.usingToken) {
document
.getElementById("pay-now-with-token")
.addEventListener("click", () => {
return this.completePaymentUsingToken();
});
}
if (!this.usingToken) {
this.createElement().mountCardElement();
document.getElementById("pay-now").addEventListener("click", () => {
return this.completePaymentWithoutToken();
});
}
}
}
const publishableKey = document.querySelector(
'meta[name="stripe-publishable-key"]'
).content;
const usingToken = document.querySelector('meta[name="using-token"]').content;
new ProcessStripePayment(publishableKey, usingToken).handle();