Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
1905 chandransh 1
package in.shop2020.serving.controllers;
2
 
3
import in.shop2020.config.ConfigException;
2263 vikas 4
import in.shop2020.datalogger.EventType;
6058 anupam.sin 5
import in.shop2020.model.v1.order.RechargeOrder;
6050 anupam.sin 6
import in.shop2020.model.v1.order.RechargeOrderStatus;
1905 chandransh 7
import in.shop2020.payments.Attribute;
8
import in.shop2020.payments.Payment;
9
import in.shop2020.payments.PaymentException;
10
import in.shop2020.payments.PaymentStatus;
11
import in.shop2020.serving.services.CommonPaymentService;
12
import in.shop2020.serving.utils.ebs.Base64;
13
import in.shop2020.serving.utils.ebs.RC4;
3126 rajveer 14
import in.shop2020.thrift.clients.PaymentClient;
15
import in.shop2020.thrift.clients.TransactionClient;
16
import in.shop2020.thrift.clients.UserClient;
1905 chandransh 17
import in.shop2020.thrift.clients.config.ConfigClient;
2511 vikas 18
import in.shop2020.utils.DataLogger;
1905 chandransh 19
 
2419 vikas 20
import java.io.BufferedReader;
21
import java.io.ByteArrayInputStream;
22
import java.io.IOException;
23
import java.io.InputStreamReader;
24
import java.util.ArrayList;
25
import java.util.List;
26
import java.util.Map;
27
import java.util.StringTokenizer;
28
import java.util.TreeMap;
29
 
1905 chandransh 30
import javax.servlet.http.HttpServletRequest;
31
 
32
import org.apache.log4j.Logger;
33
import org.apache.thrift.TException;
34
 
