Subversion Repositories SmartDukaan

Rev

Rev 4246 | Rev 6058 | 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;
6050 anupam.sin 5
import in.shop2020.model.v1.order.RechargeOrderStatus;
6
import in.shop2020.model.v1.order.TransactionServiceException;
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 {
137
                    transactionServiceClient.getClient().updateRechargeOrderStatus(txnId, RechargeOrderStatus.PAYMENT_SUCCESSFUL);
138
                } catch (Exception e) {
139
                    // TODO Auto-generated catch block
140
                    e.printStackTrace();
141
                }
142
                this.redirectUrl = rechargeResultUri + "?paymentId=" + merchantPaymentId;
143
			} else {
1905 chandransh 144
 
6050 anupam.sin 145
			    if(isFlagged.equals("YES")){
146
			        CommonPaymentService.processSuccessfulTxn(txnId, userServiceClient, transactionServiceClient, true);
147
			        this.redirectUrl = successUrl + "?paymentId=" + merchantPaymentId;
148
			    }else{
149
			        CommonPaymentService.processSuccessfulTxn(txnId, userServiceClient, transactionServiceClient, false);
150
			        this.redirectUrl = successUrl + "?paymentId=" + merchantPaymentId;	
151
			    }
4246 rajveer 152
			}
3010 chandransh 153
 
4246 rajveer 154
 
3010 chandransh 155
//			Map<String, String> captureResult = EbsPaymentService.capturePayment(payment, gatewayPaymentId);
156
//			String captureStatus = captureResult.get(IPaymentService.STATUS);
157
//
158
//			if("".equals(captureStatus)){
159
//				//Failure
160
//				description = captureResult.get(EbsPaymentService.ERROR);
161
//				String errorCode = captureResult.get(EbsPaymentService.ERR_CODE);
162
//				try {
163
//					paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
164
//							"", gatewayTxnStatus, description, "", "", "", errorCode, PaymentStatus.FAILED, "", attributes);
165
//				} catch (PaymentException e) {
166
//					log.error("Error while updating failed capture payment attempt: ", e);
167
//				} catch (TException e) {
168
//					log.error("Error while updating failed capture payment attempt: ", e);
169
//				}
3224 vikas 170
//				DataLogger.logData(EventType.PAYMENT_FAILURE, getSessionId(), userinfo.getUserId(), userinfo.getEmail(), Long.toString(merchantPaymentId), gatewayPaymentId,
3010 chandransh 171
//                        gatewayTxnStatus, description, errorCode);
172
//				this.redirectUrl = errorUrl + "?paymentId=" + merchantPaymentId;
173
//			}else{
174
//				//Success
175
//				try {
176
//					attributes.add(new Attribute(IPaymentService.CAPTURE_TXN_ID, captureResult.get(IPaymentService.CAPTURE_TXN_ID)));
177
//					attributes.add(new Attribute(IPaymentService.CAPTURE_TIME, captureResult.get(IPaymentService.CAPTURE_TIME)));
178
//
179
//					paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
180
//							"", captureStatus, description, "", "", "", "", PaymentStatus.SUCCESS, "", attributes);
181
//				} catch (PaymentException e) {
182
//					log.error("Error while updating successful capture payment attempt: ", e);
183
//				} catch (TException e) {
184
//					log.error("Error while updating successful capture payment attempt: ", e);
185
//				}
186
//
187
//				CommonPaymentService.processSuccessfulTxn(txnId, userServiceClient, transactionServiceClient);
188
//
189
//				this.redirectUrl = successUrl + "?paymentId=" + merchantPaymentId;
190
//			}
1905 chandransh 191
		}else{
192
			try {
193
				paymentServiceClient.getClient().updatePaymentDetails(merchantPaymentId, gatewayPaymentId,
194
						"", gatewayTxnStatus, description, "", "", "", "", PaymentStatus.FAILED, "", attributes);
195
			} catch (PaymentException e) {
2942 chandransh 196
			    log.error("Unable to mark the payment as failed", e);
1905 chandransh 197
			} catch (TException e) {
2942 chandransh 198
			    log.error("Unable to mark the payment as failed", e);
1905 chandransh 199
			}
6050 anupam.sin 200
			if(!payment.isIsDigital()) {
1905 chandransh 201
			CommonPaymentService.processFailedTxn(txnId, transactionServiceClient);
3185 vikas 202
			DataLogger.logData(EventType.PAYMENT_FAILURE, getSessionId(), userinfo.getUserId(), userinfo.getEmail(), Long.toString(merchantPaymentId), gatewayPaymentId,
2157 vikas 203
                    gatewayTxnStatus, description);
1905 chandransh 204
 
205
			this.redirectUrl = errorUrl + "?paymentId=" + merchantPaymentId;
6050 anupam.sin 206
			} else {
207
			    this.redirectUrl = rechargeResultUri + "?paymentId=" + merchantPaymentId;
208
			}
1905 chandransh 209
		}
