Subversion Repositories SmartDukaan

Rev

Rev 13286 | Rev 13518 | 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
 
3
import in.shop2020.thrift.clients.config.ConfigClient;
4
 
5
import java.io.BufferedReader;
6
import java.io.InputStreamReader;
7
import java.lang.reflect.Type;
8
import java.math.BigDecimal;
9
import java.security.MessageDigest;
10
import java.security.NoSuchAlgorithmException;
13352 amit.gupta 11
import java.text.SimpleDateFormat;
12
import java.util.ArrayList;
13286 amit.gupta 13
import java.util.Date;
14
import java.util.HashMap;
15
import java.util.List;
16
import java.util.Map;
13352 amit.gupta 17
import java.util.Map.Entry;
13286 amit.gupta 18
 
19
import org.apache.http.HttpResponse;
20
import org.apache.http.NameValuePair;
21
import org.apache.http.client.HttpClient;
22
import org.apache.http.client.entity.UrlEncodedFormEntity;
23
import org.apache.http.client.methods.HttpPost;
24
import org.apache.http.impl.client.DefaultHttpClient;
13352 amit.gupta 25
import org.apache.http.message.BasicNameValuePair;
13286 amit.gupta 26
import org.apache.log4j.Logger;
27
 
28
import com.google.gson.Gson;
29
import com.google.gson.GsonBuilder;
30
import com.google.gson.JsonArray;
31
import com.google.gson.JsonDeserializationContext;
32
import com.google.gson.JsonDeserializer;
33
import com.google.gson.JsonElement;
34
import com.google.gson.JsonObject;
35
import com.google.gson.JsonPrimitive;
13352 amit.gupta 36
import com.google.gson.reflect.TypeToken;
13286 amit.gupta 37
 
38
public class PayuPaymentHandler implements IPaymentHandler {
39
 
40
	private static Logger log = Logger.getLogger(Class.class);
41
 
42
	public static final String TXN_ID = "transactionId";
43
	public static final String PAYMENT_ID = "paymentId";
44
	public static final String AMOUNT = "amount";
45
	public static final String DATE_TIME = "dateTime";
46
	public static final String MODE = "mode";
47
	public static final String REF_NO = "referenceNo";
48
	public static final String TXN_TYPE = "transactionType";
49
 
50
	private static String apiUrl;
51
	private static String accountId;
52
	private static String secretKey;
53
 
54
	static {
55
		try {
56
			ConfigClient cc = ConfigClient.getClient();
57
			accountId = cc.get("payu_account_id");
58
			secretKey = cc.get("payu_secret_key");
59
			apiUrl = cc.get("payu_api_url");
60
		} catch (Exception e) {
61
			log.error("Could not initialize Payu Handler!");
62
		}
63
	}
64
 
13352 amit.gupta 65
	public static Map<String, String> captureTransaction(String paymentId,
66
			String payuId) {
13286 amit.gupta 67
		Map<String, String> params = new HashMap<String, String>();
68
		Map<String, String> resultMap = new HashMap<String, String>();
69
		params.put("key", accountId);
70
		params.put("command", "capture_transaction");
71
		params.put("var1", payuId);
72
		params.put("var2", new Date().getTime() + "");
73
		try {
74
			params.put("hash", getSecureHash(params));
75
		} catch (Exception e) {
76
			resultMap.put(ERR_CODE, Errors.CONN_FAILURE.code);
77
			resultMap.put(ERROR, Errors.CONN_FAILURE.message);
78
			return resultMap;
79
		}
80
		String postResponse = "";
81
		try {
82
			postResponse = executePost(apiUrl, getUrlParams(params));
83
		} catch (Exception e) {
84
			resultMap.put(ERR_CODE, Errors.CONN_FAILURE.code);
85
			resultMap.put(ERROR, Errors.CONN_FAILURE.message);
13352 amit.gupta 86
			return resultMap;
13286 amit.gupta 87
		}
88
		GsonBuilder gsonBuilder = new GsonBuilder();
89
		gsonBuilder
90
				.registerTypeAdapter(Object.class, new NaturalDeserializer());
91
		Gson gson = gsonBuilder.create();
13352 amit.gupta 92
		Type t = new TypeToken<Map<String,Object>>() {}.getType();
93
		Map<String, Object> postMap =  gson.fromJson(postResponse, t);
13286 amit.gupta 94
		if ("1".equals(postMap.get("status"))) {
95
			resultMap.put(CAPTURE_TXN_ID, params.get("var2"));
96
			resultMap.put(PAYMENT_ID, paymentId);
13352 amit.gupta 97
			resultMap.put(CAPTURE_TIME, new SimpleDateFormat().format(new Date()));
13286 amit.gupta 98
			resultMap.put(REF_NO, (String) postMap.get("bank_ref_num"));
13352 amit.gupta 99
			log.info("Parsed capture response:");
13286 amit.gupta 100
		}
13352 amit.gupta 101
		if ("0".equals(postMap.get("status"))) {
13286 amit.gupta 102
			resultMap.put(ERR_CODE, Errors.CAPTURE_FAILURE.code);
13352 amit.gupta 103
			resultMap.put(ERROR, (String)postMap.get("msg"));
13286 amit.gupta 104
		}
13352 amit.gupta 105
		for(Entry<String, String> entry : resultMap.entrySet()){
106
			log.info("Key: " + entry.getKey() + ", Value: " + entry.getValue());
107
		}
13286 amit.gupta 108
		return resultMap;
109
 
110
	}
111
 
13352 amit.gupta 112
	private static List<NameValuePair> getUrlParams(Map<String, String> params) {
113
		List<NameValuePair> pairs =  new ArrayList<NameValuePair>();
114
		for(Map.Entry<String, String> entry : params.entrySet()){
115
			pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
116
		}
117
		return pairs;
13286 amit.gupta 118
	}
119
 
13352 amit.gupta 120
	private static String getSecureHash(Map<String, String> params)
13286 amit.gupta 121
			throws NoSuchAlgorithmException {
122
		StringBuffer sb = new StringBuffer();
123
		String passString = sb.append(params.get("key")).append("|")
124
				.append(params.get("command")).append("|")
125
				.append(params.get("var1")).append("|").append(secretKey)
126
				.toString();
127
		MessageDigest md = MessageDigest.getInstance("SHA-512");
128
		md.update(passString.getBytes(), 0, passString.getBytes().length);
129
		byte[] mdbytes = md.digest();
130
		// convert the byte to hex format method
131
		for (int i = 0; i < mdbytes.length; i++) {
132
			sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16)
133
					.substring(1));
134
		}