2118 chandransh 35
@SuppressWarnings("serial")
36
public class EbsPayResponseController extends BaseController{
2673 vikas 37
 
1905 chandransh 38
	private static Logger log = Logger.getLogger(Class.class);
2673 vikas 39
 
1905 chandransh 40
	private static final String FLAG_KEY = "IsFlagged";
41
	private static final String TXN_KEY = "TransactionID";
42
	private static final String AUTH_TXN_ID = "AuthTxnId";
2673 vikas 43
 
1905 chandransh 44
	private static String successUrl;
45
	private static String errorUrl;
6050 anupam.sin 46
	private static String rechargeResultUri;
2673 vikas 47
 
1905 chandransh 48
	/**
49
	 * The secret key used to decode RC4 encoded data.
50
	 */
51
	private static String accountKey;
2673 vikas 52
 
1905 chandransh 53
	private String redirectUrl;
2673 vikas 54
 
1905 chandransh 55
	static{
56
		try {
57
			successUrl = ConfigClient.getClient().get("ebs_success_url");
58
			errorUrl = ConfigClient.getClient().get("ebs_error_url");
6050 anupam.sin 59
			setRechargeResultUri(ConfigClient.getClient().get("recharge_success_url"));
1905 chandransh 60
			accountKey = ConfigClient.getClient().get("ebs_secret_key");
61
		} catch (ConfigException e) {
62
			log.error("Unable to get success and error usr info from config server.");
63
		}
64
	}
2673 vikas 65
 
2681 vikas 66
	private Map<String, String> paymentParams = new TreeMap<String, String>();
2673 vikas 67
 
1905 chandransh 68
	public String index() {
69
		StringBuffer data1 = new StringBuffer(request.getParameter("DR"));
70
		log.info("Received data string: " + data1.toString());
71
		byte[] result = decodeRecvdData(data1);
72
 
73
		String recvString = parseRecvdData(result);
74
		updatePaymentParams(recvString);
2673 vikas 75
 
3126 rajveer 76
		PaymentClient paymentServiceClient = null;
77
		TransactionClient transactionServiceClient = null;
78
		UserClient userServiceClient = null;
1905 chandransh 79
		try {
3126 rajveer 80
			paymentServiceClient = new PaymentClient();
81
			transactionServiceClient = new TransactionClient();
82
			userServiceClient = new UserClient();
1905 chandransh 83
		} catch (Exception e) {
2942 chandransh 84
			log.error("Unable to initialize one of the clients", e);
1905 chandransh 85
		}
2673 vikas 86
 
87
 
1905 chandransh 88
		long merchantPaymentId = Long.parseLong(paymentParams.get("MerchantRefNo"));
89
		String gatewayPaymentId = paymentParams.get("PaymentID");
90
		double amount = Double.parseDouble(paymentParams.get("Amount"));
91
		String isFlagged = paymentParams.get(FLAG_KEY);
92
		String gatewayTxnStatus = paymentParams.get("ResponseCode");
93
		String description = paymentParams.get("ResponseMessage");
94
		String authTxnId = paymentParams.get(TXN_KEY);
2673 vikas 95
 
96
 
1905 chandransh 97
		List<Attribute> attributes = new ArrayList<Attribute>();
98
		attributes.add(new Attribute(FLAG_KEY, isFlagged));
99
		attributes.add(new Attribute(AUTH_TXN_ID, authTxnId));
2673 vikas 100
 
1905 chandransh 101
		Payment payment = null;
102
		Long txnId = null;
103
		try {
104
			payment = paymentServiceClient.getClient().getPayment(merchantPaymentId);
105
			txnId = payment.getMerchantTxnId();
106
		} catch (PaymentException e1) {
2334 chandransh 107
			log.error("Payment exception. It is serious, check merchant payment id + " + merchantPaymentId, e1);
1905 chandransh 108
		} catch (TException e1) {
2334 chandransh 109
			log.error("Thrift exception. Check payment id "+ merchantPaymentId, e1);
1905 chandransh 110
		}
2673 vikas 111
 
2118 chandransh 112
		if(payment.getStatus() != PaymentStatus.INIT){
113
			// We have already processed a response for this payment. Processing
114
			// it again may fail his orders. So, let's ask him to check his
115
			// account.
116
			return "maybe";
117
		}
2673 vikas 118
 
1905 chandransh 119
		if(!validatePaymentParams(amount, payment)){
2118 chandransh 120
			this.redirectUrl = errorUrl + "?paymentId=" + merchantPaymentId;
1905 chandransh 121
			return "index";
122
		}
2673 vikas 123
 
1905 chandransh 124
		if(gatewayTxnStatus.equals("0")){
4246 rajveer 125
			//Update payment status as authorized if payment is authorized.
1905 chandransh 126
			try {
127
				paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
128
						"", gatewayTxnStatus, description, "", "", "", "", PaymentStatus.AUTHORIZED, "", attributes);
129
			} catch (PaymentException e) {
2942 chandransh 130
				log.error("Unable to mark the payment as authorized", e);
1905 chandransh 131
			} catch (TException e) {
2942 chandransh 132
			    log.error("Unable to mark the payment as authorized", e);
1905 chandransh 133
			}
6050 anupam.sin 134
 
135
			if(payment.isIsDigital()) {
136
			    try {
6058 anupam.sin 137
			        RechargeOrder rechargeOrder = transactionServiceClient.getClient().getRechargeOrdersForTransaction(txnId);
138
                    transactionServiceClient.getClient().updateRechargeOrderStatus(rechargeOrder.getId(), RechargeOrderStatus.PAYMENT_SUCCESSFUL);
6050 anupam.sin 139
                } catch (Exception e) {
140
                    // TODO Auto-generated catch block
141
                    e.printStackTrace();
142
                }
143
                this.redirectUrl = rechargeResultUri + "?paymentId=" + merchantPaymentId;
144
			} else {
1905 chandransh 145
 
6050 anupam.sin 146
			    if(isFlagged.equals("YES")){
147
			        CommonPaymentService.processSuccessfulTxn(txnId, userServiceClient, transactionServiceClient, true);
148
			        this.redirectUrl = successUrl + "?paymentId=" + merchantPaymentId;
149
			    }else{
150
			        CommonPaymentService.processSuccessfulTxn(txnId, userServiceClient, transactionServiceClient, false);
151
			        this.redirectUrl = successUrl + "?paymentId=" + merchantPaymentId;	
152
			    }
4246 rajveer 153
			}
3010 chandransh 154
 
4246 rajveer 155
 
3010 chandransh 156
//			Map<String, String> captureResult = EbsPaymentService.capturePayment(payment, gatewayPaymentId);
157
//			String captureStatus = captureResult.get(IPaymentService.STATUS);
158
//
159
//			if("".equals(captureStatus)){
160
//				//Failure
161
//				description = captureResult.get(EbsPaymentService.ERROR);
162
//				String errorCode = captureResult.get(EbsPaymentService.ERR_CODE);
163
//				try {
164
//					paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
165
//							"", gatewayTxnStatus, description, "", "", "", errorCode, PaymentStatus.FAILED, "", attributes);
166
//				} catch (PaymentException e) {
167
//					log.error("Error while updating failed capture payment attempt: ", e);
168
//				} catch (TException e) {
169
//					log.error("Error while updating failed capture payment attempt: ", e);
170
//				}
3224 vikas 171
//				DataLogger.logData(EventType.PAYMENT_FAILURE, getSessionId(), userinfo.getUserId(), userinfo.getEmail(), Long.toString(merchantPaymentId), gatewayPaymentId,
3010 chandransh 172
//                        gatewayTxnStatus, description, errorCode);
173
//				this.redirectUrl = errorUrl + "?paymentId=" + merchantPaymentId;
174
//			}else{
175
//				//Success
176
//				try {
177
//					attributes.add(new Attribute(IPaymentService.CAPTURE_TXN_ID, captureResult.get(IPaymentService.CAPTURE_TXN_ID)));
178
//					attributes.add(new Attribute(IPaymentService.CAPTURE_TIME, captureResult.get(IPaymentService.CAPTURE_TIME)));
179
//
180
//					paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
181
//							"", captureStatus, description, "", "", "", "", PaymentStatus.SUCCESS, "", attributes);
182
//				} catch (PaymentException e) {
183
//					log.error("Error while updating successful capture payment attempt: ", e);
184
//				} catch (TException e) {
185
//					log.error("Error while updating successful capture payment attempt: ", e);
186
//				}
187
//
188
//				CommonPaymentService.processSuccessfulTxn(txnId, userServiceClient, transactionServiceClient);
189
//
190
//				this.redirectUrl = successUrl + "?paymentId=" + merchantPaymentId;
191
//			}
1905 chandransh 192
		}else{
193
			try {
194
				paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
195
						"", gatewayTxnStatus, description, "", "", "", "", PaymentStatus.FAILED, "", attributes);
196
			} catch (PaymentException e) {
2942 chandransh 197
			    log.error("Unable to mark the payment as failed", e);
1905 chandransh 198
			} catch (TException e) {
2942 chandransh 199
			    log.error("Unable to mark the payment as failed", e);
1905 chandransh 200
			}
6050 anupam.sin 201
			if(!payment.isIsDigital()) {
1905 chandransh 202
			CommonPaymentService.processFailedTxn(txnId, transactionServiceClient);
3185 vikas 203
			DataLogger.logData(EventType.PAYMENT_FAILURE, getSessionId(), userinfo.getUserId(), userinfo.getEmail(), Long.toString(merchantPaymentId), gatewayPaymentId,
2157 vikas 204
                    gatewayTxnStatus, description);
1905 chandransh 205
 
206
			this.redirectUrl = errorUrl + "?paymentId=" + merchantPaymentId;
6050 anupam.sin 207
			} else {
208
			    this.redirectUrl = rechargeResultUri + "?paymentId=" + merchantPaymentId;
209
			}
1905 chandransh 210
		}
