From 9c70c000ed98fe398c985d6a0c22c76dfe7ae57f Mon Sep 17 00:00:00 2001 From: dasanor Date: Tue, 4 Feb 2025 12:32:21 +0100 Subject: [PATCH] feat(payments): add support for Swish --- enabler/dev-utils/session.js | 1 + enabler/index.html | 2 +- .../src/components/payment-methods/swish.ts | 53 +++++++++++++++++++ enabler/src/dropin/dropin-embedded.ts | 2 + .../payment-enabler/adyen-payment-enabler.ts | 2 + .../src/payment-enabler/payment-enabler.ts | 1 + processor/src/config/payment-method.config.ts | 3 ++ .../payment-components.converter.ts | 3 ++ .../services/adyen-payment.service.spec.ts | 5 +- 9 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 enabler/src/components/payment-methods/swish.ts diff --git a/enabler/dev-utils/session.js b/enabler/dev-utils/session.js index 8f97de1..9aabc76 100644 --- a/enabler/dev-utils/session.js +++ b/enabler/dev-utils/session.js @@ -60,6 +60,7 @@ const getSessionId = async (cartId, isDropin = false) => { "paypal", "przelewy24", "sepadirectdebit", + "swish", "twint", ], // add here your allowed methods for development purposes }), diff --git a/enabler/index.html b/enabler/index.html index 34528f2..699a3b6 100644 --- a/enabler/index.html +++ b/enabler/index.html @@ -184,7 +184,7 @@

