Subversion Repositories SmartDukaan

Rev

Rev 13547 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13286 amit.gupta 1
package in.shop2020.payment.service.handler;
2
 
13518 amit.gupta 3
import in.shop2020.payment.domain.Payment;
13286 amit.gupta 4
import in.shop2020.thrift.clients.config.ConfigClient;
5
 
6
import java.io.BufferedReader;
7
import java.io.InputStreamReader;
8
import java.lang.reflect.Type;
9
import java.math.BigDecimal;
10
import java.security.MessageDigest;
11
import java.security.NoSuchAlgorithmException;
13352 amit.gupta 12
import java.text.SimpleDateFormat;
13
import java.util.ArrayList;
13286 amit.gupta 14
import java.util.Date;
15
import java.util.HashMap;
16
import java.util.List;
17
import java.util.Map;
13352 amit.gupta 18
import java.util.Map.Entry;
13286 amit.gupta 19
 
20
import org.apache.http.HttpResponse;
21
import org.apache.http.NameValuePair;
22
import org.apache.http.client.HttpClient;
23
import org.apache.http.client.entity.UrlEncodedFormEntity;
24
import org.apache.http.client.methods.HttpPost;
25
import org.apache.http.impl.client.DefaultHttpClient;
13352 amit.gupta 26
import org.apache.http.message.BasicNameValuePair;
13286 amit.gupta 27
import org.apache.log4j.Logger;
13540 amit.gupta 28
import org.json.JSONException;
29
import org.json.JSONObject;
13286 amit.gupta 30
 
31
import com.google.gson.Gson;
32
import com.google.gson.GsonBuilder;
33
import com.google.gson.JsonArray;
34
import com.google.gson.JsonDeserializationContext;
35
import com.google.gson.JsonDeserializer;
36
import com.google.gson.JsonElement;
37
import com.google.gson.JsonObject;
38
import com.google.gson.JsonPrimitive;
13352 amit.gupta 39
import com.google.gson.reflect.TypeToken;
13286 amit.gupta 40
 
