react-amwal-pay 0.1.0 → 0.1.2
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/README.md +73 -5
- package/ReactAmwalPay.podspec +2 -1
- package/lib/AmwalPay.d.ts +47 -0
- package/lib/AmwalPay.js +63 -0
- package/lib/AmwalPay.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -0
- package/lib/module/AmwalPaySDK.js +8 -8
- package/lib/module/AmwalPaySDK.js.map +1 -1
- package/lib/module/NativeReactAmwalPay.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/network/NetworkClient.js.map +1 -1
- package/lib/module/utils/SecureHashUtil.js.map +1 -1
- package/lib/screens/PaymentScreen.d.ts +2 -0
- package/lib/screens/PaymentScreen.js +133 -0
- package/lib/screens/PaymentScreen.js.map +1 -0
- package/lib/services/NetworkClient.d.ts +10 -0
- package/lib/services/NetworkClient.js +65 -0
- package/lib/services/NetworkClient.js.map +1 -0
- package/lib/utils/SecureHashUtil.d.ts +9 -0
- package/lib/utils/SecureHashUtil.js +37 -0
- package/lib/utils/SecureHashUtil.js.map +1 -0
- package/package.json +2 -3
- package/src/AmwalPaySDK.ts +97 -97
- package/src/network/NetworkClient.ts +83 -83
- package/src/utils/SecureHashUtil.ts +44 -44
- package/android/build.gradle +0 -95
- package/android/gradle.properties +0 -5
- package/android/src/main/AndroidManifest.xml +0 -2
- package/android/src/main/java/com/reactamwalpay/ReactAmwalPayModule.kt +0 -115
- package/android/src/main/java/com/reactamwalpay/ReactAmwalPayPackage.kt +0 -33
- package/ios/ReactAmwalPay.h +0 -5
- package/ios/ReactAmwalPay.mm +0 -18
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# react-amwal-pay
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A React Native library for integrating Amwal Pay payment gateway into your React Native applications.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -10,15 +10,83 @@ npm install react-amwal-pay
|
|
|
10
10
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
```js
|
|
15
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
AmwalPaySDK,
|
|
16
|
+
Environment,
|
|
17
|
+
Currency,
|
|
18
|
+
TransactionType,
|
|
19
|
+
type AmwalPayConfig,
|
|
20
|
+
type AmwalPayResponse
|
|
21
|
+
} from 'react-amwal-pay';
|
|
22
|
+
|
|
23
|
+
// Configure Amwal Pay
|
|
24
|
+
const config: AmwalPayConfig = {
|
|
25
|
+
environment: Environment.SIT, // or Environment.PRODUCTION
|
|
26
|
+
currency: Currency.OMR, // or other supported currencies
|
|
27
|
+
transactionType: TransactionType.CARD_WALLET,
|
|
28
|
+
locale: 'en', // or 'ar'
|
|
29
|
+
merchantId: '84131',
|
|
30
|
+
terminalId: '811018',
|
|
31
|
+
amount: '1',
|
|
32
|
+
secureHash: '8570CEED656C8818E4A7CE04F22206358F272DAD5F0227D322B654675ABF8F83',
|
|
33
|
+
customerId: 'customer-id', // optional
|
|
34
|
+
sessionToken: 'your-session-token', // optional
|
|
35
|
+
onCustomerId(customerId) {
|
|
36
|
+
console.log('Customer ID:', customerId);
|
|
37
|
+
},
|
|
38
|
+
onResponse(response) {
|
|
39
|
+
console.log('Payment Response:', response);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Initialize and start payment
|
|
44
|
+
const handlePayment = async () => {
|
|
45
|
+
try {
|
|
46
|
+
// Validate required fields
|
|
47
|
+
if (!isConfigValid(config)) {
|
|
48
|
+
console.error('Please fill in all required fields');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
16
51
|
|
|
17
|
-
|
|
52
|
+
const amwalPay = AmwalPaySDK.getInstance();
|
|
53
|
+
await amwalPay.startPayment(config);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('Error starting payment:', error);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
18
58
|
|
|
19
|
-
|
|
59
|
+
// Helper function to validate config
|
|
60
|
+
const isConfigValid = (config: Partial<AmwalPayConfig>): boolean => {
|
|
61
|
+
return Boolean(
|
|
62
|
+
config.environment &&
|
|
63
|
+
config.secureHash &&
|
|
64
|
+
config.currency &&
|
|
65
|
+
config.amount &&
|
|
66
|
+
config.merchantId &&
|
|
67
|
+
config.terminalId &&
|
|
68
|
+
config.locale &&
|
|
69
|
+
config.transactionType
|
|
70
|
+
);
|
|
71
|
+
};
|
|
20
72
|
```
|
|
21
73
|
|
|
74
|
+
## Configuration
|
|
75
|
+
|
|
76
|
+
The `AmwalPayConfig` interface includes the following properties:
|
|
77
|
+
|
|
78
|
+
- `environment`: The environment to use (SIT or PRODUCTION)
|
|
79
|
+
- `currency`: The currency for the transaction (e.g., OMR)
|
|
80
|
+
- `transactionType`: The type of transaction (e.g., CARD_WALLET)
|
|
81
|
+
- `locale`: The language locale ('en' or 'ar')
|
|
82
|
+
- `merchantId`: Your merchant ID
|
|
83
|
+
- `terminalId`: Your terminal ID
|
|
84
|
+
- `amount`: The transaction amount
|
|
85
|
+
- `secureHash`: Your secure hash for authentication
|
|
86
|
+
- `customerId`: (Optional) The customer's ID
|
|
87
|
+
- `sessionToken`: (Optional) Your session token
|
|
88
|
+
- `onCustomerId`: (Optional) Callback function for customer ID updates
|
|
89
|
+
- `onResponse`: (Optional) Callback function for payment response
|
|
22
90
|
|
|
23
91
|
## Contributing
|
|
24
92
|
|
package/ReactAmwalPay.podspec
CHANGED
|
@@ -11,10 +11,11 @@ Pod::Spec.new do |s|
|
|
|
11
11
|
s.authors = package["author"]
|
|
12
12
|
|
|
13
13
|
s.platforms = { :ios => min_ios_version_supported }
|
|
14
|
-
s.source = { :git => "https
|
|
14
|
+
s.source = { :git => "https://github.com/amwal-pay/AnwalPaySDKReactNative.git", :tag => "#{s.version}" }
|
|
15
15
|
|
|
16
16
|
s.source_files = "ios/**/*.{h,m,mm,cpp}"
|
|
17
17
|
s.private_header_files = "ios/**/*.h"
|
|
18
18
|
|
|
19
|
+
s.dependency "amwalsdk"
|
|
19
20
|
install_modules_dependencies(s)
|
|
20
21
|
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type Environment = 'SIT' | 'UAT' | 'PROD';
|
|
2
|
+
export declare const Environment: {
|
|
3
|
+
SIT: Environment;
|
|
4
|
+
UAT: Environment;
|
|
5
|
+
PROD: Environment;
|
|
6
|
+
};
|
|
7
|
+
export type Currency = 'OMR';
|
|
8
|
+
export declare const Currency: {
|
|
9
|
+
OMR: "OMR";
|
|
10
|
+
};
|
|
11
|
+
export type TransactionType = 'NFC' | 'CARD_WALLET' | 'APPLE_PAY';
|
|
12
|
+
export declare const TransactionType: {
|
|
13
|
+
NFC: TransactionType;
|
|
14
|
+
CARD_WALLET: TransactionType;
|
|
15
|
+
APPLE_PAY: TransactionType;
|
|
16
|
+
};
|
|
17
|
+
export interface AmwalPayConfig {
|
|
18
|
+
environment: Environment;
|
|
19
|
+
secureHash: string;
|
|
20
|
+
currency: Currency;
|
|
21
|
+
amount: string;
|
|
22
|
+
merchantId: string;
|
|
23
|
+
terminalId: string;
|
|
24
|
+
locale: string;
|
|
25
|
+
customerId: string | null;
|
|
26
|
+
transactionType: TransactionType;
|
|
27
|
+
sessionToken?: string;
|
|
28
|
+
onResponse: (response: AmwalPayResponse) => void;
|
|
29
|
+
onCustomerIdResponse: (customerId: string) => void;
|
|
30
|
+
}
|
|
31
|
+
export interface AmwalPayResponse {
|
|
32
|
+
success: boolean;
|
|
33
|
+
transactionId?: string;
|
|
34
|
+
message?: string;
|
|
35
|
+
error?: string;
|
|
36
|
+
}
|
|
37
|
+
declare class AmwalPay {
|
|
38
|
+
private static instance;
|
|
39
|
+
private eventEmitter;
|
|
40
|
+
private constructor();
|
|
41
|
+
static getInstance(): AmwalPay;
|
|
42
|
+
private getSessionToken;
|
|
43
|
+
start(amwalPayConfig: AmwalPayConfig): Promise<void>;
|
|
44
|
+
private registerEventListeners;
|
|
45
|
+
removeEventListeners(): void;
|
|
46
|
+
}
|
|
47
|
+
export default AmwalPay;
|
package/lib/AmwalPay.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { NativeModules, NativeEventEmitter } from 'react-native';
|
|
2
|
+
import NetworkClient from './services/NetworkClient';
|
|
3
|
+
const { AmwalPaySDK } = NativeModules;
|
|
4
|
+
export const Environment = {
|
|
5
|
+
SIT: 'SIT',
|
|
6
|
+
UAT: 'UAT',
|
|
7
|
+
PROD: 'PROD'
|
|
8
|
+
};
|
|
9
|
+
export const Currency = {
|
|
10
|
+
OMR: 'OMR'
|
|
11
|
+
};
|
|
12
|
+
export const TransactionType = {
|
|
13
|
+
NFC: 'NFC',
|
|
14
|
+
CARD_WALLET: 'CARD_WALLET',
|
|
15
|
+
APPLE_PAY: 'APPLE_PAY'
|
|
16
|
+
};
|
|
17
|
+
class AmwalPay {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.eventEmitter = new NativeEventEmitter(AmwalPaySDK);
|
|
20
|
+
}
|
|
21
|
+
static getInstance() {
|
|
22
|
+
if (!AmwalPay.instance) {
|
|
23
|
+
AmwalPay.instance = new AmwalPay();
|
|
24
|
+
}
|
|
25
|
+
return AmwalPay.instance;
|
|
26
|
+
}
|
|
27
|
+
async getSessionToken(config) {
|
|
28
|
+
const { environment, merchantId, customerId, secureHash } = config;
|
|
29
|
+
const sessionToken = await NetworkClient.getInstance().fetchSessionToken(environment, merchantId, customerId, secureHash);
|
|
30
|
+
return sessionToken;
|
|
31
|
+
}
|
|
32
|
+
async start(amwalPayConfig) {
|
|
33
|
+
const token = await this.getSessionToken(amwalPayConfig);
|
|
34
|
+
console.log(token);
|
|
35
|
+
if (token) {
|
|
36
|
+
amwalPayConfig.sessionToken = token;
|
|
37
|
+
try {
|
|
38
|
+
// Initialize the AmwalPay SDK
|
|
39
|
+
await AmwalPaySDK.initialize(amwalPayConfig);
|
|
40
|
+
// Register event listeners
|
|
41
|
+
this.registerEventListeners(amwalPayConfig);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw new Error(`Failed to initialize AmwalPay SDK: ${error}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
registerEventListeners(amwalPayConfig) {
|
|
49
|
+
this.eventEmitter.addListener('AmwalPayEvent', async (event) => {
|
|
50
|
+
if (event.type === 'onResponse') {
|
|
51
|
+
amwalPayConfig.onResponse(event.data);
|
|
52
|
+
}
|
|
53
|
+
else if (event.type === 'onCustomerId') {
|
|
54
|
+
amwalPayConfig.onCustomerIdResponse(event.data);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
removeEventListeners() {
|
|
59
|
+
this.eventEmitter.removeAllListeners('AmwalPayEvent');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export default AmwalPay;
|
|
63
|
+
//# sourceMappingURL=AmwalPay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AmwalPay.js","sourceRoot":"","sources":["../src/AmwalPay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,aAAa,MAAM,0BAA0B,CAAC;AAGrD,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC;AAItC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,KAAoB;IACzB,GAAG,EAAE,KAAoB;IACzB,IAAI,EAAE,MAAqB;CAC5B,CAAC;AAGF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,EAAE,KAAiB;CACvB,CAAC;AAGF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,EAAE,KAAwB;IAC7B,WAAW,EAAE,aAAgC;IAC7C,SAAS,EAAE,WAA8B;CAC1C,CAAC;AAwBF,MAAM,QAAQ;IAIZ;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACtB,QAAQ,CAAC,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;SACpC;QACD,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAsB;QAClD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QACnE,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC,iBAAiB,CACtE,WAAW,EACX,UAAU,EACV,UAAU,EACV,UAAU,CACX,CAAC;QACF,OAAO,YAAY,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,cAA8B;QAE/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,KAAK,EAAE;YACT,cAAc,CAAC,YAAY,GAAG,KAAK,CAAC;YAEpC,IAAI;gBACF,8BAA8B;gBAC9B,MAAM,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;gBAE7C,2BAA2B;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;aAC7C;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;aAChE;SACF;IACH,CAAC;IAEO,sBAAsB,CAAC,cAA8B;QAC3D,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;gBAC/B,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,IAAwB,CAAC,CAAC;aAC3D;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE;gBACxC,cAAc,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC;aAC3D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,oBAAoB;QACzB,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC;CACF;AAED,eAAe,QAAQ,CAAC"}
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EACf,WAAW,EACX,QAAQ,EACR,eAAe,GAGhB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAC,CAAC;AAG1D,eAAe,QAAQ,CAAC"}
|
|
@@ -15,9 +15,9 @@ class AmwalPaySDK {
|
|
|
15
15
|
return AmwalPaySDK.instance;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* Initiates the payment process by first fetching a session token and then starting the payment flow
|
|
20
|
-
* @param config The payment configuration
|
|
18
|
+
/**
|
|
19
|
+
* Initiates the payment process by first fetching a session token and then starting the payment flow
|
|
20
|
+
* @param config The payment configuration
|
|
21
21
|
*/
|
|
22
22
|
async startPayment(config) {
|
|
23
23
|
try {
|
|
@@ -51,9 +51,9 @@ class AmwalPaySDK {
|
|
|
51
51
|
this.removeEventListeners();
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
55
|
-
* Sets up event listeners for AmwalPay events
|
|
56
|
-
* @param config The payment configuration containing callback functions
|
|
54
|
+
/**
|
|
55
|
+
* Sets up event listeners for AmwalPay events
|
|
56
|
+
* @param config The payment configuration containing callback functions
|
|
57
57
|
*/
|
|
58
58
|
setupEventListeners(config) {
|
|
59
59
|
// Remove any existing listeners
|
|
@@ -68,8 +68,8 @@ class AmwalPaySDK {
|
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
/**
|
|
72
|
-
* Removes all event listeners
|
|
71
|
+
/**
|
|
72
|
+
* Removes all event listeners
|
|
73
73
|
*/
|
|
74
74
|
removeEventListeners() {
|
|
75
75
|
this.onResponseSubscription?.remove();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["initiate","onCustomerId","onResponse","NetworkClient","AmwalPaySDK","onResponseSubscription","onCustomerIdSubscription","constructor","getInstance","instance","startPayment","config","setupEventListeners","networkClient","sessionToken","fetchSessionToken","environment","merchantId","customerId","secureHash","completeConfig","error","console","dispose","removeEventListeners","response","log","remove"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["initiate","onCustomerId","onResponse","NetworkClient","AmwalPaySDK","onResponseSubscription","onCustomerIdSubscription","constructor","getInstance","instance","startPayment","config","setupEventListeners","networkClient","sessionToken","fetchSessionToken","environment","merchantId","customerId","secureHash","completeConfig","error","console","dispose","removeEventListeners","response","log","remove"],"sourceRoot":"../../src","sources":["AmwalPaySDK.ts"],"mappings":";;AAAA,SAASA,QAAQ,EAAEC,YAAY,EAAEC,UAAU,QAA6B,YAAS;AACjF,OAAOC,aAAa,MAAM,4BAAyB;AAInD,MAAMC,WAAW,CAAC;EAGRC,sBAAsB,GAA2B,IAAI;EAErDC,wBAAwB,GAA2B,IAAI;EAEvDC,WAAWA,CAAA,EAAG;IACpB;EAAA;EAIF,OAAOC,WAAWA,CAAA,EAAgB;IAChC,IAAI,CAACJ,WAAW,CAACK,QAAQ,EAAE;MACzBL,WAAW,CAACK,QAAQ,GAAG,IAAIL,WAAW,CAAC,CAAC;IAC1C;IACA,OAAOA,WAAW,CAACK,QAAQ;EAC7B;;EAEA;AACF;AACA;AACA;EACE,MAAMC,YAAYA,CAACC,MAA4C,EAAiB;IAC9E,IAAI;MACF;MACA,IAAI,CAACC,mBAAmB,CAACD,MAAM,CAAC;;MAEhC;MACA,MAAME,aAAa,GAAGV,aAAa,CAACK,WAAW,CAAC,CAAC;;MAEjD;MACA,MAAMM,YAAY,GAAG,MAAMD,aAAa,CAACE,iBAAiB,CACxDJ,MAAM,CAACK,WAAW,EAClBL,MAAM,CAACM,UAAU,EACjBN,MAAM,CAACO,UAAU,EACjBP,MAAM,CAACQ,UACT,CAAC;MAED,IAAI,CAACL,YAAY,EAAE;QACjB;QACA;MACF;;MAEA;MACA,MAAMM,cAA8B,GAAG;QACrC,GAAGT,MAAM;QACTG;MACF,CAAC;;MAED;MACAd,QAAQ,CAACoB,cAAc,CAAC;IAC1B,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,yBAAyB,EAAEA,KAAK,CAAC;IACjD;EACF;EAEAE,OAAOA,CAAA,EAAS;IACd;IACA,IAAI,CAACC,oBAAoB,CAAC,CAAC;EAC7B;;EAEA;AACF;AACA;AACA;EACUZ,mBAAmBA,CAACD,MAA4C,EAAQ;IAC9E;IACA,IAAI,CAACa,oBAAoB,CAAC,CAAC;IAE3B,IAAI,CAACnB,sBAAsB,GAAGH,UAAU,CAAEuB,QAAQ,IAAK;MACrDH,OAAO,CAACI,GAAG,CAAC,4BAA4B,EAAED,QAAQ,CAAC;MACnDd,MAAM,CAACT,UAAU,CAACuB,QAAQ,CAAC;IAC7B,CAAC,CAAC;IAEF,IAAI,CAACnB,wBAAwB,GAAGL,YAAY,CAAEiB,UAAU,IAAK;MAC3DI,OAAO,CAACI,GAAG,CAAC,sBAAsB,EAAER,UAAU,CAAC;MAC/CP,MAAM,CAACV,YAAY,CAACiB,UAAU,CAAC;IACjC,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;EACUM,oBAAoBA,CAAA,EAAS;IACnC,IAAI,CAACnB,sBAAsB,EAAEsB,MAAM,CAAC,CAAC;IACrC,IAAI,CAACrB,wBAAwB,EAAEqB,MAAM,CAAC,CAAC;IACvC,IAAI,CAACtB,sBAAsB,GAAG,IAAI;IAClC,IAAI,CAACC,wBAAwB,GAAG,IAAI;EACtC;AACF;AAEA,eAAeF,WAAW","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TurboModuleRegistry","Environment","Currency","TransactionType","getEnforcing"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","Environment","Currency","TransactionType","getEnforcing"],"sourceRoot":"../../src","sources":["NativeReactAmwalPay.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAGlD,WAAYC,WAAW,0BAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAXA,WAAW;EAAA,OAAXA,WAAW;AAAA;AAMvB,WAAYC,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA;AAIpB,WAAYC,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA;;AAY3B;;AAgBA;;AAqBA,eAAeH,mBAAmB,CAACI,YAAY,CAAO,eAAe,CAAC","ignoreList":[]}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ReactAmwalPay","Environment","Currency","TransactionType","AmwalPaySDK","initiate","config","nativeConfig","environment","secureHash","currency","amount","merchantId","terminalId","locale","customerId","transactionType","sessionToken","onResponse","callback","onCustomerId"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["ReactAmwalPay","Environment","Currency","TransactionType","AmwalPaySDK","initiate","config","nativeConfig","environment","secureHash","currency","amount","merchantId","terminalId","locale","customerId","transactionType","sessionToken","onResponse","callback","onCustomerId"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,aAAa,IAClBC,WAAW,EACXC,QAAQ,EACRC,eAAe,QAIV,0BAAuB;AAC9B,OAAOC,WAAW,MAAM,kBAAe;AAGvC;;AAEA,OAAO,SAASC,QAAQA,CAACC,MAAsB,EAAQ;EACrD,MAAMC,YAAkC,GAAG;IACzCC,WAAW,EAAEF,MAAM,CAACE,WAAW;IAC/BC,UAAU,EAAEH,MAAM,CAACG,UAAU;IAC7BC,QAAQ,EAAEJ,MAAM,CAACI,QAAQ;IACzBC,MAAM,EAAEL,MAAM,CAACK,MAAM;IACrBC,UAAU,EAAEN,MAAM,CAACM,UAAU;IAC7BC,UAAU,EAAEP,MAAM,CAACO,UAAU;IAC7BC,MAAM,EAAER,MAAM,CAACQ,MAAM;IACrBC,UAAU,EAAET,MAAM,CAACS,UAAU;IAC7BC,eAAe,EAAEV,MAAM,CAACU,eAAe;IACvCC,YAAY,EAAEX,MAAM,CAACW;EACvB,CAAC;;EAED;EACAjB,aAAa,CAACK,QAAQ,CAACE,YAAY,CAAC;AACtC;AAEA,OAAO,SAASW,UAAUA,CAACC,QAA8C,EAAoB;EAC3F,OAAOnB,aAAa,CAACkB,UAAU,CAACC,QAAQ,CAAC;AAC3C;AACA,OAAO,SAASC,YAAYA,CAACD,QAAsC,EAAoB;EACrF,OAAOnB,aAAa,CAACoB,YAAY,CAACD,QAAQ,CAAC;AAC7C;AAEA,SACElB,WAAW,EACXC,QAAQ,EACRC,eAAe,EAGfC,WAAW","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Alert","Environment","SecureHashUtil","NetworkClient","constructor","getInstance","instance","getWebhookUrl","env","SIT","UAT","PROD","fetchSessionToken","merchantId","customerId","secureHashValue","webhookUrl","dataMap","secureHash","clearSecureHash","response","fetch","method","headers","body","JSON","stringify","responseData","json","ok","success","data","sessionToken","errorMessage","errorList","join","showErrorDialog","error","message","alert","text"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["Alert","Environment","SecureHashUtil","NetworkClient","constructor","getInstance","instance","getWebhookUrl","env","SIT","UAT","PROD","fetchSessionToken","merchantId","customerId","secureHashValue","webhookUrl","dataMap","secureHash","clearSecureHash","response","fetch","method","headers","body","JSON","stringify","responseData","json","ok","success","data","sessionToken","errorMessage","errorList","join","showErrorDialog","error","message","alert","text"],"sourceRoot":"../../../src","sources":["network/NetworkClient.ts"],"mappings":";;AAAA,SAASA,KAAK,QAAQ,cAAc;AACpC,SAASC,WAAW,QAAQ,2BAAwB;AACpD,OAAOC,cAAc,MAAM,4BAAyB;AAEpD,MAAMC,aAAa,CAAC;EAGVC,WAAWA,CAAA,EAAG,CAAC;EAEvB,OAAOC,WAAWA,CAAA,EAAkB;IAClC,IAAI,CAACF,aAAa,CAACG,QAAQ,EAAE;MAC3BH,aAAa,CAACG,QAAQ,GAAG,IAAIH,aAAa,CAAC,CAAC;IAC9C;IACA,OAAOA,aAAa,CAACG,QAAQ;EAC/B;EAEQC,aAAaA,CAACC,GAAgB,EAAU;IAC9C,QAAQA,GAAG;MACT,KAAKP,WAAW,CAACQ,GAAG;QAClB,OAAO,iCAAiC;MAC1C,KAAKR,WAAW,CAACS,GAAG;QAClB,OAAO,iCAAiC;MAC1C,KAAKT,WAAW,CAACU,IAAI;QACnB,OAAO,8BAA8B;MACvC;QACE,OAAO,iCAAiC;IAC5C;EACF;EAEA,MAAMC,iBAAiBA,CACrBJ,GAAgB,EAChBK,UAAkB,EAClBC,UAAyB,EACzBC,eAAuB,EACC;IACxB,IAAI;MACF,MAAMC,UAAU,GAAG,IAAI,CAACT,aAAa,CAACC,GAAG,CAAC;MAE1C,MAAMS,OAAO,GAAG;QACdJ,UAAU;QACVC;MACF,CAAC;MAED,MAAMI,UAAU,GAAGhB,cAAc,CAACiB,eAAe,CAACJ,eAAe,EAAEE,OAAO,CAAC;MAE3E,MAAMG,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAGL,UAAU,+BAA+B,EAAE;QACzEM,MAAM,EAAE,MAAM;QACdC,OAAO,EAAE;UACP,QAAQ,EAAE,YAAY;UACtB,iBAAiB,EAAE,gBAAgB;UACnC,cAAc,EAAE;QAClB,CAAC;QACDC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;UACnBb,UAAU;UACVE,eAAe,EAAEG,UAAU;UAC3BJ;QACF,CAAC;MACH,CAAC,CAAC;MAEF,MAAMa,YAAY,GAAG,MAAMP,QAAQ,CAACQ,IAAI,CAAC,CAAC;MAE1C,IAAIR,QAAQ,CAACS,EAAE,IAAIF,YAAY,CAACG,OAAO,EAAE;QACvC,OAAOH,YAAY,CAACI,IAAI,CAACC,YAAY;MACvC,CAAC,MAAM;QACL,MAAMC,YAAY,GAAGN,YAAY,CAACO,SAAS,EAAEC,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe;QACzE,IAAI,CAACC,eAAe,CAACH,YAAY,CAAC;QAClC,OAAO,IAAI;MACb;IACF,CAAC,CAAC,OAAOI,KAAK,EAAE;MACd,IAAI,CAACD,eAAe,CAAC,sBAAsB,CAAC;MAC5C,OAAO,IAAI;IACb;EACF;EAEQA,eAAeA,CAACE,OAAe,EAAQ;IAC7CtC,KAAK,CAACuC,KAAK,CACT,OAAO,EACPD,OAAO,EACP,CAAC;MAAEE,IAAI,EAAE;IAAK,CAAC,CACjB,CAAC;EACH;AACF;AAEA,eAAerC,aAAa","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["HmacSHA256","Hex","SecureHashUtil","clearSecureHash","secretKey","data","secureHashValue","concatenatedString","composeData","generateSecureHash","requestParameters","Object","entries","sort","keyA","keyB","localeCompare","filter","_","value","map","key","join","message","keyBytes","match","byte","parseInt","Error","keyHex","toString","padStart","hash","parse","toUpperCase","e","console","error"],"sourceRoot":"
|
|
1
|
+
{"version":3,"names":["HmacSHA256","Hex","SecureHashUtil","clearSecureHash","secretKey","data","secureHashValue","concatenatedString","composeData","generateSecureHash","requestParameters","Object","entries","sort","keyA","keyB","localeCompare","filter","_","value","map","key","join","message","keyBytes","match","byte","parseInt","Error","keyHex","toString","padStart","hash","parse","toUpperCase","e","console","error"],"sourceRoot":"../../../src","sources":["utils/SecureHashUtil.ts"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,uBAAuB;AAC9C,OAAOC,GAAG,MAAM,mBAAmB;AAInC,MAAMC,cAAc,CAAC;EACnB,OAAOC,eAAeA,CAACC,SAAiB,EAAEC,IAAa,EAAU;IAC/D,OAAOA,IAAI,CAACC,eAAe;IAC3B,MAAMC,kBAAkB,GAAG,IAAI,CAACC,WAAW,CAACH,IAAI,CAAC;IACjD,OAAO,IAAI,CAACI,kBAAkB,CAACF,kBAAkB,EAAEH,SAAS,CAAC;EAC/D;EAEA,OAAeI,WAAWA,CAACE,iBAA0B,EAAU;IAC7D,OAAOC,MAAM,CAACC,OAAO,CAACF,iBAAiB,CAAC,CACrCG,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAACC,IAAI,CAAC,KAAKD,IAAI,CAACE,aAAa,CAACD,IAAI,CAAC,CAAC,CAClDE,MAAM,CAAC,CAAC,CAACC,CAAC,EAAEC,KAAK,CAAC,KAAKA,KAAK,IAAI,IAAI,IAAIA,KAAK,KAAK,EAAE,CAAC,CACrDC,GAAG,CAAC,CAAC,CAACC,GAAG,EAAEF,KAAK,CAAC,KAAK,GAAGE,GAAG,IAAIF,KAAK,EAAE,CAAC,CACxCG,IAAI,CAAC,GAAG,CAAC;EACd;EAEA,OAAeb,kBAAkBA,CAACc,OAAe,EAAEnB,SAAiB,EAAU;IAC5E,IAAI;MACF;MACA,MAAMoB,QAAQ,GAAGpB,SAAS,CAACqB,KAAK,CAAC,OAAO,CAAC,EAAEL,GAAG,CAACM,IAAI,IAAIC,QAAQ,CAACD,IAAI,EAAE,EAAE,CAAC,CAAC;MAE1E,IAAI,CAACF,QAAQ,EAAE;QACb,MAAM,IAAII,KAAK,CAAC,2BAA2B,CAAC;MAC9C;;MAEA;MACA,MAAMC,MAAM,GAAGL,QAAQ,CAACJ,GAAG,CAACM,IAAI,IAAIA,IAAI,CAACI,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAACT,IAAI,CAAC,EAAE,CAAC;;MAEhF;MACA,MAAMU,IAAI,GAAGhC,UAAU,CAACuB,OAAO,EAAEtB,GAAG,CAACgC,KAAK,CAACJ,MAAM,CAAC,CAAC;;MAEnD;MACA,OAAOG,IAAI,CAACF,QAAQ,CAAC7B,GAAG,CAAC,CAACiC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,OAAOC,CAAC,EAAE;MACVC,OAAO,CAACC,KAAK,CAAC,+BAA+B,EAAEF,CAAC,CAAC;MACjD,OAAO,EAAE;IACX;EACF;AACF;AAEA,eAAejC,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { View, Text, TextInput, TouchableOpacity, StyleSheet, ScrollView, Alert, } from 'react-native';
|
|
3
|
+
import { Picker } from '@react-native-picker/picker';
|
|
4
|
+
import AmwalPay, { Environment, Currency, TransactionType, } from '../AmwalPay';
|
|
5
|
+
export const PaymentScreen = () => {
|
|
6
|
+
const [config, setConfig] = useState({
|
|
7
|
+
environment: Environment.SIT,
|
|
8
|
+
currency: Currency.OMR,
|
|
9
|
+
transactionType: TransactionType.CARD_WALLET,
|
|
10
|
+
locale: 'en',
|
|
11
|
+
merchantId: '84131',
|
|
12
|
+
terminalId: '811018',
|
|
13
|
+
amount: '1',
|
|
14
|
+
secureHash: '8570CEED656C8818E4A7CE04F22206358F272DAD5F0227D322B654675ABF8F83',
|
|
15
|
+
onCustomerIdResponse(customerId) {
|
|
16
|
+
console.log('Customer ID:', customerId);
|
|
17
|
+
},
|
|
18
|
+
onResponse(response) {
|
|
19
|
+
console.log('Payment Response:', response);
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
const handleInitializePayment = async () => {
|
|
23
|
+
try {
|
|
24
|
+
if (!isConfigValid()) {
|
|
25
|
+
Alert.alert('Error', 'Please fill in all required fields');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const amwalPay = AmwalPay.getInstance();
|
|
29
|
+
await amwalPay.start(config);
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
Alert.alert('Error', 'Error starting payment');
|
|
33
|
+
console.log(e);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const isConfigValid = () => {
|
|
37
|
+
return Boolean(config.environment &&
|
|
38
|
+
config.secureHash &&
|
|
39
|
+
config.currency &&
|
|
40
|
+
config.amount &&
|
|
41
|
+
config.merchantId &&
|
|
42
|
+
config.terminalId &&
|
|
43
|
+
config.locale &&
|
|
44
|
+
config.transactionType);
|
|
45
|
+
};
|
|
46
|
+
return (<ScrollView style={styles.container}>
|
|
47
|
+
<Text style={styles.title}>Payment Configuration</Text>
|
|
48
|
+
|
|
49
|
+
<Text style={styles.label}>Environment</Text>
|
|
50
|
+
<View style={styles.pickerContainer}>
|
|
51
|
+
<Picker selectedValue={config.environment} onValueChange={value => setConfig({ ...config, environment: value })}>
|
|
52
|
+
{Object.values(Environment).map(env => (<Picker.Item key={env} label={env} value={env}/>))}
|
|
53
|
+
</Picker>
|
|
54
|
+
</View>
|
|
55
|
+
|
|
56
|
+
<Text style={styles.label}>Secure Hash</Text>
|
|
57
|
+
<TextInput style={styles.input} value={config.secureHash} onChangeText={value => setConfig({ ...config, secureHash: value })} placeholder="Enter Secure Hash"/>
|
|
58
|
+
|
|
59
|
+
<Text style={styles.label}>Currency</Text>
|
|
60
|
+
<View style={styles.pickerContainer}>
|
|
61
|
+
<Picker selectedValue={config.currency} onValueChange={value => setConfig({ ...config, currency: value })}>
|
|
62
|
+
{Object.values(Currency).map(curr => (<Picker.Item key={curr} label={curr} value={curr}/>))}
|
|
63
|
+
</Picker>
|
|
64
|
+
</View>
|
|
65
|
+
<Text style={styles.label}>Amount</Text>
|
|
66
|
+
<TextInput style={styles.input} value={config.amount} onChangeText={value => setConfig({ ...config, amount: value })} placeholder="Enter amount" keyboardType="decimal-pad"/>
|
|
67
|
+
|
|
68
|
+
<Text style={styles.label}>Merchant ID</Text>
|
|
69
|
+
<TextInput style={styles.input} value={config.merchantId} onChangeText={value => setConfig({ ...config, merchantId: value })} placeholder="Enter merchant ID"/>
|
|
70
|
+
|
|
71
|
+
<Text style={styles.label}>Terminal ID</Text>
|
|
72
|
+
<TextInput style={styles.input} value={config.terminalId} onChangeText={value => setConfig({ ...config, terminalId: value })} placeholder="Enter terminal ID"/>
|
|
73
|
+
|
|
74
|
+
<Text style={styles.label}>Transaction Type</Text>
|
|
75
|
+
<View style={styles.pickerContainer}>
|
|
76
|
+
<Picker selectedValue={config.transactionType} onValueChange={value => setConfig({ ...config, transactionType: value })}>
|
|
77
|
+
{Object.values(TransactionType).map(type => (<Picker.Item key={type} label={type} value={type}/>))}
|
|
78
|
+
</Picker>
|
|
79
|
+
</View>
|
|
80
|
+
|
|
81
|
+
<TouchableOpacity style={styles.button} onPress={handleInitializePayment}>
|
|
82
|
+
<Text style={styles.buttonText}>Start Payment</Text>
|
|
83
|
+
</TouchableOpacity>
|
|
84
|
+
</ScrollView>);
|
|
85
|
+
};
|
|
86
|
+
const styles = StyleSheet.create({
|
|
87
|
+
container: {
|
|
88
|
+
flex: 1,
|
|
89
|
+
padding: 16,
|
|
90
|
+
backgroundColor: '#fff',
|
|
91
|
+
},
|
|
92
|
+
title: {
|
|
93
|
+
fontSize: 24,
|
|
94
|
+
fontWeight: 'bold',
|
|
95
|
+
marginBottom: 24,
|
|
96
|
+
textAlign: 'center',
|
|
97
|
+
},
|
|
98
|
+
label: {
|
|
99
|
+
fontSize: 16,
|
|
100
|
+
marginBottom: 8,
|
|
101
|
+
color: '#333',
|
|
102
|
+
},
|
|
103
|
+
input: {
|
|
104
|
+
borderWidth: 1,
|
|
105
|
+
borderColor: '#ddd',
|
|
106
|
+
borderRadius: 8,
|
|
107
|
+
padding: 12,
|
|
108
|
+
marginBottom: 16,
|
|
109
|
+
fontSize: 16,
|
|
110
|
+
},
|
|
111
|
+
button: {
|
|
112
|
+
backgroundColor: '#007AFF',
|
|
113
|
+
padding: 16,
|
|
114
|
+
borderRadius: 8,
|
|
115
|
+
marginTop: 24,
|
|
116
|
+
marginBottom: 32,
|
|
117
|
+
},
|
|
118
|
+
buttonText: {
|
|
119
|
+
color: '#fff',
|
|
120
|
+
fontSize: 18,
|
|
121
|
+
fontWeight: 'bold',
|
|
122
|
+
textAlign: 'center',
|
|
123
|
+
},
|
|
124
|
+
pickerContainer: {
|
|
125
|
+
borderWidth: 1,
|
|
126
|
+
borderColor: '#ccc',
|
|
127
|
+
borderRadius: 8,
|
|
128
|
+
overflow: 'hidden',
|
|
129
|
+
width: '100%',
|
|
130
|
+
maxWidth: 300, // Optional: Limit max width
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=PaymentScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaymentScreen.js","sourceRoot":"","sources":["../../src/screens/PaymentScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Environment } from '../AmwalPay';
|
|
2
|
+
declare class NetworkClient {
|
|
3
|
+
private static instance;
|
|
4
|
+
private constructor();
|
|
5
|
+
static getInstance(): NetworkClient;
|
|
6
|
+
private getWebhookUrl;
|
|
7
|
+
fetchSessionToken(env: Environment, merchantId: string, customerId: string | null, secureHashValue: string): Promise<string | null>;
|
|
8
|
+
private showErrorDialog;
|
|
9
|
+
}
|
|
10
|
+
export default NetworkClient;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Alert } from 'react-native';
|
|
2
|
+
import { Environment } from '../AmwalPay';
|
|
3
|
+
import SecureHashUtil from '../utils/SecureHashUtil';
|
|
4
|
+
class NetworkClient {
|
|
5
|
+
constructor() { }
|
|
6
|
+
static getInstance() {
|
|
7
|
+
if (!NetworkClient.instance) {
|
|
8
|
+
NetworkClient.instance = new NetworkClient();
|
|
9
|
+
}
|
|
10
|
+
return NetworkClient.instance;
|
|
11
|
+
}
|
|
12
|
+
getWebhookUrl(env) {
|
|
13
|
+
switch (env) {
|
|
14
|
+
case Environment.SIT:
|
|
15
|
+
return 'https://test.amwalpg.com:24443/';
|
|
16
|
+
case Environment.UAT:
|
|
17
|
+
return 'https://test.amwalpg.com:14443/';
|
|
18
|
+
case Environment.PROD:
|
|
19
|
+
return 'https://webhook.amwalpg.com/';
|
|
20
|
+
default:
|
|
21
|
+
return 'https://test.amwalpg.com:24443/';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async fetchSessionToken(env, merchantId, customerId, secureHashValue) {
|
|
25
|
+
try {
|
|
26
|
+
const webhookUrl = this.getWebhookUrl(env);
|
|
27
|
+
const dataMap = {
|
|
28
|
+
merchantId,
|
|
29
|
+
customerId
|
|
30
|
+
};
|
|
31
|
+
const secureHash = SecureHashUtil.clearSecureHash(secureHashValue, dataMap);
|
|
32
|
+
const response = await fetch(`${webhookUrl}Membership/GetSDKSessionToken`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
'Accept': 'text/plain',
|
|
36
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
37
|
+
'Content-Type': 'application/json',
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
merchantId,
|
|
41
|
+
secureHashValue: secureHash,
|
|
42
|
+
customerId
|
|
43
|
+
})
|
|
44
|
+
});
|
|
45
|
+
const responseData = await response.json();
|
|
46
|
+
if (response.ok && responseData.success) {
|
|
47
|
+
return responseData.data.sessionToken;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const errorMessage = responseData.errorList?.join(',') || 'Unknown error';
|
|
51
|
+
this.showErrorDialog(errorMessage);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
this.showErrorDialog('Something Went Wrong');
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
showErrorDialog(message) {
|
|
61
|
+
Alert.alert('Error', message, [{ text: 'OK' }]);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export default NetworkClient;
|
|
65
|
+
//# sourceMappingURL=NetworkClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetworkClient.js","sourceRoot":"","sources":["../../src/services/NetworkClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,cAAc,MAAM,yBAAyB,CAAC;AAErD,MAAM,aAAa;IAGjB,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC3B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;SAC9C;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEO,aAAa,CAAC,GAAgB;QACpC,QAAQ,GAAG,EAAE;YACX,KAAK,WAAW,CAAC,GAAG;gBAClB,OAAO,iCAAiC,CAAC;YAC3C,KAAK,WAAW,CAAC,GAAG;gBAClB,OAAO,iCAAiC,CAAC;YAC3C,KAAK,WAAW,CAAC,IAAI;gBACnB,OAAO,8BAA8B,CAAC;YACxC;gBACE,OAAO,iCAAiC,CAAC;SAC5C;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,GAAgB,EAChB,UAAkB,EAClB,UAAyB,EACzB,eAAuB;QAEvB,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG;gBACd,UAAU;gBACV,UAAU;aACX,CAAC;YAEF,MAAM,UAAU,GAAG,cAAc,CAAC,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAE5E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,+BAA+B,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,QAAQ,EAAE,YAAY;oBACtB,iBAAiB,EAAE,gBAAgB;oBACnC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,UAAU;oBACV,eAAe,EAAE,UAAU;oBAC3B,UAAU;iBACX,CAAC;aACH,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE3C,IAAI,QAAQ,CAAC,EAAE,IAAI,YAAY,CAAC,OAAO,EAAE;gBACvC,OAAO,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;aACvC;iBAAM;gBACL,MAAM,YAAY,GAAG,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;gBAC1E,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBACnC,OAAO,IAAI,CAAC;aACb;SACF;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,KAAK,CAAC,KAAK,CACT,OAAO,EACP,OAAO,EACP,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACjB,CAAC;IACJ,CAAC;CACF;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import HmacSHA256 from 'crypto-js/hmac-sha256';
|
|
2
|
+
import Hex from 'crypto-js/enc-hex';
|
|
3
|
+
class SecureHashUtil {
|
|
4
|
+
static clearSecureHash(secretKey, data) {
|
|
5
|
+
delete data.secureHashValue;
|
|
6
|
+
const concatenatedString = this.composeData(data);
|
|
7
|
+
return this.generateSecureHash(concatenatedString, secretKey);
|
|
8
|
+
}
|
|
9
|
+
static composeData(requestParameters) {
|
|
10
|
+
return Object.entries(requestParameters)
|
|
11
|
+
.sort(([keyA], [keyB]) => keyA.localeCompare(keyB))
|
|
12
|
+
.filter(([_, value]) => value != null && value !== '')
|
|
13
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
14
|
+
.join('&');
|
|
15
|
+
}
|
|
16
|
+
static generateSecureHash(message, secretKey) {
|
|
17
|
+
try {
|
|
18
|
+
// Convert hex string to byte array
|
|
19
|
+
const keyBytes = secretKey.match(/.{2}/g)?.map(byte => parseInt(byte, 16));
|
|
20
|
+
if (!keyBytes) {
|
|
21
|
+
throw new Error('Invalid secret key format');
|
|
22
|
+
}
|
|
23
|
+
// Convert key bytes to hex string for crypto-js
|
|
24
|
+
const keyHex = keyBytes.map(byte => byte.toString(16).padStart(2, '0')).join('');
|
|
25
|
+
// Generate HMAC-SHA256
|
|
26
|
+
const hash = HmacSHA256(message, Hex.parse(keyHex));
|
|
27
|
+
// Convert to uppercase hex string
|
|
28
|
+
return hash.toString(Hex).toUpperCase();
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
console.error('Error generating secure hash:', e);
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export default SecureHashUtil;
|
|
37
|
+
//# sourceMappingURL=SecureHashUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecureHashUtil.js","sourceRoot":"","sources":["../../src/utils/SecureHashUtil.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,uBAAuB,CAAC;AAC/C,OAAO,GAAG,MAAM,mBAAmB,CAAC;AAIpC,MAAM,cAAc;IAClB,MAAM,CAAC,eAAe,CAAC,SAAiB,EAAE,IAAa;QACrD,OAAO,IAAI,CAAC,eAAe,CAAC;QAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAEO,MAAM,CAAC,WAAW,CAAC,iBAA0B;QACnD,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;aAClD,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;aACrD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;aACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,OAAe,EAAE,SAAiB;QAClE,IAAI;YACF,mCAAmC;YACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAE3E,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;aAC9C;YAED,gDAAgD;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEjF,uBAAuB;YACvB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAEpD,kCAAkC;YAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;SACzC;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-amwal-pay",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "amwal pay",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/src/index.d.ts",
|
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"src",
|
|
17
17
|
"lib",
|
|
18
|
-
"android",
|
|
19
|
-
"ios",
|
|
20
18
|
"cpp",
|
|
21
19
|
"*.podspec",
|
|
22
20
|
"react-native.config.js",
|
|
@@ -163,5 +161,6 @@
|
|
|
163
161
|
"version": "0.50.3"
|
|
164
162
|
},
|
|
165
163
|
"dependencies": {
|
|
164
|
+
"crypto-js": "^4.2.0"
|
|
166
165
|
}
|
|
167
166
|
}
|