Dev Site

}); if (builder.componentHasSubmit) { - const methodsRequireMounting = ['bancontactcard', 'bancontactmobile', 'blik', 'card', 'eps', 'ideal', 'klarna_billie', 'klarna_pay_later', 'klarna_pay_now', 'klarna_pay_overtime', 'przelewy24','sepadirectdebit', 'twint']; + const methodsRequireMounting = ['bancontactcard', 'bancontactmobile', 'blik', 'card', 'eps', 'ideal', 'klarna_billie', 'klarna_pay_later', 'klarna_pay_now', 'klarna_pay_overtime', 'przelewy24','sepadirectdebit', 'swish', 'twint']; const isAvailable = await component.isAvailable(); if (isAvailable && methodsRequireMounting.includes(selectedValue)) { component.mount("#container--external"); diff --git a/enabler/src/components/payment-methods/swish.ts b/enabler/src/components/payment-methods/swish.ts new file mode 100644 index 0000000..f4cb59b --- /dev/null +++ b/enabler/src/components/payment-methods/swish.ts @@ -0,0 +1,53 @@ +import { ComponentOptions, PaymentComponent, PaymentMethod } from "../../payment-enabler/payment-enabler"; +import { AdyenBaseComponentBuilder, DefaultAdyenComponent } from "../base"; +import { BaseOptions } from "../../payment-enabler/adyen-payment-enabler"; +import { Swish, ICore } from "@adyen/adyen-web"; +/** + * Swish component + * + * Configuration options: + * https://docs.adyen.com/payment-methods/swish/web-component/ + */ +export class SwishBuilder extends AdyenBaseComponentBuilder { + constructor(baseOptions: BaseOptions) { + super(PaymentMethod.swish, baseOptions); + } + + build(config: ComponentOptions): PaymentComponent { + const swishComponent = new SwishComponent({ + paymentMethod: this.paymentMethod, + adyenCheckout: this.adyenCheckout, + componentOptions: config, + sessionId: this.sessionId, + processorUrl: this.processorUrl, + }); + swishComponent.init(); + return swishComponent; + } +} + +export class SwishComponent extends DefaultAdyenComponent { + constructor(opts: { + paymentMethod: PaymentMethod; + adyenCheckout: ICore; + componentOptions: ComponentOptions; + sessionId: string; + processorUrl: string; + }) { + super(opts); + } + + init(): void { + this.component = new Swish(this.adyenCheckout, { + showPayButton: this.componentOptions.showPayButton, + }); + } + + showValidation() { + this.component.showValidation(); + } + + isValid() { + return this.component.isValid; + } +} diff --git a/enabler/src/dropin/dropin-embedded.ts b/enabler/src/dropin/dropin-embedded.ts index b567c10..04bd503 100644 --- a/enabler/src/dropin/dropin-embedded.ts +++ b/enabler/src/dropin/dropin-embedded.ts @@ -18,6 +18,7 @@ import { EPS, Blik, OnlineBankingPL, + Swish, } from "@adyen/adyen-web"; export class DropinEmbeddedBuilder implements PaymentDropinBuilder { @@ -80,6 +81,7 @@ export class DropinComponents implements DropinComponent { PayPal, Redirect, SepaDirectDebit, + Swish, Twint, ], paymentMethodsConfiguration: { diff --git a/enabler/src/payment-enabler/adyen-payment-enabler.ts b/enabler/src/payment-enabler/adyen-payment-enabler.ts index f5cb501..4a15f95 100644 --- a/enabler/src/payment-enabler/adyen-payment-enabler.ts +++ b/enabler/src/payment-enabler/adyen-payment-enabler.ts @@ -35,6 +35,7 @@ import { BancontactMobileBuilder } from "../components/payment-methods/bancontac import { KlarnaBillieBuilder } from "../components/payment-methods/klarna-billie"; import { BlikBuilder } from "../components/payment-methods/blik"; import { Przelewy24PLBuilder } from "../components/payment-methods/przelewy24"; +import { SwishBuilder } from "../components/payment-methods/swish"; class AdyenInitError extends Error { sessionId: string; @@ -234,6 +235,7 @@ export class AdyenPaymentEnabler implements PaymentEnabler { przelewy24: Przelewy24PLBuilder, paypal: PaypalBuilder, sepadirectdebit: SepaBuilder, + swish: SwishBuilder, twint: TwintBuilder, }; diff --git a/enabler/src/payment-enabler/payment-enabler.ts b/enabler/src/payment-enabler/payment-enabler.ts index ac02491..d52a967 100644 --- a/enabler/src/payment-enabler/payment-enabler.ts +++ b/enabler/src/payment-enabler/payment-enabler.ts @@ -45,6 +45,7 @@ export enum PaymentMethod { paypal = "paypal", przelewy24 = "przelewy24", sepadirectdebit = "sepadirectdebit", + swish = "swish", twint = "twint", } diff --git a/processor/src/config/payment-method.config.ts b/processor/src/config/payment-method.config.ts index 2d74f87..e09cafa 100644 --- a/processor/src/config/payment-method.config.ts +++ b/processor/src/config/payment-method.config.ts @@ -34,4 +34,7 @@ export const paymentMethodConfig: PaymentMethodConfig = { onlineBanking_PL: { supportSeparateCapture: false, }, + swish: { + supportSeparateCapture: false, + }, }; diff --git a/processor/src/services/converters/payment-components.converter.ts b/processor/src/services/converters/payment-components.converter.ts index 64a9a17..62f4cc1 100644 --- a/processor/src/services/converters/payment-components.converter.ts +++ b/processor/src/services/converters/payment-components.converter.ts @@ -54,6 +54,9 @@ export class PaymentComponentsConverter { { type: 'sepadirectdebit', }, + { + type: 'swish', + }, { type: 'twint', }, diff --git a/processor/test/services/adyen-payment.service.spec.ts b/processor/test/services/adyen-payment.service.spec.ts index 9cf991d..89c0d30 100644 --- a/processor/test/services/adyen-payment.service.spec.ts +++ b/processor/test/services/adyen-payment.service.spec.ts @@ -98,7 +98,7 @@ describe('adyen-payment.service', () => { test('getSupportedPaymentComponents', async () => { const result: SupportedPaymentComponentsSchemaDTO = await paymentService.getSupportedPaymentComponents(); - expect(result?.components).toHaveLength(16); + expect(result?.components).toHaveLength(17); expect(result?.components[0]?.type).toStrictEqual('applepay'); expect(result?.components[1]?.type).toStrictEqual('bancontactcard'); expect(result?.components[2]?.type).toStrictEqual('bancontactmobile'); @@ -114,7 +114,8 @@ describe('adyen-payment.service', () => { expect(result?.components[12]?.type).toStrictEqual('paypal'); expect(result?.components[13]?.type).toStrictEqual('przelewy24'); expect(result?.components[14]?.type).toStrictEqual('sepadirectdebit'); - expect(result?.components[15]?.type).toStrictEqual('twint'); + expect(result?.components[15]?.type).toStrictEqual('swish'); + expect(result?.components[16]?.type).toStrictEqual('twint'); }); test('getStatus', async () => {