41
public class PayuPaymentHandler implements IPaymentHandler {
42
 
43
	private static Logger log = Logger.getLogger(Class.class);
44
 
45
	public static final String TXN_ID = "transactionId";
46
	public static final String PAYMENT_ID = "paymentId";
47
	public static final String AMOUNT = "amount";
48
	public static final String DATE_TIME = "dateTime";
49
	public static final String MODE = "mode";
50
	public static final String REF_NO = "referenceNo";
51
	public static final String TXN_TYPE = "transactionType";
52
 
53
	private static String apiUrl;
54
	private static String accountId;
55
	private static String secretKey;
56
 
57
	static {
58
		try {
59
			ConfigClient cc = ConfigClient.getClient();
60
			accountId = cc.get("payu_account_id");
61
			secretKey = cc.get("payu_secret_key");
62
			apiUrl = cc.get("payu_api_url");
63
		} catch (Exception e) {
64
			log.error("Could not initialize Payu Handler!");
65
		}
66
	}
13518 amit.gupta 67
 
68
	public static Map<String, String> refundPayment(Payment payment, double amount){
69
		Map<String, String> params = new HashMap<String, String>();
70
		Map<String, String> resultMap = new HashMap<String, String>();
71
		String payuId = payment.getGatewayPaymentId();
72
		params.put("key", accountId);
73
		params.put("command", "cancel_refund_transaction");
74
		params.put("var1", payuId);
75
		params.put("var2", new Date().getTime() + "");
76
		params.put("var3", amount + "");
77
		try {
78
			params.put("hash", getSecureHash(params));
79
		} catch (Exception e) {
80
			resultMap.put(ERR_CODE, Errors.CONN_FAILURE.code);
81
			resultMap.put(ERROR, Errors.CONN_FAILURE.message);
82
			return resultMap;
83
		}
84
		String postResponse = "";
85
		try {
86
			postResponse = executePost(apiUrl, getUrlParams(params));
87
		} catch (Exception e) {
88
			resultMap.put(ERR_CODE, Errors.CONN_FAILURE.code);
89
			resultMap.put(ERROR, Errors.CONN_FAILURE.message);
90
			return resultMap;
91
		}
13538 amit.gupta 92
		log.info("postResponse====" + postResponse);
13540 amit.gupta 93
		JSONObject postMap = null;
94
		try {
95
			postMap = new JSONObject(postResponse);
96
 
97
			log.info("postMap.get(\"status\")=======" + postMap.get("status"));
98
			if (0 == ((Integer)postMap.get("status")).intValue()) {
99
				log.info("Some error occurred at Payu");
100
				resultMap.put(ERR_CODE, Errors.CAPTURE_FAILURE.code);
101
				resultMap.put(ERROR, (String)postMap.get("msg"));
102
			} else if (1 == ((Integer)postMap.get("status")).intValue()){
13548 amit.gupta 103
				System.out.println("in io block"); 
104
				if(!JSONObject.NULL.equals(postMap.get("bank_ref_num"))){ 
13546 amit.gupta 105
					resultMap.put(REF_NO, (String) postMap.get("bank_ref_num"));
106
				}
13548 amit.gupta 107
				System.out.println("after bankrefnum"); 
13540 amit.gupta 108
				if(postMap.get("txn_update_id")!= null) {
109
					resultMap.put("txn_update_id", (String)postMap.get("txn_update_id"));
110
				}
13548 amit.gupta 111
				System.out.println("after txn update"); 
13540 amit.gupta 112
				if(postMap.get("request_id")!=null){
13547 amit.gupta 113
					resultMap.put("txn_update_id", (String)postMap.get("request_id"));
13540 amit.gupta 114
				}
13548 amit.gupta 115
				System.out.println("after request_id"); 
13547 amit.gupta 116
				resultMap.put("mihpayid", ((Integer)postMap.get("mihpayid")).toString());
13548 amit.gupta 117
				System.out.println("after mihpayid"); 
13540 amit.gupta 118
				resultMap.put("msg", (String)postMap.get("msg"));
119
			}
120
		} catch (JSONException e) {
121
			log.error("Could not Parse json");
13518 amit.gupta 122
			resultMap.put(ERR_CODE, Errors.CAPTURE_FAILURE.code);
13540 amit.gupta 123
			resultMap.put(ERROR, "Could not parse refund");
13518 amit.gupta 124
		}
125
		log.info("Parsed refund response for payment" + payment.getId());
126
		return resultMap;
127
	}
13286 amit.gupta 128
 
13352 amit.gupta 129
	public static Map<String, String> captureTransaction(String paymentId,
130
			String payuId) {
13286 amit.gupta 131
		Map<String, String> params = new HashMap<String, String>();
132
		Map<String, String> resultMap = new HashMap<String, String>();
133
		params.put("key", accountId);
134
		params.put("command", "capture_transaction");
135
		params.put("var1", payuId);
136
		params.put("var2", new Date().getTime() + "");
137
		try {
138
			params.put("hash", getSecureHash(params));
139
		} catch (Exception e) {
140
			resultMap.put(ERR_CODE, Errors.CONN_FAILURE.code);
141
			resultMap.put(ERROR, Errors.CONN_FAILURE.message);
142
			return resultMap;
143
		}
144
		String postResponse = "";
145
		try {
146
			postResponse = executePost(apiUrl, getUrlParams(params));
147
		} catch (Exception e) {
148
			resultMap.put(ERR_CODE, Errors.CONN_FAILURE.code);
149
			resultMap.put(ERROR, Errors.CONN_FAILURE.message);
13352 amit.gupta 150
			return resultMap;
13286 amit.gupta 151
		}
152
		GsonBuilder gsonBuilder = new GsonBuilder();
153
		gsonBuilder
154
				.registerTypeAdapter(Object.class, new NaturalDeserializer());
155
		Gson gson = gsonBuilder.create();
13352 amit.gupta 156
		Type t = new TypeToken<Map<String,Object>>() {}.getType();
157
		Map<String, Object> postMap =  gson.fromJson(postResponse, t);
13286 amit.gupta 158
		if ("1".equals(postMap.get("status"))) {
159
			resultMap.put(CAPTURE_TXN_ID, params.get("var2"));
160
			resultMap.put(PAYMENT_ID, paymentId);
13352 amit.gupta 161
			resultMap.put(CAPTURE_TIME, new SimpleDateFormat().format(new Date()));
13286 amit.gupta 162
			resultMap.put(REF_NO, (String) postMap.get("bank_ref_num"));
13352 amit.gupta 163
			log.info("Parsed capture response:");
13286 amit.gupta 164
		}
13352 amit.gupta 165
		if ("0".equals(postMap.get("status"))) {
13286 amit.gupta 166
			resultMap.put(ERR_CODE, Errors.CAPTURE_FAILURE.code);
13352 amit.gupta 167
			resultMap.put(ERROR, (String)postMap.get("msg"));
13286 amit.gupta 168
		}
13352 amit.gupta 169
		for(Entry<String, String> entry : resultMap.entrySet()){
170
			log.info("Key: " + entry.getKey() + ", Value: " + entry.getValue());
171
		}
13286 amit.gupta 172
		return resultMap;
173
 
174
	}
175
 
13352 amit.gupta 176
	private static List<NameValuePair> getUrlParams(Map<String, String> params) {
177
		List<NameValuePair> pairs =  new ArrayList<NameValuePair>();
178
		for(Map.Entry<String, String> entry : params.entrySet()){
179
			pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
180
		}
181
		return pairs;
13286 amit.gupta 182
	}
183
 
13352 amit.gupta 184
	private static String getSecureHash(Map<String, String> params)
13286 amit.gupta 185
			throws NoSuchAlgorithmException {
186
		StringBuffer sb = new StringBuffer();
187
		String passString = sb.append(params.get("key")).append("|")
188
				.append(params.get("command")).append("|")
189
				.append(params.get("var1")).append("|").append(secretKey)
190
				.toString();
191
		MessageDigest md = MessageDigest.getInstance("SHA-512");
192
		md.update(passString.getBytes(), 0, passString.getBytes().length);
193
		byte[] mdbytes = md.digest();
194
		// convert the byte to hex format method
13535 amit.gupta 195
		StringBuffer sb1 = new StringBuffer();
13286 amit.gupta 196
		for (int i = 0; i < mdbytes.length; i++) {
13535 amit.gupta 197
			sb1.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16)
13286 amit.gupta 198
					.substring(1));
199
		}