2673 vikas 210
 
1905 chandransh 211
		log.info("User will be redirected to: " + this.redirectUrl);
212
		return "index";
213
	}
2673 vikas 214
 
2134 chandransh 215
	private boolean validatePaymentParams(double returnedAmount, Payment payment){
216
		if(!(payment != null && Math.abs(payment.getAmount() - returnedAmount) <= 0.50)){
1905 chandransh 217
			// We did not request this payment or the authorised amount is different.
218
			log.error("Checks and balance failed on returned data");
219
			return false;
220
		}
221
		return true;
222
	}
223
 
224
	private byte[] decodeRecvdData(StringBuffer data1) {
225
		for (int i = 0; i < data1.length(); i++) {
226
			if (data1.charAt(i) == ' ')
227
				data1.setCharAt(i, '+');
228
		}
2673 vikas 229
 
1905 chandransh 230
		Base64 base64 = new Base64();
231
		byte[] data = base64.decode(data1.toString());
232
		RC4 rc4 = new RC4(accountKey);
233
		byte[] result = rc4.rc4(data);
234
		return result;
235
	}
236
 
237
	private String parseRecvdData(byte[] result) {
238
		ByteArrayInputStream byteIn = new ByteArrayInputStream(result, 0, result.length);
2118 chandransh 239
		BufferedReader reader = new BufferedReader(new InputStreamReader(byteIn));
1905 chandransh 240
		String recvString1 = "";
241
		String recvString = "";
242
		try {
2118 chandransh 243
			recvString1 = reader.readLine();
1905 chandransh 244
			int lineCount = 0;
245
			while (recvString1 != null) {
246
				lineCount++;
247
				if (lineCount > 705)
248
					break;
249
				recvString += recvString1 + "\n";
2118 chandransh 250
				recvString1 = reader.readLine();
1905 chandransh 251
			}
252
		} catch (IOException e) {
2942 chandransh 253
			log.error("Unable to read from Ebs response", e);
1905 chandransh 254
		}
255
		recvString = recvString.replace("=&", "=--&");
256
		return recvString;
257
	}
258
 
259
	private void updatePaymentParams(String str){
260
		StringTokenizer st = new StringTokenizer(str, "=&");
2673 vikas 261
		String key, value;
1905 chandransh 262
		while(st.hasMoreTokens()) {
263
			key = st.nextToken();
264
			value = st.nextToken();
265
			log.info("Key: " + key + ", Value: " + value);
266
			paymentParams.put(key, value);
267
		}
268
	}
2673 vikas 269
 
1905 chandransh 270
	public String getRedirectUrl(){
271
		return this.redirectUrl;
272
	}
2673 vikas 273
 
1905 chandransh 274
	@Override
275
	public void setServletRequest(HttpServletRequest request) {
276
		this.request = request;
277
	}
278
 
279
	public Map<String, String> getPaymentParams() {
280
		return paymentParams;
281
	}
6050 anupam.sin 282
 
283
    public static void setRechargeResultUri(String rechargeResultUri) {
284
        EbsPayResponseController.rechargeResultUri = rechargeResultUri;
285
    }
286
 
287
    public static String getRechargeResultUri() {
288
        return rechargeResultUri;
289
    }
1905 chandransh 290
}