From 481859bc8f39b236fd03132d36bf74cb7372f081 Mon Sep 17 00:00:00 2001 From: nymkappa <1612910616@pm.me> Date: Thu, 25 Jul 2024 15:54:24 +0200 Subject: [PATCH] [accelerator] add support for Google Pay payment --- .../accelerate-checkout.component.html | 16 ++- .../accelerate-checkout.component.ts | 132 ++++++++++++++++-- .../src/app/services/services-api.service.ts | 4 + frontend/src/resources/google-pay.png | Bin 0 -> 34146 bytes 4 files changed, 138 insertions(+), 14 deletions(-) create mode 100644 frontend/src/resources/google-pay.png diff --git a/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.html b/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.html index 82391dc89..04b76055c 100644 --- a/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.html +++ b/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.html @@ -389,13 +389,13 @@ } - @if (canPayWithCashapp || canPayWithApplePay) { + @if (canPayWithCashapp || canPayWithApplePay || canPayWithGooglePay) {

OR

} } - @if (canPayWithCashapp || canPayWithApplePay) { + @if (canPayWithCashapp || canPayWithApplePay || canPayWithGooglePay) {

Pay  with

@if (canPayWithCashapp) { @@ -405,6 +405,10 @@ @if (canPayWithCashapp) {
} } + @if (canPayWithGooglePay) { + @if (canPayWithCashapp || canPayWithApplePay) {
} + + }
} @@ -427,7 +431,7 @@ - } @else if (step === 'cashapp' || step === 'applepay') { + } @else if (step === 'cashapp' || step === 'applepay' || step === 'googlepay') {
@@ -443,7 +447,7 @@
- @if (step === 'cashapp' && !loadingCashapp || step === 'applepay' && !loadingApplePay) { + @if (step === 'cashapp' && !loadingCashapp || step === 'applepay' && !loadingApplePay || step === 'googlepay' && !loadingGooglePay) {
@@ -466,8 +470,10 @@
} @else if (step === 'cashapp') {
+ } @else if (step === 'googlepay') { +
} - @if (loadingCashapp || loadingApplePay) { + @if (loadingCashapp || loadingApplePay || loadingGooglePay) {
Loading payment method...
diff --git a/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.ts b/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.ts index 71c46e2da..f2a2e6e7c 100644 --- a/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.ts +++ b/frontend/src/app/components/accelerate-checkout/accelerate-checkout.component.ts @@ -47,7 +47,7 @@ export const MIN_BID_RATIO = 1; export const DEFAULT_BID_RATIO = 2; export const MAX_BID_RATIO = 4; -type CheckoutStep = 'quote' | 'summary' | 'checkout' | 'cashapp' | 'applepay' | 'processing' | 'paid' | 'success'; +type CheckoutStep = 'quote' | 'summary' | 'checkout' | 'cashapp' | 'applepay' | 'googlepay' | 'processing' | 'paid' | 'success'; @Component({ selector: 'app-accelerate-checkout', @@ -62,6 +62,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy { @Input() scrollEvent: boolean; @Input() cashappEnabled: boolean = true; @Input() applePayEnabled: boolean = false; + @Input() googlePayEnabled: boolean = true; @Input() advancedEnabled: boolean = false; @Input() forceMobile: boolean = false; @Input() showDetails: boolean = false; @@ -83,7 +84,6 @@ export class AccelerateCheckout implements OnInit, OnDestroy { private _step: CheckoutStep = 'summary'; simpleMode: boolean = true; - paymentMethod: 'cashapp' | 'btcpay'; timeoutTimer: any; authSubscription$: Subscription; @@ -112,11 +112,13 @@ export class AccelerateCheckout implements OnInit, OnDestroy { // square loadingCashapp = false; loadingApplePay = false; + loadingGooglePay = false; cashappError = false; cashappSubmit: any; payments: any; cashAppPay: any; applePay: any; + googlePay: any; conversionsSubscription: Subscription; conversions: any; @@ -228,6 +230,11 @@ export class AccelerateCheckout implements OnInit, OnDestroy { this.insertSquare(); this.setupSquare(); this.scrollToElementWithTimeout('confirm-title', 'center', 100); + } else if (this._step === 'googlepay' && this.googlePayEnabled) { + this.loadingGooglePay = true; + this.insertSquare(); + this.setupSquare(); + this.scrollToElementWithTimeout('confirm-title', 'center', 100); } else if (this._step === 'paid') { this.timePaid = Date.now(); this.timeoutTimer = setTimeout(() => { @@ -443,6 +450,8 @@ export class AccelerateCheckout implements OnInit, OnDestroy { await this.requestCashAppPayment(); } else if (this._step === 'applepay') { await this.requestApplePayPayment(); + } else if (this._step === 'googlepay') { + await this.requestGooglePayPayment(); } } catch (e) { console.debug('Error loading Square Payments', e); @@ -541,6 +550,92 @@ export class AccelerateCheckout implements OnInit, OnDestroy { ); } + /** + * GOOGLE PAY + */ + async requestGooglePayPayment() { + if (this.conversionsSubscription) { + this.conversionsSubscription.unsubscribe(); + } + + this.conversionsSubscription = this.stateService.conversions$.subscribe( + async (conversions) => { + this.conversions = conversions; + if (this.googlePay) { + this.googlePay.destroy(); + } + + const costUSD = this.cost / 100_000_000 * conversions.USD; + const paymentRequest = this.payments.paymentRequest({ + countryCode: 'US', + currencyCode: 'USD', + total: { + amount: costUSD.toFixed(2), + label: 'Total' + } + }); + this.googlePay = await this.payments.googlePay(paymentRequest , { + referenceId: `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}`, + }); + + await this.googlePay.attach(`#google-pay-button`, { + buttonType: 'pay', + onClick: (e) => { console.log(e, 'hi') } + }); + this.loadingGooglePay = false; + + document.getElementById('google-pay-button').addEventListener('click', async event => { + event.preventDefault(); + const tokenResult = await this.googlePay.tokenize(); + if (tokenResult?.status === 'OK') { + const card = tokenResult.details?.card; + if (!card || !card.brand || !card.expMonth || !card.expYear || !card.last4) { + console.error(`Cannot retreive payment card details`); + this.accelerateError = 'apple_pay_no_card_details'; + return; + } + const cardTag = md5(`${card.brand}${card.expMonth}${card.expYear}${card.last4}`.toLowerCase()); + this.servicesApiService.accelerateWithGooglePay$( + this.tx.txid, + tokenResult.token, + cardTag, + `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}`, + this.accelerationUUID + ).subscribe({ + next: () => { + this.audioService.playSound('ascend-chime-cartoon'); + if (this.googlePay) { + this.googlePay.destroy(); + } + setTimeout(() => { + this.moveToStep('paid'); + }, 1000); + }, + error: (response) => { + this.accelerateError = response.error; + if (!(response.status === 403 && response.error === 'not_available')) { + setTimeout(() => { + // Reset everything by reloading the page :D, can be improved + const urlParams = new URLSearchParams(window.location.search); + window.location.assign(window.location.toString().replace(`?cash_request_id=${urlParams.get('cash_request_id')}`, ``)); + }, 3000); + } + } + }); + } else { + let errorMessage = `Tokenization failed with status: ${tokenResult.status}`; + if (tokenResult.errors) { + errorMessage += ` and errors: ${JSON.stringify( + tokenResult.errors, + )}`; + } + throw new Error(errorMessage); + } + }); + } + ); + } + /** * CASHAPP */ @@ -566,18 +661,14 @@ export class AccelerateCheckout implements OnInit, OnDestroy { label: 'Total', pending: true, productUrl: `${redirectHostname}/tracker/${this.tx.txid}`, - }, - button: { shape: 'semiround', size: 'small', theme: 'light'} + } }); this.cashAppPay = await this.payments.cashAppPay(paymentRequest, { redirectURL: `${redirectHostname}/tracker/${this.tx.txid}`, - referenceId: `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}`, - button: { shape: 'semiround', size: 'small', theme: 'light'} + referenceId: `accelerator-${this.tx.txid.substring(0, 15)}-${Math.round(new Date().getTime() / 1000)}` }); - if (this.step === 'cashapp') { - await this.cashAppPay.attach(`#cash-app-pay`, { theme: 'light', size: 'small', shape: 'semiround' }) - } + await this.cashAppPay.attach(`#cash-app-pay`, { theme: 'light', size: 'small', shape: 'semiround' }) this.loadingCashapp = false; this.cashAppPay.addEventListener('ontokenization', event => { @@ -686,6 +777,13 @@ export class AccelerateCheckout implements OnInit, OnDestroy { return !!this.estimate?.availablePaymentMethods?.applePay; } + get couldPayWithGooglePay() { + if (!this.googlePayEnabled) { + return false; + } + return !!this.estimate?.availablePaymentMethods?.googlePay; + } + get couldPayWithBalance() { if (!this.hasAccessToBalanceMode) { return false; @@ -734,6 +832,22 @@ export class AccelerateCheckout implements OnInit, OnDestroy { return false; } + get canPayWithGooglePay() { + if (!this.googlePayEnabled || !this.conversions) { + return false; + } + + const paymentMethod = this.estimate?.availablePaymentMethods?.googlePay; + if (paymentMethod) { + const costUSD = (this.cost / 100_000_000 * this.conversions.USD); + if (costUSD >= paymentMethod.min && costUSD <= paymentMethod.max) { + return true; + } + } + + return false; + } + get canPayWithBalance() { if (!this.hasAccessToBalanceMode) { return false; diff --git a/frontend/src/app/services/services-api.service.ts b/frontend/src/app/services/services-api.service.ts index c26075198..919fc72da 100644 --- a/frontend/src/app/services/services-api.service.ts +++ b/frontend/src/app/services/services-api.service.ts @@ -141,6 +141,10 @@ export class ServicesApiServices { return this.httpClient.post(`${this.stateService.env.SERVICES_API}/accelerator/accelerate/applePay`, { txInput: txInput, cardTag: cardTag, token: token, referenceId: referenceId, accelerationUUID: accelerationUUID }); } + accelerateWithGooglePay$(txInput: string, token: string, cardTag: string, referenceId: string, accelerationUUID: string) { + return this.httpClient.post(`${this.stateService.env.SERVICES_API}/accelerator/accelerate/googlePay`, { txInput: txInput, cardTag: cardTag, token: token, referenceId: referenceId, accelerationUUID: accelerationUUID }); + } + getAccelerations$(): Observable { return this.httpClient.get(`${this.stateService.env.SERVICES_API}/accelerator/accelerations`); } diff --git a/frontend/src/resources/google-pay.png b/frontend/src/resources/google-pay.png new file mode 100644 index 0000000000000000000000000000000000000000..77b6a6574c925d5cd2f408b78993452263e17a8a GIT binary patch literal 34146 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 aBf{IdzfRh8_SnG4AxMhKeJ&B!|NcKUOg29N literal 0 HcmV?d00001