135
		return sb.toString();
136
	}
137
 
138
	public static String executePost(String targetURL,
139
			List<NameValuePair> nameValuePairs) throws Exception {
140
		HttpClient client = new DefaultHttpClient();
141
		HttpPost post = new HttpPost(targetURL);
142
		post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
143
		HttpResponse response = client.execute(post);
144
		BufferedReader rd = new BufferedReader(new InputStreamReader(response
145
				.getEntity().getContent()));
146
		String line = "";
147
		StringBuffer sb = new StringBuffer();
148
		while ((line = rd.readLine()) != null) {
149
			sb.append(line);
150
		}
151
		return sb.toString();
152
	}
153
 
154
	private static class NaturalDeserializer implements
155
			JsonDeserializer<Object> {
156
		public Object deserialize(JsonElement json, Type typeOfT,
157
				JsonDeserializationContext context) {
158
			if (json.isJsonNull())
159
				return null;
160
			else if (json.isJsonPrimitive())
161
				return handlePrimitive(json.getAsJsonPrimitive());
162
			else if (json.isJsonArray())
163
				return handleArray(json.getAsJsonArray(), context);
164
			else
165
				return handleObject(json.getAsJsonObject(), context);
166
		}
167
 
168
		private Object handlePrimitive(JsonPrimitive json) {
169
			if (json.isBoolean())
170
				return json.getAsBoolean();
171
			else if (json.isString())
172
				return json.getAsString();
173
			else {
174
				BigDecimal bigDec = json.getAsBigDecimal();
175
				// Find out if it is an int type
176
				try {
177
					bigDec.toBigIntegerExact();
178
					try {
179
						return bigDec.intValueExact();
180
					} catch (ArithmeticException e) {
181
					}
182
					return bigDec.longValue();
183
				} catch (ArithmeticException e) {
184
				}
185
				// Just return it as a double
186
				return bigDec.doubleValue();
187
			}
188
		}
189
 
190
		private Object handleArray(JsonArray json,
191
				JsonDeserializationContext context) {
192
			Object[] array = new Object[json.size()];
193
			for (int i = 0; i < array.length; i++)
194
				array[i] = context.deserialize(json.get(i), Object.class);
195
			return array;
196
		}
197
 
198
		private Object handleObject(JsonObject json,
199
				JsonDeserializationContext context) {
200
			Map<String, Object> map = new HashMap<String, Object>();
201
			for (Map.Entry<String, JsonElement> entry : json.entrySet())
202
				map.put(entry.getKey(),
203
						context.deserialize(entry.getValue(), Object.class));
204
			return map;
205
		}
206
	}
13352 amit.gupta 207
 
208
	public static void main (String arg[]){
209
		String jsonText = "{\"amit\":\"Wonderful\", \"babu\":{\"a\":\"Awesome\"}}";
210
		GsonBuilder gsonBuilder = new GsonBuilder();
211
		gsonBuilder
212
				.registerTypeAdapter(Object.class, new NaturalDeserializer());
213
		Gson gson = gsonBuilder.create();
214
		Map<String, Object> postMap = (Map<String, Object>) gson.fromJson(
215
				jsonText, Object.class);
216
		System.out.println(postMap);
217
		System.out.println(new SimpleDateFormat().format(new Date()));
218
	}
13286 amit.gupta 219
}