13535 amit.gupta 200
		return sb1.toString();
13286 amit.gupta 201
	}
202
 
203
	public static String executePost(String targetURL,
204
			List<NameValuePair> nameValuePairs) throws Exception {
205
		HttpClient client = new DefaultHttpClient();
206
		HttpPost post = new HttpPost(targetURL);
207
		post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
208
		HttpResponse response = client.execute(post);
209
		BufferedReader rd = new BufferedReader(new InputStreamReader(response
210
				.getEntity().getContent()));
211
		String line = "";
212
		StringBuffer sb = new StringBuffer();
213
		while ((line = rd.readLine()) != null) {
214
			sb.append(line);
215
		}
216
		return sb.toString();
217
	}
218
 
219
	private static class NaturalDeserializer implements
220
			JsonDeserializer<Object> {
221
		public Object deserialize(JsonElement json, Type typeOfT,
222
				JsonDeserializationContext context) {
223
			if (json.isJsonNull())
224
				return null;
225
			else if (json.isJsonPrimitive())
226
				return handlePrimitive(json.getAsJsonPrimitive());
227
			else if (json.isJsonArray())
228
				return handleArray(json.getAsJsonArray(), context);
229
			else
230
				return handleObject(json.getAsJsonObject(), context);
231
		}
232
 
233
		private Object handlePrimitive(JsonPrimitive json) {
234
			if (json.isBoolean())
235
				return json.getAsBoolean();
236
			else if (json.isString())
237
				return json.getAsString();
238
			else {
239
				BigDecimal bigDec = json.getAsBigDecimal();
240
				// Find out if it is an int type
241
				try {
242
					bigDec.toBigIntegerExact();
243
					try {
244
						return bigDec.intValueExact();
245
					} catch (ArithmeticException e) {
246
					}
247
					return bigDec.longValue();
248
				} catch (ArithmeticException e) {
249
				}
250
				// Just return it as a double
251
				return bigDec.doubleValue();
252
			}
253
		}
254
 
255
		private Object handleArray(JsonArray json,
256
				JsonDeserializationContext context) {
257
			Object[] array = new Object[json.size()];
258
			for (int i = 0; i < array.length; i++)
259
				array[i] = context.deserialize(json.get(i), Object.class);
260
			return array;
261
		}
262
 
263
		private Object handleObject(JsonObject json,
264
				JsonDeserializationContext context) {
265
			Map<String, Object> map = new HashMap<String, Object>();
266
			for (Map.Entry<String, JsonElement> entry : json.entrySet())
267
				map.put(entry.getKey(),
268
						context.deserialize(entry.getValue(), Object.class));
269
			return map;
270
		}
271
	}