2673 vikas 211
 
1905 chandransh 212
		log.info("User will be redirected to: " + this.redirectUrl);
213
		return "index";
214
	}
2673 vikas 215
 
2134 chandransh 216
	private boolean validatePaymentParams(double returnedAmount, Payment payment){
217
		if(!(payment != null && Math.abs(payment.getAmount() - returnedAmount) <= 0.50)){
1905 chandransh 218
			// We did not request this payment or the authorised amount is different.
219
			log.error("Checks and balance failed on returned data");
220
			return false;
221
		}
222
		return true;
223
	}
224
 
225
	private byte[] decodeRecvdData(StringBuffer data1) {
226
		for (int i = 0; i < data1.length(); i++) {
227
			if (data1.charAt(i) == ' ')
228
				data1.setCharAt(i, '+');
229
		}
2673 vikas 230
 
1905 chandransh 231
		Base64 base64 = new Base64();
232
		byte[] data = base64.decode(data1.toString());
233
		RC4 rc4 = new RC4(accountKey);
234
		byte[] result = rc4.rc4(data);
235
		return result;
236
	}
237
 
238
	private String parseRecvdData(byte[] result) {
239
		ByteArrayInputStream byteIn = new ByteArrayInputStream(result, 0, result.length);
2118 chandransh 240
		BufferedReader reader = new BufferedReader(new InputStreamReader(byteIn));
1905 chandransh 241
		String recvString1 = "";
242
		String recvString = "";
243
		try {
2118 chandransh 244
			recvString1 = reader.readLine();
1905 chandransh 245
			int lineCount = 0;
246
			while (recvString1 != null) {
247
				lineCount++;
248
				if (lineCount > 705)
249
					break;
250
				recvString += recvString1 + "\n";
2118 chandransh 251
				recvString1 = reader.readLine();
1905 chandransh 252
			}
253
		} catch (IOException e) {
2942 chandransh 254
			log.error("Unable to read from Ebs response", e);
1905 chandransh 255
		}
256
		recvString = recvString.replace("=&", "=--&");
257
		return recvString;
258
	}
259
 
260
	private void updatePaymentParams(String str){
261
		StringTokenizer st = new StringTokenizer(str, "=&");
2673 vikas 262
		String key, value;
1905 chandransh 263
		while(st.hasMoreTokens()) {
264
			key = st.nextToken();
265
			value = st.nextToken();
266
			log.info("Key: " + key + ", Value: " + value);
267
			paymentParams.put(key, value);
268
		}
269
	}
2673 vikas 270
 
1905 chandransh 271
	public String getRedirectUrl(){
272
		return this.redirectUrl;
273
	}
2673 vikas 274
 
1905 chandransh 275
	@Override
276
	public void setServletRequest(HttpServletRequest request) {
277
		this.request = request;
278
	}
279
 
280
	public Map<String, String> getPaymentParams() {
281
		return paymentParams;
282
	}
6050 anupam.sin 283
 
284
    public static void setRechargeResultUri(String rechargeResultUri) {
285
        EbsPayResponseController.rechargeResultUri = rechargeResultUri;
286
    }
287
 
288
    public static String getRechargeResultUri() {
289
        return rechargeResultUri;
290
    }
1905 chandransh 291
}