Skip to content

Commit 857e506

Browse files
authored
Merge pull request #13 from razorpay/f/features
[Urgent] Orders API, External Wallet Support
2 parents a6ccad4 + cf74ef6 commit 857e506

17 files changed

+325
-75
lines changed

RazorpayCheckout.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const razorpayEvents = new NativeEventEmitter(NativeModules.RazorpayEventEmitter
77
const removeSubscriptions = () => {
88
razorpayEvents.removeAllListeners('Razorpay::PAYMENT_SUCCESS');
99
razorpayEvents.removeAllListeners('Razorpay::PAYMENT_ERROR');
10+
razorpayEvents.removeAllListeners('Razorpay::EXTERNAL_WALLET_SELECTED');
1011
};
1112

1213
class RazorpayCheckout {
@@ -25,6 +26,12 @@ class RazorpayCheckout {
2526
NativeModules.RazorpayCheckout.open(options);
2627
});
2728
}
29+
static onExternalWalletSelection(externalWalletCallback) {
30+
razorpayEvents.addListener('Razorpay::EXTERNAL_WALLET_SELECTED', (data) => {
31+
externalWalletCallback(data);
32+
removeSubscriptions();
33+
});
34+
}
2835
}
2936

3037
export default RazorpayCheckout;

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ android {
1616

1717
dependencies {
1818
compile 'com.facebook.react:react-native:0.20.+'
19-
compile 'com.razorpay:checkout:1.2.0'
19+
compile 'com.razorpay:checkout:1.2.2'
2020
}
2121

android/src/main/java/com/razorpay/rn/RazorpayModule.java

Lines changed: 18 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,30 @@
1818
import com.razorpay.CheckoutActivity;
1919
import com.razorpay.PaymentData;
2020
import com.razorpay.PaymentResultWithDataListener;
21+
import com.razorpay.ExternalWalletListener;
2122
import com.razorpay.Checkout;
2223
import org.json.JSONArray;
2324
import org.json.JSONException;
2425
import org.json.JSONObject;
2526
import java.util.Iterator;
2627
import android.app.Activity;
27-
import javax.annotation.Nullable;
2828
import android.content.Intent;
2929
import android.os.Bundle;
3030

3131

3232

3333

3434

35-
public class RazorpayModule extends ReactContextBaseJavaModule implements ActivityEventListener, PaymentResultWithDataListener {
35+
public class RazorpayModule extends ReactContextBaseJavaModule implements ActivityEventListener, PaymentResultWithDataListener , ExternalWalletListener {
3636

3737

3838
public static final int RZP_REQUEST_CODE = 72967729;
3939
public static final String MAP_KEY_RZP_PAYMENT_ID = "razorpay_payment_id";
4040
public static final String MAP_KEY_PAYMENT_ID = "payment_id";
4141
public static final String MAP_KEY_ERROR_CODE = "code";
4242
public static final String MAP_KEY_ERROR_DESC = "description";
43+
public static final String MAP_KEY_PAYMENT_DETAILS = "details";
44+
public static final String MAP_KEY_WALLET_NAME="name";
4345
ReactApplicationContext reactContext;
4446
public RazorpayModule(ReactApplicationContext reactContext) {
4547
super(reactContext);
@@ -56,72 +58,24 @@ public String getName() {
5658
public void open(ReadableMap options) {
5759
Activity currentActivity = getCurrentActivity();
5860
try {
59-
JSONObject optionsJSON = readableMapToJson(options);
61+
JSONObject optionsJSON = Utils.readableMapToJson(options);
6062
Intent intent = new Intent(currentActivity, CheckoutActivity.class);
6163
intent.putExtra("OPTIONS", optionsJSON.toString());
6264
intent.putExtra("FRAMEWORK", "react_native");
6365
currentActivity.startActivityForResult(intent, Checkout.RZP_REQUEST_CODE);
6466
} catch (Exception e) {}
6567
}
66-
67-
68-
@Nullable
69-
private static JSONObject readableMapToJson(ReadableMap readableMap) {
70-
JSONObject jsonObject = new JSONObject();
71-
72-
if (readableMap == null) {
73-
return null;
74-
}
75-
76-
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
77-
if (!iterator.hasNextKey()) {
78-
return null;
79-
}
80-
81-
while (iterator.hasNextKey()) {
82-
String key = iterator.nextKey();
83-
ReadableType readableType = readableMap.getType(key);
84-
85-
try {
86-
switch (readableType) {
87-
case Null:
88-
jsonObject.put(key, null);
89-
break;
90-
case Boolean:
91-
jsonObject.put(key, readableMap.getBoolean(key));
92-
break;
93-
case Number:
94-
// Can be int or double.
95-
jsonObject.put(key, readableMap.getInt(key));
96-
break;
97-
case String:
98-
jsonObject.put(key, readableMap.getString(key));
99-
break;
100-
case Map:
101-
jsonObject.put(key, readableMapToJson(readableMap.getMap(key)));
102-
break;
103-
case Array:
104-
jsonObject.put(key, readableMap.getArray(key));
105-
default:
106-
// Do nothing and fail silently
107-
}
108-
} catch (JSONException ex) {
109-
// Do nothing and fail silently
110-
}
111-
}
112-
return jsonObject;
113-
}
11468

11569
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
11670
onActivityResult(requestCode, resultCode, data);
11771
}
11872

11973
@Override
12074
public void onActivityResult(int requestCode, int resultCode, Intent data){
121-
Checkout.handleActivityResult(getCurrentActivity(), requestCode, resultCode, data, this);
75+
Checkout.handleActivityResult(getCurrentActivity(), requestCode, resultCode, data, this, this);
12276
}
12377

124-
private void sendEvent(String eventName, @Nullable WritableMap params) {
78+
private void sendEvent(String eventName, WritableMap params) {
12579
reactContext
12680
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
12781
.emit(eventName, params);
@@ -131,6 +85,7 @@ private void sendEvent(String eventName, @Nullable WritableMap params) {
13185
public void onPaymentSuccess(String razorpayPaymentId, PaymentData paymentData) {
13286
WritableMap successParams = Arguments.createMap();
13387
successParams.putString(MAP_KEY_PAYMENT_ID, razorpayPaymentId);
88+
successParams.putMap(MAP_KEY_PAYMENT_DETAILS, Utils.jsonToWritableMap(paymentData.getData()));
13489
sendEvent("Razorpay::PAYMENT_SUCCESS", successParams);
13590
}
13691

@@ -139,7 +94,17 @@ public void onPaymentError(int code, String description, PaymentData paymentData
13994
WritableMap errorParams = Arguments.createMap();
14095
errorParams.putInt(MAP_KEY_ERROR_CODE, code);
14196
errorParams.putString(MAP_KEY_ERROR_DESC, description);
97+
errorParams.putMap(MAP_KEY_PAYMENT_DETAILS, Utils.jsonToWritableMap(paymentData.getData()));
14298
sendEvent("Razorpay::PAYMENT_ERROR", errorParams);
14399
}
144100

101+
@Override
102+
public void onExternalWalletSelected(String walletName, PaymentData paymentData){
103+
WritableMap params = Arguments.createMap();
104+
params.putString(MAP_KEY_WALLET_NAME, walletName);
105+
params.putMap(MAP_KEY_PAYMENT_DETAILS, Utils.jsonToWritableMap(paymentData.getData()));
106+
sendEvent("Razorpay::EXTERNAL_WALLET_SELECTED", params);
107+
108+
}
109+
145110
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package com.razorpay.rn;
2+
3+
import com.facebook.react.bridge.ReadableArray;
4+
import com.facebook.react.bridge.ReadableMap;
5+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
6+
import com.facebook.react.bridge.WritableArray;
7+
import com.facebook.react.bridge.WritableMap;
8+
import com.facebook.react.bridge.WritableNativeArray;
9+
import com.facebook.react.bridge.WritableNativeMap;
10+
11+
import org.json.JSONArray;
12+
import org.json.JSONException;
13+
import org.json.JSONObject;
14+
15+
import java.util.Iterator;
16+
17+
public class Utils {
18+
19+
public static JSONObject readableMapToJson(ReadableMap readableMap) {
20+
JSONObject object = new JSONObject();
21+
try {
22+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
23+
while (iterator.hasNextKey()) {
24+
String key = iterator.nextKey();
25+
switch (readableMap.getType(key)) {
26+
case Null:
27+
object.put(key, JSONObject.NULL);
28+
break;
29+
case Boolean:
30+
object.put(key, readableMap.getBoolean(key));
31+
break;
32+
case Number:
33+
object.put(key, readableMap.getDouble(key));
34+
break;
35+
case String:
36+
object.put(key, readableMap.getString(key));
37+
break;
38+
case Map:
39+
object.put(key, readableMapToJson(readableMap.getMap(key)));
40+
break;
41+
case Array:
42+
object.put(key, readableArrayToJson(readableMap.getArray(key)));
43+
break;
44+
}
45+
}
46+
47+
} catch(JSONException e){
48+
49+
}
50+
return object;
51+
}
52+
53+
public static JSONArray readableArrayToJson(ReadableArray readableArray) throws JSONException {
54+
JSONArray array = new JSONArray();
55+
for (int i = 0; i < readableArray.size(); i++) {
56+
switch (readableArray.getType(i)) {
57+
case Null:
58+
break;
59+
case Boolean:
60+
array.put(readableArray.getBoolean(i));
61+
break;
62+
case Number:
63+
array.put(readableArray.getDouble(i));
64+
break;
65+
case String:
66+
array.put(readableArray.getString(i));
67+
break;
68+
case Map:
69+
array.put(readableMapToJson(readableArray.getMap(i)));
70+
break;
71+
case Array:
72+
array.put(readableArrayToJson(readableArray.getArray(i)));
73+
break;
74+
}
75+
}
76+
return array;
77+
}
78+
79+
public static WritableMap jsonToWritableMap(JSONObject jsonObject) {
80+
WritableMap writableMap = new WritableNativeMap();
81+
try {
82+
Iterator iterator = jsonObject.keys();
83+
while(iterator.hasNext()) {
84+
String key = (String) iterator.next();
85+
Object value = jsonObject.get(key);
86+
if (value instanceof Float || value instanceof Double) {
87+
writableMap.putDouble(key, jsonObject.getDouble(key));
88+
} else if (value instanceof Number) {
89+
writableMap.putInt(key, jsonObject.getInt(key));
90+
} else if (value instanceof String) {
91+
writableMap.putString(key, jsonObject.getString(key));
92+
} else if (value instanceof JSONObject) {
93+
writableMap.putMap(key, jsonToWritableMap(jsonObject.getJSONObject(key)));
94+
} else if (value instanceof JSONArray){
95+
writableMap.putArray(key, jsonToWritableArray(jsonObject.getJSONArray(key)));
96+
} else if (value == JSONObject.NULL){
97+
writableMap.putNull(key);
98+
}
99+
}
100+
} catch(JSONException e){
101+
// Fail silently
102+
}
103+
return writableMap;
104+
}
105+
106+
public static WritableArray jsonToWritableArray(JSONArray jsonArray) {
107+
WritableArray writableArray = new WritableNativeArray();
108+
try {
109+
for(int i=0; i < jsonArray.length(); i++) {
110+
Object value = jsonArray.get(i);
111+
if (value instanceof Float || value instanceof Double) {
112+
writableArray.pushDouble(jsonArray.getDouble(i));
113+
} else if (value instanceof Number) {
114+
writableArray.pushInt(jsonArray.getInt(i));
115+
} else if (value instanceof String) {
116+
writableArray.pushString(jsonArray.getString(i));
117+
} else if (value instanceof JSONObject) {
118+
writableArray.pushMap(jsonToWritableMap(jsonArray.getJSONObject(i)));
119+
} else if (value instanceof JSONArray){
120+
writableArray.pushArray(jsonToWritableArray(jsonArray.getJSONArray(i)));
121+
} else if (value == JSONObject.NULL){
122+
writableArray.pushNull();
123+
}
124+
}
125+
} catch(JSONException e){
126+
// Fail silently
127+
}
128+
129+
return writableArray;
130+
}
131+
}

example/index.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ class example extends Component {
2929
currency: 'INR',
3030
key: 'rzp_test_1DP5mmOlF5G5ag',
3131
amount: '5000',
32+
external: {
33+
wallets: ['paytm']
34+
},
3235
name: 'foo',
3336
prefill: {
3437
@@ -39,11 +42,14 @@ class example extends Component {
3942
}
4043
RazorpayCheckout.open(options).then((data) => {
4144
// handle success
42-
alert(`Success: ${data.payment_id}`);
45+
alert(`Success: ${data.razorpay_payment_id}`);
4346
}).catch((error) => {
4447
// handle failure
4548
alert(`Error: ${error.code} | ${error.description}`);
4649
});
50+
RazorpayCheckout.onExternalWalletSelection(data => {
51+
alert(`External Wallet Selected: ${data.name} | ${data.details}`);
52+
});
4753
}}>
4854
<Text style = {styles.text}>Pay</Text>
4955
</TouchableHighlight>
@@ -66,4 +72,4 @@ const styles = StyleSheet.create({
6672
}
6773
});
6874

69-
AppRegistry.registerComponent('example', () => example);
75+
AppRegistry.registerComponent('example', () => example);
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// ExternalWalletSelectionProtocol.h
3+
// Razorpay
4+
//
5+
// Created by Akshay Bhalotia on 15/11/16.
6+
// Copyright © 2016 Razorpay. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
11+
@protocol ExternalWalletSelectionProtocol <NSObject>
12+
13+
- (void)onExternalWalletSelected:(nonnull NSString *)walletName
14+
WithPaymentData:(nullable NSDictionary *)paymentData;
15+
16+
@end

example/ios/Razorpay.framework/Versions/A/Headers/Razorpay.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,31 @@
66
// Copyright © 2016 Razorpay. All rights reserved.
77
//
88

9+
#import "ExternalWalletSelectionProtocol.h"
910
#import "RazorpayPaymentCompletionProtocol.h"
11+
#import "RazorpayPaymentCompletionProtocolWithData.h"
1012
#import <Foundation/Foundation.h>
1113
#import <UIKit/UIKit.h>
1214

1315
@interface Razorpay : NSObject
1416

17+
/*!
18+
@deprecated This method is deprecated. Use initWithKey:andDelegate: instead.
19+
See https://docs.razorpay.com/docs/ios for more information.
20+
*/
1521
+ (nonnull instancetype)
1622
initWithKey:(nonnull NSString *)key
1723
andDelegate:(nonnull id<RazorpayPaymentCompletionProtocol>)delegate
18-
forViewController:(nullable UIViewController *)vc;
24+
forViewController:(nullable UIViewController *)vc __attribute__((deprecated));
1925
+ (nonnull instancetype)
2026
initWithKey:(nonnull NSString *)key
2127
andDelegate:(nonnull id<RazorpayPaymentCompletionProtocol>)delegate;
28+
+ (nonnull instancetype)initWithKey:(nonnull NSString *)key
29+
andDelegateWithData:
30+
(nonnull id<RazorpayPaymentCompletionProtocolWithData>)
31+
delegate;
32+
- (void)setExternalWalletSelectionDelegate:
33+
(nonnull id<ExternalWalletSelectionProtocol>)walletDelegate;
2234
- (void)open:(nonnull NSDictionary *)options;
2335
- (void)close;
2436

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//
2+
// RazorpayPaymentCompletionProtocolWithData.h
3+
// Razorpay
4+
//
5+
// Created by Akshay Bhalotia on 27/09/16.
6+
// Copyright © 2016 Razorpay. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
11+
@protocol RazorpayPaymentCompletionProtocolWithData <NSObject>
12+
13+
- (void)onPaymentError:(int)code
14+
description:(nonnull NSString *)str
15+
andData:(nullable NSDictionary *)response;
16+
- (void)onPaymentSuccess:(nonnull NSString *)payment_id
17+
andData:(nullable NSDictionary *)response;
18+
19+
@end
Binary file not shown.

0 commit comments

Comments
 (0)