13352 amit.gupta 272
 
273
	public static void main (String arg[]){
13546 amit.gupta 274
		String jsonText = "{\"amit\":0, \"babu\":{\"a\":null}, \"Raka\": null}";
13540 amit.gupta 275
/*		System.out.println(jsonText);
13352 amit.gupta 276
		GsonBuilder gsonBuilder = new GsonBuilder();
277
		gsonBuilder
278
				.registerTypeAdapter(Object.class, new NaturalDeserializer());
279
		Gson gson = gsonBuilder.create();
13539 amit.gupta 280
		Type t = new TypeToken<Map<String,Object>>() {}.getType();
281
		Map<String, Object> postMap =  gson.fromJson(jsonText, t);
13540 amit.gupta 282
		Map<String, Object> postMap = (Map<String, Object>) gson.fromJson(
283
				jsonText, Object.class);
13352 amit.gupta 284
		System.out.println(postMap);
13540 amit.gupta 285
		System.out.println(0 == ((Integer)postMap.get("amit")).intValue());*/
286
		try {
13548 amit.gupta 287
			String postResponse = "{\"status\":1,\"msg\":\"Refund Request Queued\",\"request_id\":\"172046358\",\"bank_ref_num\":null,\"mihpayid\":251494242,\"error_code\":102}";
288
			JSONObject postMap = new JSONObject(postResponse);
289
			String a = "";
290
			log.info("postMap.get(\"status\")=======" + postMap.get("status"));
291
			if (0 == ((Integer)postMap.get("status")).intValue()) {
292
				log.info("Some error occurred at Payu");
293
				a= (String)postMap.get("msg");
294
			} else if (1 == ((Integer)postMap.get("status")).intValue()){
295
				System.out.println("in io block"); 
296
				System.out.println(postMap.get("bank_ref_num").getClass());
297
				if(postMap.get("bank_ref_num")!=null){ 
298
					a = (String) postMap.get("bank_ref_num");
299
				}
300
				System.out.println("after bankrefnum"); 
301
				if(postMap.get("txn_update_id")!= null) {
302
					a = (String)postMap.get("txn_update_id");
303
				}
304
				System.out.println("after txn update"); 
305
				if(JSONObject.NULL.equals(postMap.get("request_id"))){
306
					a = (String)postMap.get("request_id");
307
				}
308
				System.out.println("after request_id"); 
309
				((Integer)postMap.get("mihpayid")).toString();
310
				System.out.println("after mihpayid"); 
311
				a = (String)postMap.get("msg");
312
			}
13540 amit.gupta 313
		} catch (JSONException e) {
13548 amit.gupta 314
			System.out.println("in catch");
13540 amit.gupta 315
		}
13352 amit.gupta 316
	}
13286 amit.gupta 317
}