diff --git a/packages/identity/CapacitorCommunityStripeIdentity.podspec b/packages/identity/CapacitorCommunityStripeIdentity.podspec index 8944b942..54ea2756 100644 --- a/packages/identity/CapacitorCommunityStripeIdentity.podspec +++ b/packages/identity/CapacitorCommunityStripeIdentity.podspec @@ -13,6 +13,6 @@ Pod::Spec.new do |s| s.source_files = 'ios/Sources/**/*.{swift,h,m,c,cc,mm,cpp}' s.ios.deployment_target = '14.0' s.dependency 'Capacitor' - s.dependency 'StripeIdentity', '~> 24.1.0' + s.dependency 'StripeIdentity', '~> 24.4.1' s.swift_version = '5.1' end diff --git a/packages/identity/android/build.gradle b/packages/identity/android/build.gradle index fe80d0ad..6df78dc1 100644 --- a/packages/identity/android/build.gradle +++ b/packages/identity/android/build.gradle @@ -5,7 +5,7 @@ ext { androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.6.1' playServicesWalletVersion = project.hasProperty('playServicesWalletVersion') ? rootProject.ext.playServicesWalletVersion : '19.2.+' - identityVersion = project.hasProperty('identityVersion') ? rootProject.ext.identityVersion : '21.2.+' + identityVersion = project.hasProperty('identityVersion') ? rootProject.ext.identityVersion : '21.4.+' } buildscript { diff --git a/packages/identity/package-lock.json b/packages/identity/package-lock.json index eb76eed9..61b19121 100644 --- a/packages/identity/package-lock.json +++ b/packages/identity/package-lock.json @@ -28,7 +28,7 @@ "typescript": "~4.1.5" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "@capacitor/core": ">=7.0.0" diff --git a/packages/payment/CapacitorCommunityStripe.podspec b/packages/payment/CapacitorCommunityStripe.podspec index b35946c6..52063891 100644 --- a/packages/payment/CapacitorCommunityStripe.podspec +++ b/packages/payment/CapacitorCommunityStripe.podspec @@ -13,7 +13,7 @@ Pod::Spec.new do |s| s.source_files = 'ios/Sources/**/*.{swift,h,m,c,cc,mm,cpp}' s.ios.deployment_target = '14.0' s.dependency 'Capacitor' - s.dependency 'StripePaymentSheet', '~> 24.1.0' - s.dependency 'StripeApplePay', '~> 24.1.0' + s.dependency 'StripePaymentSheet', '~> 24.4.1' + s.dependency 'StripeApplePay', '~> 24.4.1' s.swift_version = '5.1' end diff --git a/packages/payment/android/build.gradle b/packages/payment/android/build.gradle index 5e96bcdd..0a2e6562 100644 --- a/packages/payment/android/build.gradle +++ b/packages/payment/android/build.gradle @@ -5,7 +5,7 @@ ext { androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.6.1' playServicesWalletVersion = project.hasProperty('playServicesWalletVersion') ? rootProject.ext.playServicesWalletVersion : '19.2.+' - stripeAndroidVersion = project.hasProperty('stripeAndroidVersion') ? rootProject.ext.stripeAndroidVersion : '21.2.+' + stripeAndroidVersion = project.hasProperty('stripeAndroidVersion') ? rootProject.ext.stripeAndroidVersion : '21.4.+' gsonVersion = project.hasProperty('gsonVersion') ? rootProject.ext.gsonVersion : '2.10.+' } diff --git a/packages/payment/package-lock.json b/packages/payment/package-lock.json index 5a85ca83..80c1b211 100644 --- a/packages/payment/package-lock.json +++ b/packages/payment/package-lock.json @@ -27,7 +27,7 @@ "typescript": "~4.1.5" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "@capacitor/core": ">=7.0.0", diff --git a/packages/terminal/README.md b/packages/terminal/README.md index dd503bcf..7f1d5c0c 100644 --- a/packages/terminal/README.md +++ b/packages/terminal/README.md @@ -65,6 +65,10 @@ And update minSdkVersion to 26 And compileSdkVersion to 34 in your `android/app/ + minSdkVersion = 30 ``` +If you are developing apps for Stripe Android devices (e.g. Stripe Reader S700), follow the Stripe's documentation for the client-side setup. +- [Stripe - Android configure your app](https://docs.stripe.com/terminal/features/apps-on-devices/build?terminal-sdk-platform=android&lang-android=java#setup-app) + + ## Usage ### Simple collect payment @@ -1030,6 +1034,7 @@ addListener(eventName: TerminalEventsEnum.ReaderReconnectFailed, listenerFunc: ( | **`Bluetooth`** | 'bluetooth' | | **`Usb`** | 'usb' | | **`TapToPay`** | 'tap-to-pay' | +| **`HandOff`** | 'hand-off' | #### SimulateReaderUpdate diff --git a/packages/terminal/android/build.gradle b/packages/terminal/android/build.gradle index 4819a585..65b57d19 100644 --- a/packages/terminal/android/build.gradle +++ b/packages/terminal/android/build.gradle @@ -8,6 +8,7 @@ ext { volleyVersion = project.hasProperty('volleyVersion') ? rootProject.ext.volleyVersion : '1.2.1' stripeterminalTapToPayVersion = project.hasProperty('stripeterminalTapToPayVersion') ? rootProject.ext.stripeterminalTapToPayVersion : '4.1.0' stripeterminalCoreVersion = project.hasProperty('stripeterminalCoreVersion') ? rootProject.ext.stripeterminalCoreVersion : '4.1.0' + stripeterminalHandoffClientVersion = project.hasProperty('stripeterminalHandoffClientVersion') ? rootProject.ext.stripeterminalHandoffClientVersion : '4.1.0' } buildscript { @@ -71,6 +72,7 @@ dependencies { implementation "com.stripe:stripeterminal-core:$stripeterminalCoreVersion" implementation "com.stripe:stripeterminal-taptopay:$stripeterminalTapToPayVersion" + implementation "com.stripe:stripeterminal-handoffclient:$stripeterminalHandoffClientVersion" implementation "com.android.volley:volley:$volleyVersion" implementation "com.google.android.gms:play-services-wallet:$playServicesWalletVersion" } diff --git a/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.kt b/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.kt index d06fcfdc..0dbee971 100644 --- a/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.kt +++ b/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/StripeTerminal.kt @@ -29,6 +29,7 @@ import com.stripe.stripeterminal.external.callable.PaymentIntentCallback import com.stripe.stripeterminal.external.callable.ReaderCallback import com.stripe.stripeterminal.external.callable.TapToPayReaderListener import com.stripe.stripeterminal.external.callable.TerminalListener +import com.stripe.stripeterminal.external.callable.HandoffReaderListener import com.stripe.stripeterminal.external.models.BatteryStatus import com.stripe.stripeterminal.external.models.CardPresentDetails import com.stripe.stripeterminal.external.models.Cart @@ -194,6 +195,9 @@ class StripeTerminal( ) { config = DiscoveryConfiguration.BluetoothDiscoveryConfiguration(0, this.isTest!!) this.terminalConnectType = TerminalConnectTypes.Bluetooth + } else if (call.getString("type") == TerminalConnectTypes.HandOff.webEventName) { + config = DiscoveryConfiguration.HandoffDiscoveryConfiguration() + this.terminalConnectType = TerminalConnectTypes.HandOff } else { call.unimplemented(call.getString("type") + " is not support now") return @@ -240,6 +244,8 @@ class StripeTerminal( this.connectUsbReader(call) } else if (this.terminalConnectType == TerminalConnectTypes.Bluetooth) { this.connectBluetoothReader(call) + } else if (this.terminalConnectType == TerminalConnectTypes.HandOff) { + this.connectHandOffReader(call) } else { call.reject("type is not defined.") } @@ -440,6 +446,39 @@ class StripeTerminal( Terminal.getInstance().connectReader(foundReader, config, this.readerCallback(call)) } + private fun connectHandOffReader(call: PluginCall) { + val reader = call.getObject("reader") + val serialNumber = reader.getString("serialNumber") + val foundReader = this.discoveredReadersList.firstOrNull() + + if (serialNumber == null || foundReader == null) { + call.reject("The reader value is not set correctly.") + return + } + + val config: ConnectionConfiguration.HandoffConnectionConfiguration = ConnectionConfiguration.HandoffConnectionConfiguration( + this.handoffReaderListener + ) + + Terminal.getInstance().connectReader(foundReader, config, this.readerCallback(call)) + } + + var handoffReaderListener: HandoffReaderListener = object : HandoffReaderListener { + override fun onDisconnect(reason: DisconnectReason) { + notifyListeners( + TerminalEnumEvent.DisconnectedReader.webEventName, + JSObject().put("reason", reason.toString()) + ) + } + + override fun onReportReaderEvent(event: ReaderEvent) { + notifyListeners( + TerminalEnumEvent.ReaderEvent.webEventName, + JSObject().put("event", event.toString()) + ) + } + } + fun cancelDiscoverReaders(call: PluginCall) { if (discoveryCancelable == null || discoveryCancelable!!.isCompleted) { call.resolve() diff --git a/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/TerminalConnectTypes.kt b/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/TerminalConnectTypes.kt index fbf712b2..51429312 100644 --- a/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/TerminalConnectTypes.kt +++ b/packages/terminal/android/src/main/java/com/getcapacitor/community/stripe/terminal/TerminalConnectTypes.kt @@ -6,4 +6,5 @@ enum class TerminalConnectTypes(val webEventName: String) { Bluetooth("bluetooth"), Usb("usb"), TapToPay("tap-to-pay"), + HandOff("hand-off"), } diff --git a/packages/terminal/package-lock.json b/packages/terminal/package-lock.json index c2522b7b..a852b2a9 100644 --- a/packages/terminal/package-lock.json +++ b/packages/terminal/package-lock.json @@ -28,7 +28,7 @@ "typescript": "~4.1.5" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" }, "peerDependencies": { "@capacitor/core": ">=7.0.0" diff --git a/packages/terminal/src/stripe.enum.ts b/packages/terminal/src/stripe.enum.ts index bf5c601f..909e525d 100644 --- a/packages/terminal/src/stripe.enum.ts +++ b/packages/terminal/src/stripe.enum.ts @@ -4,6 +4,7 @@ export enum TerminalConnectTypes { Bluetooth = 'bluetooth', Usb = 'usb', TapToPay = 'tap-to-pay', + HandOff = 'hand-off', } /**