@jimrising/easymerchantsdk-react-native 2.1.2 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/caches/deviceStreaming.xml +11 -0
- package/README.md +180 -119
- package/android/.settings/org.eclipse.buildship.core.prefs +2 -0
- package/android/build/.transforms/15b6a8a60a6b32d0dcaf609723cf365b/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/8508f1428f740032c45a43f48b1bbe1e/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$1$1.dex +0 -0
- package/android/build/.transforms/8508f1428f740032c45a43f48b1bbe1e/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$1.dex +0 -0
- package/android/build/.transforms/8508f1428f740032c45a43f48b1bbe1e/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule$2.dex +0 -0
- package/android/build/.transforms/8508f1428f740032c45a43f48b1bbe1e/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/reactlibrary/RNEasymerchantsdkModule.dex +0 -0
- package/android/build/.transforms/eef2d06269ef2e204b4f065513034fca/transformed/classes/classes_dex/classes.dex +0 -0
- package/android/build/.transforms/ffabb40f9809b32eb9546ce76fc51764/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule$1$1.dex +0 -0
- package/android/build/.transforms/ffabb40f9809b32eb9546ce76fc51764/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule$1.dex +0 -0
- package/android/build/.transforms/ffabb40f9809b32eb9546ce76fc51764/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule$2.dex +0 -0
- package/android/build/.transforms/ffabb40f9809b32eb9546ce76fc51764/transformed/bundleLibRuntimeToDirRelease/bundleLibRuntimeToDirRelease_dex/com/reactlibrary/RNEasymerchantsdkModule.dex +0 -0
- package/android/build/intermediates/aar_main_jar/release/syncReleaseLibJars/classes.jar +0 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/compile_library_classes_jar/release/bundleLibCompileToJarRelease/classes.jar +0 -0
- package/android/build/intermediates/full_jar/release/createFullJarRelease/full.jar +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -1
- package/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-dependencies.xml +4 -4
- package/android/build/intermediates/incremental/lintVitalAnalyzeRelease/release-artifact-libraries.xml +4 -4
- package/android/build/intermediates/incremental/release/mergeReleaseResources/compile-file-map.properties +1 -1
- package/android/build/intermediates/incremental/release/packageReleaseResources/compile-file-map.properties +1 -1
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$1$1.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$1.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
- package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$1$1.class +0 -0
- package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$1.class +0 -0
- package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
- package/android/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
- package/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/maven.google/androidx/constraintlayout/group-index.xml +1 -1
- package/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/maven.google/com/android/tools/build/group-index.xml +15 -15
- package/android/build/intermediates/lint-cache/lintVitalAnalyzeRelease/maven.google/com/google/android/material/group-index.xml +1 -1
- package/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-dependencies.xml +4 -4
- package/android/build/intermediates/lint_model/release/generateReleaseLintModel/release-artifact-libraries.xml +4 -4
- package/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-dependencies.xml +4 -4
- package/android/build/intermediates/lint_vital_lint_model/release/generateReleaseLintVitalModel/release-artifact-libraries.xml +4 -4
- package/android/build/intermediates/local_aar_for_lint/release/out.aar +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$1$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule$1$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/release/bundleLibRuntimeToDirRelease/com/reactlibrary/RNEasymerchantsdkModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/release/bundleLibRuntimeToJarRelease/classes.jar +0 -0
- package/android/build/outputs/aar/jimrising_easymerchantsdk-react-native-release.aar +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build/tmp/compileReleaseJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/reactlibrary/RNEasymerchantsdkModule.java +19 -5
- package/ios/easymerchantsdk.podspec +1 -1
- package/package.json +1 -1
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule$1$1.class.uniqueId1 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule$1.class.uniqueId0 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule$2.class.uniqueId3 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkModule.class.uniqueId2 +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/compileTransaction/stash-dir/RNEasymerchantsdkPackage.class.uniqueId4 +0 -0
|
@@ -741,6 +741,17 @@
|
|
|
741
741
|
<option name="screenX" value="1080" />
|
|
742
742
|
<option name="screenY" value="2424" />
|
|
743
743
|
</PersistentDeviceSelectionData>
|
|
744
|
+
<PersistentDeviceSelectionData>
|
|
745
|
+
<option name="api" value="36" />
|
|
746
|
+
<option name="brand" value="google" />
|
|
747
|
+
<option name="codename" value="tokay" />
|
|
748
|
+
<option name="id" value="tokay" />
|
|
749
|
+
<option name="manufacturer" value="Google" />
|
|
750
|
+
<option name="name" value="Pixel 9" />
|
|
751
|
+
<option name="screenDensity" value="420" />
|
|
752
|
+
<option name="screenX" value="1080" />
|
|
753
|
+
<option name="screenY" value="2424" />
|
|
754
|
+
</PersistentDeviceSelectionData>
|
|
744
755
|
<PersistentDeviceSelectionData>
|
|
745
756
|
<option name="api" value="34" />
|
|
746
757
|
<option name="brand" value="samsung" />
|
package/README.md
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
#
|
|
1
|
+
# EasyMerchant SDK React Native Integration
|
|
2
2
|
|
|
3
|
-
This guide provides step-by-step instructions
|
|
3
|
+
This guide provides step-by-step instructions for integrating the EasyMerchant SDK into a React Native application for Android and iOS platforms. The SDK supports identical configuration parameters for both platforms, with slight differences in method calls for initiating payments and handling responses. This project includes a sample implementation (`App.js`) that demonstrates a fully configurable payment interface with support for card payments, ACH transfers, recurring payments, 3D Secure authentication, and customizable billing/additional information fields.
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
7
|
-
- Node.js and npm installed
|
|
8
|
-
- React Native development environment
|
|
9
|
-
- Ruby 3.2.8
|
|
10
|
-
- Xcode
|
|
11
|
-
- Android Studio
|
|
7
|
+
- **Node.js and npm**: Ensure Node.js (v16 or higher) and npm are installed.
|
|
8
|
+
- **React Native Environment**: Set up a React Native development environment as per the [official documentation](https://reactnative.dev/docs/environment-setup).
|
|
9
|
+
- **Ruby**: Version 3.2.8 or higher for iOS setup (required for CocoaPods).
|
|
10
|
+
- **Xcode**: Version 14 or higher for iOS development.
|
|
11
|
+
- **Android Studio**: For Android development, with Gradle configured.
|
|
12
|
+
- **EasyMerchant SDK Credentials**: Obtain API keys and secret keys for `sandbox` and `staging` environments from your EasyMerchant account.
|
|
12
13
|
|
|
13
14
|
## Installation
|
|
14
15
|
|
|
15
16
|
### 1. Add the SDK to Your Project
|
|
16
17
|
|
|
17
|
-
Add the
|
|
18
|
+
Add the EasyMerchant SDK to your project by including it in your `package.json` under the `dependencies` section:
|
|
18
19
|
|
|
19
20
|
```json
|
|
20
21
|
"dependencies": {
|
|
21
|
-
"@jimrising/easymerchantsdk-react-native": "^2.1.
|
|
22
|
+
"@jimrising/easymerchantsdk-react-native": "^2.1.4"
|
|
22
23
|
}
|
|
23
24
|
```
|
|
24
25
|
|
|
25
|
-
Alternatively, install it using
|
|
26
|
+
Alternatively, install it using npm:
|
|
26
27
|
|
|
27
28
|
```bash
|
|
28
29
|
npm install @jimrising/easymerchantsdk-react-native
|
|
@@ -31,7 +32,7 @@ npm install @jimrising/easymerchantsdk-react-native
|
|
|
31
32
|
### 2. Android Configuration
|
|
32
33
|
|
|
33
34
|
1. Open the `android/build.gradle` file in your project.
|
|
34
|
-
2. Add the following
|
|
35
|
+
2. Add the following to the `allprojects.repositories` section to include the SDK's dependencies:
|
|
35
36
|
|
|
36
37
|
```gradle
|
|
37
38
|
allprojects {
|
|
@@ -50,12 +51,13 @@ allprojects {
|
|
|
50
51
|
}
|
|
51
52
|
```
|
|
52
53
|
|
|
53
|
-
3.
|
|
54
|
+
3. Ensure `GITHUB_URL`, `GITHUB_USERNAME`, and `GITHUB_PASSWORD` are defined in your `gradle.properties` file or provided via your CI/CD system.
|
|
55
|
+
4. Sync your project with Gradle to apply the changes.
|
|
54
56
|
|
|
55
57
|
### 3. iOS Configuration
|
|
56
58
|
|
|
57
59
|
1. **Update AppDelegate.swift**
|
|
58
|
-
|
|
60
|
+
Modify or create the `ios/AppDelegate.swift` file to initialize the React Native bridge and set up the EasyMerchant SDK:
|
|
59
61
|
|
|
60
62
|
```swift
|
|
61
63
|
import UIKit
|
|
@@ -90,7 +92,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|
|
90
92
|
|
|
91
93
|
let rootView = RCTRootView(
|
|
92
94
|
bridge: validBridge,
|
|
93
|
-
moduleName: "EasyMerchantTestApp", // Replace with your app name
|
|
95
|
+
moduleName: "EasyMerchantTestApp", // Replace with your app's module name
|
|
94
96
|
initialProperties: nil
|
|
95
97
|
)
|
|
96
98
|
|
|
@@ -111,7 +113,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|
|
111
113
|
```
|
|
112
114
|
|
|
113
115
|
2. **Update Podfile**
|
|
114
|
-
|
|
116
|
+
In your `ios/Podfile`, add the EasyMerchant SDK pod:
|
|
115
117
|
|
|
116
118
|
```ruby
|
|
117
119
|
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
|
@@ -119,34 +121,34 @@ require_relative '../node_modules/@react-native-community/cli-platform-ios/nativ
|
|
|
119
121
|
|
|
120
122
|
platform :ios, '16.0'
|
|
121
123
|
|
|
122
|
-
pod 'easymerchantsdk', :path => '../node_modules/easymerchantsdk-react-native/ios'
|
|
124
|
+
pod 'easymerchantsdk', :path => '../node_modules/@jimrising/easymerchantsdk-react-native/ios'
|
|
123
125
|
```
|
|
124
126
|
|
|
125
|
-
3.
|
|
127
|
+
3. Install the pod dependencies by running:
|
|
126
128
|
|
|
127
129
|
```bash
|
|
128
130
|
cd ios
|
|
129
|
-
pod install
|
|
131
|
+
pod install --repo-update
|
|
130
132
|
```
|
|
131
133
|
|
|
132
|
-
## Usage
|
|
134
|
+
## Usage
|
|
133
135
|
|
|
134
|
-
|
|
136
|
+
The sample `App.js` provides a complete implementation for integrating the EasyMerchant SDK, including a user interface for configuring payment settings and handling responses. Below is a guide to using the SDK in your React Native application.
|
|
135
137
|
|
|
136
|
-
### 1. Import
|
|
138
|
+
### 1. Import Required Modules
|
|
137
139
|
|
|
138
|
-
Ensure you import the
|
|
140
|
+
Ensure you import the necessary React Native components and the EasyMerchant SDK NativeModules:
|
|
139
141
|
|
|
140
142
|
```javascript
|
|
141
143
|
import React, { useState, useEffect } from 'react';
|
|
142
|
-
import { StyleSheet, Text, View, TextInput,
|
|
144
|
+
import { StyleSheet, Text, View, TextInput, Switch, TouchableOpacity, NativeModules, NativeEventEmitter, Platform, Alert, ScrollView, KeyboardAvoidingView, Modal, TouchableWithoutFeedback } from 'react-native';
|
|
143
145
|
|
|
144
146
|
const { RNEasymerchantsdk, EasyMerchantSdk } = NativeModules;
|
|
145
147
|
```
|
|
146
148
|
|
|
147
|
-
### 2.
|
|
149
|
+
### 2. Define Configuration
|
|
148
150
|
|
|
149
|
-
|
|
151
|
+
Use a configuration object to define payment settings. The `externalConfig` in `App.js` is a comprehensive example that supports both platforms:
|
|
150
152
|
|
|
151
153
|
```javascript
|
|
152
154
|
const externalConfig = {
|
|
@@ -157,16 +159,16 @@ const externalConfig = {
|
|
|
157
159
|
isSecureAuthentication: false,
|
|
158
160
|
isBillingVisible: false,
|
|
159
161
|
isAdditionalVisible: false,
|
|
160
|
-
emailEditable: true,
|
|
161
|
-
isEmail: true,
|
|
162
|
+
emailEditable: true, // Android-specific
|
|
163
|
+
isEmail: true, // iOS-specific
|
|
162
164
|
billingInfo: {
|
|
163
165
|
visibility: { billing: false, additional: false },
|
|
164
166
|
billing: {
|
|
165
|
-
address: '
|
|
166
|
-
country: '
|
|
167
|
-
state: '
|
|
168
|
-
city: '
|
|
169
|
-
postal_code: '
|
|
167
|
+
address: 'San Fran',
|
|
168
|
+
country: 'USA',
|
|
169
|
+
state: 'California',
|
|
170
|
+
city: 'Paris',
|
|
171
|
+
postal_code: '234234',
|
|
170
172
|
},
|
|
171
173
|
billingRequired: {
|
|
172
174
|
address: true,
|
|
@@ -178,7 +180,7 @@ const externalConfig = {
|
|
|
178
180
|
additional: {
|
|
179
181
|
name: 'Test User',
|
|
180
182
|
email_address: 'test@gmail.com',
|
|
181
|
-
phone_number: '
|
|
183
|
+
phone_number: '0000000',
|
|
182
184
|
description: 'Test',
|
|
183
185
|
},
|
|
184
186
|
additionalRequired: {
|
|
@@ -213,10 +215,10 @@ const externalConfig = {
|
|
|
213
215
|
recurringData: {
|
|
214
216
|
allowCycles: 2,
|
|
215
217
|
intervals: ['daily', 'weekly', 'monthly'],
|
|
216
|
-
recurringStartType:
|
|
218
|
+
recurringStartType: 'custom',
|
|
217
219
|
recurringStartDate: new Date().toLocaleDateString('en-US', { month: '2-digit', day: '2-digit', year: 'numeric' }),
|
|
218
220
|
},
|
|
219
|
-
|
|
221
|
+
androidConfig: {
|
|
220
222
|
currency: 'usd',
|
|
221
223
|
saveCard: true,
|
|
222
224
|
saveAccount: true,
|
|
@@ -263,17 +265,88 @@ const externalConfig = {
|
|
|
263
265
|
};
|
|
264
266
|
```
|
|
265
267
|
|
|
266
|
-
|
|
268
|
+
This configuration includes:
|
|
269
|
+
- **Basic Info**: `amount`, `email`, `name`.
|
|
270
|
+
- **Payment Options**: Toggles for recurring payments, authenticated ACH, 3D Secure, and visibility of billing/additional fields.
|
|
271
|
+
- **Billing Info**: Configurable billing and additional fields with required flags.
|
|
272
|
+
- **Theming**: Separate `themeConfiguration` (iOS) and `androidConfig.appearanceSettings` (Android) for UI customization.
|
|
273
|
+
- **GrailPay Params**: Settings for bank search UI (e.g., role, timeout, branding).
|
|
274
|
+
- **Recurring Data**: Options for recurring payment cycles and intervals.
|
|
275
|
+
- **Android Config**: Android-specific settings, including payment methods and fields.
|
|
267
276
|
|
|
268
|
-
|
|
277
|
+
### 3. Initialize Environment
|
|
269
278
|
|
|
270
|
-
|
|
279
|
+
Configure the SDK environment (`sandbox` or `staging`) with API keys and secret keys:
|
|
280
|
+
|
|
281
|
+
```javascript
|
|
282
|
+
const [apiKeys, setApiKeys] = useState({
|
|
283
|
+
sandbox: {
|
|
284
|
+
apiKey: 'apiKey',
|
|
285
|
+
secretKey: 'secretKey',
|
|
286
|
+
},
|
|
287
|
+
staging: {
|
|
288
|
+
apiKey: 'apiKey',
|
|
289
|
+
secretKey: 'secretKey',
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
useEffect(() => {
|
|
294
|
+
const updateEnvironment = async () => {
|
|
295
|
+
const { apiKey, secretKey } = apiKeys[environment];
|
|
296
|
+
if (Platform.OS === 'ios') {
|
|
297
|
+
try {
|
|
298
|
+
await EasyMerchantSdk.setViewController();
|
|
299
|
+
await EasyMerchantSdk.configureEnvironment(environment, apiKey, secretKey);
|
|
300
|
+
} catch (err) {
|
|
301
|
+
Alert.alert('Error', `Failed to configure iOS environment: ${err.message}`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
updateEnvironment();
|
|
306
|
+
}, [environment, apiKeys]);
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Note**: Replace the placeholder API keys with your actual credentials. Store them securely (e.g., in environment variables) rather than hardcoding.
|
|
310
|
+
|
|
311
|
+
### 4. Handle Payments
|
|
312
|
+
|
|
313
|
+
The `handlePayment` function validates inputs and delegates to platform-specific billing handlers. At least one payment method (`card` or `ach`) must be selected, and recurring payments require at least one interval.
|
|
314
|
+
|
|
315
|
+
#### Main Payment Handler
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
const handlePayment = async () => {
|
|
319
|
+
if (!amount || isNaN(parseFloat(amount)) || parseFloat(amount) <= 0) {
|
|
320
|
+
return Alert.alert('Error', 'Please enter a valid amount');
|
|
321
|
+
}
|
|
322
|
+
if (isRecurring && (!recurringData.intervals || recurringData.intervals.length === 0)) {
|
|
323
|
+
return Alert.alert('Error', 'Please select at least one interval for recurring payment');
|
|
324
|
+
}
|
|
325
|
+
if (!androidConfig.paymentMethods || androidConfig.paymentMethods.length === 0) {
|
|
326
|
+
return Alert.alert('Error', 'Please select at least one payment method');
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
setLoading(true);
|
|
330
|
+
const timeoutId = setTimeout(() => setLoading(false), 3000);
|
|
331
|
+
try {
|
|
332
|
+
if (Platform.OS === 'android') {
|
|
333
|
+
await handleAndroidBilling();
|
|
334
|
+
} else {
|
|
335
|
+
await handleIosBilling();
|
|
336
|
+
}
|
|
337
|
+
} finally {
|
|
338
|
+
clearTimeout(timeoutId);
|
|
339
|
+
setLoading(false);
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
#### Android Billing
|
|
271
345
|
|
|
272
346
|
```javascript
|
|
273
347
|
const handleAndroidBilling = async () => {
|
|
274
348
|
const { apiKey, secretKey } = apiKeys[environment];
|
|
275
|
-
const selectedPaymentMethods = [...
|
|
276
|
-
|
|
349
|
+
const selectedPaymentMethods = [...androidConfig.paymentMethods];
|
|
277
350
|
const config = {
|
|
278
351
|
amount,
|
|
279
352
|
apiKey,
|
|
@@ -282,27 +355,30 @@ const handleAndroidBilling = async () => {
|
|
|
282
355
|
environment,
|
|
283
356
|
amount,
|
|
284
357
|
tokenOnly: false,
|
|
285
|
-
currency:
|
|
286
|
-
saveCard:
|
|
287
|
-
saveAccount:
|
|
358
|
+
currency: androidConfig.currency,
|
|
359
|
+
saveCard: androidConfig.saveCard,
|
|
360
|
+
saveAccount: androidConfig.saveAccount,
|
|
288
361
|
authenticatedACH: isAuthenticatedACH,
|
|
289
362
|
secureAuthentication: isSecureAuthentication,
|
|
290
|
-
showReceipt:
|
|
291
|
-
showDonate:
|
|
292
|
-
showTotal:
|
|
293
|
-
showSubmitButton:
|
|
294
|
-
paymentMethods: selectedPaymentMethods,
|
|
363
|
+
showReceipt: androidConfig.showReceipt,
|
|
364
|
+
showDonate: androidConfig.showDonate,
|
|
365
|
+
showTotal: androidConfig.showTotal,
|
|
366
|
+
showSubmitButton: androidConfig.showSubmitButton,
|
|
367
|
+
paymentMethods: selectedPaymentMethods,
|
|
295
368
|
emailEditable,
|
|
296
369
|
email,
|
|
297
370
|
name,
|
|
298
371
|
fields: {
|
|
299
|
-
...
|
|
300
|
-
visibility: {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
372
|
+
...androidConfig.fields,
|
|
373
|
+
visibility: { billing: isBillingVisible, additional: isAdditionalVisible },
|
|
374
|
+
},
|
|
375
|
+
metadata: {
|
|
376
|
+
metaKey: 'metaValue',
|
|
377
|
+
metaKLey1: 'metaValue1',
|
|
378
|
+
metaKLey2: 'metaValue2',
|
|
379
|
+
metaKLey3: 'metaValue3',
|
|
380
|
+
metaKLey4: 'metaValue4',
|
|
304
381
|
},
|
|
305
|
-
metadata,
|
|
306
382
|
...(isRecurring && {
|
|
307
383
|
recurring: {
|
|
308
384
|
enableRecurring: true,
|
|
@@ -310,7 +386,7 @@ const handleAndroidBilling = async () => {
|
|
|
310
386
|
},
|
|
311
387
|
}),
|
|
312
388
|
grailPayParams,
|
|
313
|
-
appearanceSettings:
|
|
389
|
+
appearanceSettings: androidConfig.appearanceSettings,
|
|
314
390
|
},
|
|
315
391
|
};
|
|
316
392
|
|
|
@@ -325,30 +401,27 @@ const handleAndroidBilling = async () => {
|
|
|
325
401
|
} catch (error) {
|
|
326
402
|
setResult(`Error: ${error.message || 'Unknown error'}`);
|
|
327
403
|
Alert.alert('Payment Error', error.message || 'An error occurred during payment');
|
|
328
|
-
} finally {
|
|
329
|
-
setLoading(false);
|
|
330
404
|
}
|
|
331
405
|
};
|
|
332
406
|
```
|
|
333
407
|
|
|
334
|
-
#### iOS
|
|
408
|
+
#### iOS Billing
|
|
335
409
|
|
|
336
410
|
```javascript
|
|
337
411
|
const handleIosBilling = async () => {
|
|
338
|
-
const selectedPaymentMethodsIOS =
|
|
412
|
+
const selectedPaymentMethodsIOS = androidConfig.paymentMethods.map(method =>
|
|
339
413
|
method === 'card' ? 'Card' : method === 'ach' ? 'Bank' : method
|
|
340
414
|
);
|
|
341
|
-
|
|
342
415
|
try {
|
|
343
416
|
const result = await EasyMerchantSdk.billing(
|
|
344
417
|
amount,
|
|
345
|
-
|
|
418
|
+
androidConfig.currency || 'usd',
|
|
346
419
|
billingInfo,
|
|
347
420
|
selectedPaymentMethodsIOS,
|
|
348
421
|
themeConfiguration,
|
|
349
|
-
false,
|
|
350
|
-
|
|
351
|
-
|
|
422
|
+
false,
|
|
423
|
+
androidConfig.saveCard,
|
|
424
|
+
androidConfig.saveAccount,
|
|
352
425
|
isAuthenticatedACH,
|
|
353
426
|
grailPayParams,
|
|
354
427
|
'Submit',
|
|
@@ -358,79 +431,71 @@ const handleIosBilling = async () => {
|
|
|
358
431
|
isRecurring ? recurringData.recurringStartType : '',
|
|
359
432
|
isRecurring ? recurringData.recurringStartDate : '',
|
|
360
433
|
isSecureAuthentication,
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
434
|
+
androidConfig.showReceipt,
|
|
435
|
+
androidConfig.showTotal,
|
|
436
|
+
androidConfig.showSubmitButton,
|
|
364
437
|
isEmail,
|
|
365
438
|
email,
|
|
366
439
|
name,
|
|
367
|
-
|
|
440
|
+
{
|
|
441
|
+
metaKey: 'metaValue',
|
|
442
|
+
metaKLey1: 'metaValue1',
|
|
443
|
+
metaKLey2: 'metaValue2',
|
|
444
|
+
metaKLey3: 'metaValue3',
|
|
445
|
+
metaKLey4: 'metaValue4',
|
|
446
|
+
}
|
|
368
447
|
);
|
|
369
|
-
|
|
370
448
|
const refToken = result?.additionalInfo?.threeDSecureStatus?.data?.ref_token;
|
|
371
449
|
if (refToken) setReferenceToken(refToken);
|
|
372
450
|
setResult(JSON.stringify(result, null, 2));
|
|
373
451
|
} catch (error) {
|
|
374
452
|
setResult(`Billing Error: ${error.message || 'Unknown error'}`);
|
|
375
453
|
Alert.alert('Billing Error', error.message || 'An error occurred during billing');
|
|
376
|
-
} finally {
|
|
377
|
-
setLoading(false);
|
|
378
454
|
}
|
|
379
455
|
};
|
|
380
456
|
```
|
|
381
457
|
|
|
382
|
-
####
|
|
458
|
+
#### Helper Function for JSON Parsing
|
|
383
459
|
|
|
384
460
|
```javascript
|
|
385
|
-
const
|
|
386
|
-
if (
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
if (!configur.paymentMethods || configur.paymentMethods.length === 0) {
|
|
395
|
-
return Alert.alert('Error', 'Please select at least one payment method');
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
setLoading(true);
|
|
399
|
-
const timeoutId = setTimeout(() => setLoading(false), 3000);
|
|
400
|
-
|
|
401
|
-
try {
|
|
402
|
-
if (Platform.OS === 'android') {
|
|
403
|
-
await handleAndroidBilling();
|
|
404
|
-
} else {
|
|
405
|
-
await handleIosBilling();
|
|
461
|
+
const safeParseMaybeJSON = (value) => {
|
|
462
|
+
if (typeof value === 'string') {
|
|
463
|
+
try {
|
|
464
|
+
return JSON.parse(value);
|
|
465
|
+
} catch (e) {
|
|
466
|
+
console.warn('Failed to parse JSON string:', value);
|
|
467
|
+
return value;
|
|
406
468
|
}
|
|
407
|
-
} finally {
|
|
408
|
-
clearTimeout(timeoutId);
|
|
409
|
-
setLoading(false);
|
|
410
469
|
}
|
|
470
|
+
return value;
|
|
411
471
|
};
|
|
412
472
|
```
|
|
413
473
|
|
|
414
|
-
###
|
|
474
|
+
### 5. Android Event Listeners
|
|
415
475
|
|
|
416
|
-
|
|
476
|
+
For Android, set up event listeners to handle payment success, status, and errors:
|
|
417
477
|
|
|
418
478
|
```javascript
|
|
419
479
|
useEffect(() => {
|
|
420
480
|
if (Platform.OS !== 'android') return;
|
|
481
|
+
if (!RNEasymerchantsdk) {
|
|
482
|
+
console.warn('RNEasymerchantsdk native module is not available.');
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
421
485
|
|
|
422
486
|
const easyMerchantEvents = new NativeEventEmitter(RNEasymerchantsdk);
|
|
423
|
-
|
|
424
487
|
const successSub = easyMerchantEvents.addListener('PaymentSuccess', (data) => {
|
|
425
|
-
const parsed = JSON.parse(data.response);
|
|
426
|
-
setResult(JSON.stringify(
|
|
488
|
+
const parsed = JSON.parse(data.response || '{}');
|
|
489
|
+
setResult(JSON.stringify({
|
|
490
|
+
...parsed,
|
|
491
|
+
billingInfo: safeParseMaybeJSON(parsed.billingInfo),
|
|
492
|
+
additional_info: safeParseMaybeJSON(parsed.additional_info),
|
|
493
|
+
}, null, 2));
|
|
427
494
|
});
|
|
428
|
-
|
|
429
495
|
const statusSub = easyMerchantEvents.addListener('PaymentStatus', (data) => {
|
|
430
|
-
const parsed = JSON.parse(data.statusResponse);
|
|
496
|
+
const parsed = JSON.parse(data.statusResponse || '{}');
|
|
431
497
|
setResult(JSON.stringify(parsed, null, 2));
|
|
432
498
|
});
|
|
433
|
-
|
|
434
499
|
const statusErrorSub = easyMerchantEvents.addListener('PaymentStatusError', (data) => {
|
|
435
500
|
setResult(`Status Error: ${JSON.stringify(data.error, null, 2)}`);
|
|
436
501
|
});
|
|
@@ -443,24 +508,20 @@ useEffect(() => {
|
|
|
443
508
|
}, []);
|
|
444
509
|
```
|
|
445
510
|
|
|
446
|
-
### 5. UI Components
|
|
447
|
-
|
|
448
|
-
The provided `App.js` includes custom components like `Dropdown` and `FilledButton` for a user-friendly interface. Customize the styles in the `StyleSheet` to match your app's design.
|
|
449
|
-
|
|
450
511
|
## Notes
|
|
451
512
|
|
|
452
|
-
- **Billing Info**:
|
|
453
|
-
- **
|
|
454
|
-
- **
|
|
455
|
-
- **
|
|
456
|
-
- **
|
|
457
|
-
- **
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
- iOS supports an additional `paymentReference` method for checking payment status using a reference token.
|
|
513
|
+
- **Billing Info**: Set `billingInfo` to `null` if not needed. Required fields are configurable via `billingRequired` and `additionalRequired`.
|
|
514
|
+
- **Payment Methods**: Supported methods are `card` and `ach` (mapped to `Card` and `Bank` on iOS). Ensure at least one is selected in `androidConfig.paymentMethods`.
|
|
515
|
+
- **Recurring Payments**: Requires at least one interval (`daily`, `weekly`, `monthly`) when enabled.
|
|
516
|
+
- **Security**: Store API keys and secret keys securely (e.g., in environment variables or secure storage) rather than hardcoding.
|
|
517
|
+
- **Platform Differences**:
|
|
518
|
+
- **Android**: Uses `RNEasymerchantsdk.makePayment(config)` with a JSON config object. Payment methods are lowercase (`['card', 'ach']`).
|
|
519
|
+
- **iOS**: Uses `EasyMerchantSdk.billing(...)` with parameters passed directly. Payment methods are capitalized (`['Card', 'Bank']`).
|
|
520
|
+
- iOS supports `paymentReference` for status checks; Android uses `checkPaymentStatus`.
|
|
461
521
|
|
|
462
522
|
## Troubleshooting
|
|
463
523
|
|
|
464
|
-
- **iOS Bridge Initialization**: If you see "Failed to retrieve EasyMerchantSdkPlugin instance" in the console,
|
|
465
|
-
- **Android Payment Issues**:
|
|
524
|
+
- **iOS Bridge Initialization**: If you see "Failed to retrieve EasyMerchantSdkPlugin instance" in the console, verify that the `easymerchantsdk` pod is installed and linked correctly. Run `pod install --repo-update` and check `AppDelegate.swift`.
|
|
525
|
+
- **Android Payment Issues**: Ensure `paymentMethods` is formatted as `['card', 'ach']` and that API keys are valid. Verify `GITHUB_URL`, `GITHUB_USERNAME`, and `GITHUB_PASSWORD` in `gradle.properties`.
|
|
466
526
|
- **Pod Installation**: If `pod install` fails, ensure Ruby 3.2.8 is installed and run `pod install --repo-update`.
|
|
527
|
+
- **Payment Failures**: Check console logs for detailed errors. Validate that `amount` is a positive number, payment methods are selected, and API keys are correct.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
#
|
|
1
|
+
#Wed Aug 20 09:54:15 IST 2025
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<dependencies>
|
|
2
2
|
<compile
|
|
3
|
-
roots="com.app:paysdk:1.
|
|
3
|
+
roots="com.app:paysdk:1.6.0@aar,com.hbb20:ccp:2.7.3@aar,com.github.bumptech.glide:glide:4.16.0@aar,com.google.android.material:material:1.8.0@aar,com.facebook.react:react-android:0.76.4:release@aar,androidx.appcompat:appcompat:1.6.1@aar,androidx.viewpager2:viewpager2:1.0.0@aar,androidx.fragment:fragment:1.3.6@aar,androidx.fragment:fragment:1.3.6@aar,androidx.activity:activity:1.6.0@aar,androidx.lifecycle:lifecycle-common:2.6.2@jar,androidx.lifecycle:lifecycle-livedata-core:2.6.2@aar,androidx.dynamicanimation:dynamicanimation:1.0.0@aar,androidx.legacy:legacy-support-core-utils:1.0.0@aar,androidx.loader:loader:1.0.0@aar,androidx.lifecycle:lifecycle-viewmodel:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel:2.6.2@aar,androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2@aar,androidx.lifecycle:lifecycle-livedata:2.6.2@aar,androidx.lifecycle:lifecycle-livedata:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2@aar,androidx.core:core-ktx:1.13.1@aar,androidx.appcompat:appcompat-resources:1.6.1@aar,androidx.drawerlayout:drawerlayout:1.1.1@aar,androidx.coordinatorlayout:coordinatorlayout:1.1.0@aar,androidx.recyclerview:recyclerview:1.3.0@aar,androidx.recyclerview:recyclerview:1.3.0@aar,androidx.transition:transition:1.2.0@aar,androidx.vectordrawable:vectordrawable-animated:1.1.0@aar,androidx.vectordrawable:vectordrawable:1.1.0@aar,androidx.swiperefreshlayout:swiperefreshlayout:1.1.0@aar,androidx.viewpager:viewpager:1.0.0@aar,androidx.customview:customview:1.1.0@aar,androidx.core:core:1.13.1@aar,androidx.core:core:1.13.1@aar,androidx.lifecycle:lifecycle-runtime:2.6.2@aar,androidx.lifecycle:lifecycle-livedata-ktx:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2@aar,org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1@jar,org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1@jar,com.github.androidmads:QRGenerator:1.0.1@aar,androidx.constraintlayout:constraintlayout:2.1.4@aar,com.github.bumptech.glide:gifdecoder:4.16.0@aar,androidx.cursoradapter:cursoradapter:1.0.0@aar,androidx.savedstate:savedstate:1.2.1@aar,androidx.cardview:cardview:1.0.0@aar,androidx.versionedparcelable:versionedparcelable:1.1.1@aar,androidx.collection:collection:1.1.0@jar,androidx.interpolator:interpolator:1.0.0@aar,androidx.arch.core:core-runtime:2.2.0@aar,androidx.arch.core:core-common:2.2.0@jar,androidx.documentfile:documentfile:1.0.0@aar,androidx.localbroadcastmanager:localbroadcastmanager:1.0.0@aar,androidx.print:print:1.0.0@aar,androidx.annotation:annotation-jvm:1.6.0@jar,com.facebook.fresco:fresco:3.2.0@aar,com.facebook.fresco:imagepipeline-okhttp3:3.2.0@aar,com.facebook.fresco:middleware:3.2.0@aar,com.facebook.fresco:ui-common:3.2.0@aar,com.squareup.okhttp3:okhttp-urlconnection:4.9.2@jar,com.facebook.fresco:fbcore:3.2.0@aar,com.facebook.fresco:imagepipeline:3.2.0@aar,com.facebook.fresco:imagepipeline-base:3.2.0@aar,org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21@jar,androidx.annotation:annotation-experimental:1.4.0@aar,com.squareup.okhttp3:okhttp:4.9.2@jar,com.squareup.okio:okio:2.9.0@jar,org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21@jar,org.jetbrains.kotlin:kotlin-stdlib:1.9.24@jar,org.jetbrains:annotations:23.0.0@jar,androidx.tracing:tracing:1.1.0@aar,com.github.bumptech.glide:disklrucache:4.16.0@jar,com.github.bumptech.glide:annotations:4.16.0@jar,androidx.exifinterface:exifinterface:1.3.6@aar,androidx.autofill:autofill:1.1.0@aar,com.facebook.fbjni:fbjni:0.6.0@aar,com.facebook.soloader:soloader:0.12.1@aar,com.facebook.soloader:nativeloader:0.12.1@jar,com.facebook.soloader:annotation:0.12.1@jar,com.facebook.fresco:drawee:3.2.0@aar,com.facebook.infer.annotation:infer-annotation:0.18.0@jar,com.google.code.findbugs:jsr305:3.0.2@jar,org.jetbrains.kotlin:kotlin-annotations-jvm:1.3.72@jar,com.facebook.fresco:imagepipeline-native:3.2.0@aar,com.facebook.fresco:memory-type-ashmem:3.2.0@aar,com.facebook.fresco:memory-type-native:3.2.0@aar,com.facebook.fresco:memory-type-java:3.2.0@aar,com.facebook.fresco:nativeimagefilters:3.2.0@aar,com.facebook.fresco:nativeimagetranscoder:3.2.0@aar,com.facebook.yoga:proguard-annotations:1.19.0@jar,javax.inject:javax.inject:1@jar">
|
|
4
4
|
<dependency
|
|
5
|
-
name="com.app:paysdk:1.
|
|
5
|
+
name="com.app:paysdk:1.6.0@aar"
|
|
6
6
|
simpleName="com.app:paysdk"/>
|
|
7
7
|
<dependency
|
|
8
8
|
name="com.hbb20:ccp:2.7.3@aar"
|
|
@@ -261,9 +261,9 @@
|
|
|
261
261
|
simpleName="javax.inject:javax.inject"/>
|
|
262
262
|
</compile>
|
|
263
263
|
<package
|
|
264
|
-
roots="com.app:paysdk:1.
|
|
264
|
+
roots="com.app:paysdk:1.6.0@aar,com.hbb20:ccp:2.7.3@aar,com.github.bumptech.glide:glide:4.16.0@aar,org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.7.1@jar,com.google.android.material:material:1.8.0@aar,com.facebook.react:react-android:0.76.4:release@aar,androidx.constraintlayout:constraintlayout:2.1.4@aar,androidx.appcompat:appcompat-resources:1.6.1@aar,androidx.appcompat:appcompat:1.6.1@aar,androidx.viewpager2:viewpager2:1.0.0@aar,androidx.fragment:fragment:1.3.6@aar,androidx.fragment:fragment:1.3.6@aar,androidx.activity:activity:1.6.0@aar,androidx.recyclerview:recyclerview:1.3.0@aar,androidx.recyclerview:recyclerview:1.3.0@aar,androidx.customview:customview-poolingcontainer:1.0.0@aar,androidx.dynamicanimation:dynamicanimation:1.0.0@aar,androidx.legacy:legacy-support-core-utils:1.0.0@aar,androidx.loader:loader:1.0.0@aar,androidx.emoji2:emoji2-views-helper:1.2.0@aar,androidx.emoji2:emoji2:1.2.0@aar,androidx.lifecycle:lifecycle-livedata-core-ktx:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel:2.6.2@aar,androidx.lifecycle:lifecycle-process:2.6.2@aar,androidx.lifecycle:lifecycle-livedata-ktx:2.6.2@aar,androidx.lifecycle:lifecycle-livedata-core:2.6.2@aar,androidx.lifecycle:lifecycle-livedata:2.6.2@aar,androidx.lifecycle:lifecycle-livedata:2.6.2@aar,androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2@aar,androidx.core:core-ktx:1.13.1@aar,androidx.drawerlayout:drawerlayout:1.1.1@aar,androidx.coordinatorlayout:coordinatorlayout:1.1.0@aar,androidx.transition:transition:1.2.0@aar,androidx.vectordrawable:vectordrawable-animated:1.1.0@aar,androidx.vectordrawable:vectordrawable:1.1.0@aar,androidx.autofill:autofill:1.1.0@aar,androidx.swiperefreshlayout:swiperefreshlayout:1.1.0@aar,androidx.viewpager:viewpager:1.0.0@aar,androidx.customview:customview:1.1.0@aar,com.facebook.fresco:fresco:3.2.0@aar,com.facebook.fresco:imagepipeline-okhttp3:3.2.0@aar,com.facebook.fresco:drawee:3.2.0@aar,com.facebook.fresco:nativeimagefilters:3.2.0@aar,com.facebook.fresco:memory-type-native:3.2.0@aar,com.facebook.fresco:memory-type-java:3.2.0@aar,com.facebook.fresco:imagepipeline-native:3.2.0@aar,com.facebook.fresco:memory-type-ashmem:3.2.0@aar,com.facebook.fresco:imagepipeline:3.2.0@aar,com.facebook.fresco:nativeimagetranscoder:3.2.0@aar,com.facebook.fresco:imagepipeline-base:3.2.0@aar,com.facebook.fresco:middleware:3.2.0@aar,com.facebook.fresco:ui-common:3.2.0@aar,com.facebook.fresco:soloader:3.2.0@aar,com.facebook.fresco:fbcore:3.2.0@aar,androidx.core:core:1.13.1@aar,androidx.core:core:1.13.1@aar,androidx.lifecycle:lifecycle-runtime:2.6.2@aar,androidx.savedstate:savedstate:1.2.1@aar,androidx.lifecycle:lifecycle-common:2.6.2@jar,org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1@jar,com.github.androidmads:QRGenerator:1.0.1@aar,io.michaelrocks:libphonenumber-android:8.13.13@aar,androidx.cardview:cardview:1.0.0@aar,com.github.bumptech.glide:gifdecoder:4.16.0@aar,com.github.bumptech.glide:disklrucache:4.16.0@jar,com.github.bumptech.glide:annotations:4.16.0@jar,androidx.exifinterface:exifinterface:1.3.6@aar,androidx.profileinstaller:profileinstaller:1.3.0@aar,androidx.startup:startup-runtime:1.1.1@aar,androidx.tracing:tracing:1.1.0@aar,com.squareup.okhttp3:okhttp-urlconnection:4.9.2@jar,com.squareup.okhttp3:okhttp:4.9.2@jar,com.squareup.okio:okio:2.9.0@jar,androidx.annotation:annotation-experimental:1.4.0@aar,org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.21@jar,androidx.cursoradapter:cursoradapter:1.0.0@aar,androidx.resourceinspection:resourceinspection-annotation:1.0.1@jar,androidx.versionedparcelable:versionedparcelable:1.1.1@aar,androidx.collection:collection:1.1.0@jar,androidx.interpolator:interpolator:1.0.0@aar,androidx.documentfile:documentfile:1.0.0@aar,androidx.localbroadcastmanager:localbroadcastmanager:1.0.0@aar,androidx.print:print:1.0.0@aar,androidx.arch.core:core-runtime:2.2.0@aar,androidx.arch.core:core-common:2.2.0@jar,androidx.concurrent:concurrent-futures:1.1.0@jar,androidx.annotation:annotation-jvm:1.6.0@jar,org.jetbrains.kotlin:kotlin-stdlib:1.9.24@jar,org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.21@jar,com.google.zxing:core:3.5.0@jar,com.google.errorprone:error_prone_annotations:2.15.0@jar,com.facebook.fbjni:fbjni:0.6.0@aar,com.facebook.infer.annotation:infer-annotation:0.18.0@jar,com.facebook.soloader:soloader:0.12.1@aar,com.facebook.yoga:proguard-annotations:1.19.0@jar,com.google.code.findbugs:jsr305:3.0.2@jar,javax.inject:javax.inject:1@jar,androidx.constraintlayout:constraintlayout-core:1.0.4@jar,org.jetbrains:annotations:23.0.0@jar,com.facebook.soloader:nativeloader:0.12.1@jar,org.jetbrains.kotlin:kotlin-annotations-jvm:1.3.72@jar,com.facebook.soloader:annotation:0.12.1@jar,com.parse.bolts:bolts-tasks:1.4.0@jar,com.google.guava:listenablefuture:1.0@jar">
|
|
265
265
|
<dependency
|
|
266
|
-
name="com.app:paysdk:1.
|
|
266
|
+
name="com.app:paysdk:1.6.0@aar"
|
|
267
267
|
simpleName="com.app:paysdk"/>
|
|
268
268
|
<dependency
|
|
269
269
|
name="com.hbb20:ccp:2.7.3@aar"
|