Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
21410 amit.gupta 1
package com.spice.profitmandi.web.controller.checkout;
2
import java.security.MessageDigest;
3
import java.security.NoSuchAlgorithmException;
21469 amit.gupta 4
import java.util.HashMap;
21410 amit.gupta 5
import java.util.List;
21469 amit.gupta 6
import java.util.Map;
21410 amit.gupta 7
 
23568 govind 8
import org.apache.logging.log4j.Logger;
9
import org.apache.logging.log4j.LogManager;
22510 amit.gupta 10
import org.springframework.beans.factory.annotation.Value;
21410 amit.gupta 11
import org.springframework.stereotype.Component;
12
 
13
import com.spice.profitmandi.thrift.clients.PaymentClient;
14
import com.spice.profitmandi.thrift.clients.TransactionClient;
15
import com.spice.profitmandi.thrift.clients.config.ConfigClient;
16
import com.spice.profitmandi.web.payment.IPaymentService;
17
import com.spice.profitmandi.web.payment.PaymentUtils;
18
import com.spice.profitmandi.web.res.order.PayuPayPojo;
19
 
20
import in.shop2020.config.ConfigException;
21
import in.shop2020.model.v1.order.LineItem;
22
import in.shop2020.model.v1.order.Order;
23
import in.shop2020.model.v1.order.Transaction;
24
import in.shop2020.payments.Attribute;
25
import in.shop2020.payments.Payment;
26
 
27
 
28
@Component
29
public class PayuHandler {
30
 
23568 govind 31
	private static final Logger log = LogManager.getLogger(PayuHandler.class);
21410 amit.gupta 32
 
33
	private static String accountId;
34
 
22510 amit.gupta 35
	@Value("${angular.app.url}")
36
	private String applicationWebUrl;
21410 amit.gupta 37
 
22510 amit.gupta 38
	@Value("${this.app.url}")
39
	private String thisApplicationUrl;
21410 amit.gupta 40
 
41
	private static String salt;
42
 
43
	private static String postActionUrl;
44
 
45
	static{
46
		try {
47
			ConfigClient client = ConfigClient.getClient();
48
			accountId = client.get("payu_account_id");
49
			salt = client.get("payu_secret_key");
50
			postActionUrl = client.get("payu_post_url");
51
			//"https://test.payu.in/_payment";
26522 amit.gupta 52
		} catch (Exception e) {
21410 amit.gupta 53
			log.error("Unable to get PayU payment configuration.");
54
		}
55
	}
56
 
57
 
58
	public PayuPayPojo getPayuParams(long paymentId) throws Exception{
59
		PaymentClient paymentServiceClient = new PaymentClient();
60
		Payment payment = paymentServiceClient.getClient().getPayment(paymentId);
61
 
62
		long txnId = payment.getMerchantTxnId();
63
		TransactionClient transactionServiceClient = new TransactionClient();
64
		in.shop2020.model.v1.order.TransactionService.Client txnClient = transactionServiceClient.getClient();
65
		Transaction transaction = txnClient.getTransaction(txnId);
66
		Order order = transaction.getOrders().get(0);
67
 
68
		String paymentOption = getPaymentOption(payment);
69
		PayuPayPojo ppp = new PayuPayPojo();
70
		ppp.setKey(accountId);
71
		ppp.setAmount(payment.getAmount() + "");
72
		ppp.setEmail(order.getCustomer_email());
73
		ppp.setPhone(order.getCustomer_mobilenumber());
74
		ppp.setAddress1(order.getCustomer_address1());
75
		ppp.setAddress2(order.getCustomer_address2());
76
		ppp.setCity(order.getCustomer_city());
77
		ppp.setState(order.getCustomer_state());
78
		ppp.setProductinfo(getDescription(order));
79
		ppp.setZipcode(order.getCustomer_pincode());
80
 
81
		ppp.setPg(PaymentUtils.getPayugatewayCode(paymentOption));
22510 amit.gupta 82
		if(paymentOption.startsWith(PaymentUtils.PAYMENT_TYPE.WAL.toString())) {
83
			ppp.setBankcode(PaymentUtils.getPayubankCode(paymentOption));
84
		}
85
		ppp.setFurl(thisApplicationUrl + "checkout/payu-pay-response");
86
		ppp.setSurl(thisApplicationUrl + "checkout/payu-pay-response");
22554 amit.gupta 87
		ppp.setCurl(applicationWebUrl + "pages/home/paymentOptions");
21410 amit.gupta 88
		String[] name = order.getCustomer_name().split(" ");
89
		ppp.setFirstname(name[0]);
90
		if(name.length==2){
91
			ppp.setLastname(name[1]);
92
		}
22512 amit.gupta 93
		ppp.setTxnid(paymentId + "");
21410 amit.gupta 94
		ppp.setCountry("India");
95
 
96
		ppp.setPostActionUrl(postActionUrl);
97
		ppp.setHash(getSecureHash(paymentId, ppp));
98
 
99
		return ppp;
100
	}
101
 
102
	/**
103
	 * This method is used for Recharge payments. It is being called by RechargePaymentController.
104
	 * @return
105
	 */
106
 
107
	private String getDescription (Order order){
108
		StringBuilder descriptionBuilder = new StringBuilder(255);
109
		for(LineItem line: order.getLineitems()){
110
			if(line.getBrand() != null){
111
				descriptionBuilder.append(line.getBrand() + " ");
112
			}
113
			if(line.getModel_name() != null){
114
				descriptionBuilder.append(line.getModel_name() + " "); 
115
			}
116
			if(line.getModel_number() != null){
117
				descriptionBuilder.append(line.getModel_number() + " ");
118
			}
119
			if(line.getColor() != null){
120
				descriptionBuilder.append(line.getColor() + " ");
121
			}
122
		}
123
		String desc = descriptionBuilder.toString();
124
		desc.replaceAll("[^a-zA-Z0-9\\s\\-\\@\\/\\.]", "");
125
		descriptionBuilder = new StringBuilder(desc);
126
		if(descriptionBuilder.length() >= 255)
127
			return descriptionBuilder.substring(0, 255).trim();
128
		else
129
			return descriptionBuilder.toString().trim();
130
	}
131
 
132
	private String getPaymentOption(Payment payment) {
133
		String paymentType = null;
134
		String paymentOpt = null;
135
		List<Attribute> attributes = payment.getAttributes();
136
		if(attributes == null)
137
			return "";
138
		for(Attribute attr : attributes){
139
			if(attr.getName().equals(IPaymentService.PAYMENT_METHOD))
140
				paymentOpt = attr.getValue();
141
			if(attr.getName().equals(IPaymentService.PAYMENT_TYPE))
142
				paymentType = attr.getValue();
143
		}
144
		return paymentType+paymentOpt;
145
	}
146
 
147
	private String getSecureHash(long paymentId, PayuPayPojo ppp) throws NoSuchAlgorithmException{
148
		String pass = accountId + "|" + paymentId + "|" + ppp.getAmount()  + "|" + ppp.getProductinfo() + "|" +  ppp.getFirstname() + "|" + ppp.getEmail() + "|||||||||||" + salt;
149
		log.info("Secure hash-->accountId|paymentId|ppp.getAmount()|ppp.getProductinfo()|ppp.getFirstname()|ppp.getEmail()|||||||||||salt");
150
		log.info("Pass-->" + pass);
151
		MessageDigest md = MessageDigest.getInstance("SHA-512");
152
		md.update(pass.getBytes(), 0, pass.getBytes().length);
153
		byte[] mdbytes = md.digest();
154
		//	convert the byte to hex format method
155
		StringBuffer sb = new StringBuffer();
156
		for (int i = 0; i < mdbytes.length; i++) {
157
			sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
158
		}
159
		return sb.toString();
160
	}
21469 amit.gupta 161
 
21410 amit.gupta 162
 
21469 amit.gupta 163
	public boolean validatePaymentParams(double returnedAmount, Payment payment, String hash, Map<String, String> paymentParams) {
164
		if (!(payment != null && Math.abs(payment.getAmount() - returnedAmount) <= 0.50
165
				&& hash.equals(getSecureHash(paymentParams)))) {
166
			// We did not request this payment or the authorised amount is
167
			// different.
168
			log.error("Checks and balance failed on returned data");
169
			return false;
170
		}
171
		return true;
172
	}
173
 
174
	public String getSecureHash(Map<String, String>  paymentParams){
175
		try{
176
			String pass = salt + "|" + paymentParams.get("status") + "|||||||||||" + paymentParams.get("email") + "|" +  paymentParams.get("firstname") + "|" + paymentParams.get("productinfo") + "|" + paymentParams.get("amount") + "|" + paymentParams.get("txnid") + "|" + accountId;
177
			System.out.println(pass);
178
			MessageDigest md = MessageDigest.getInstance("SHA-512");
179
			md.update(pass.getBytes(), 0, pass.getBytes().length);
180
			byte[] mdbytes = md.digest();
181
			//	convert the byte to hex format method
182
			StringBuffer sb = new StringBuffer();
183
			for (int i = 0; i < mdbytes.length; i++) {
184
				sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
185
			}
186
			return sb.toString();
187
		}catch(NoSuchAlgorithmException nsae){
188
			log.error("No such algorithm exception");
189
			return null;
190
		}
191
	}
192
 
193
	public Map<String, String> getPaymentParams(Map<String, String[]> map) {
194
		Map<String, String> paymentParams = new HashMap<>();
195
		for (Object key : map.keySet()) {
196
			String keyStr = (String) key;
197
			String[] vals = (String[]) map.get(keyStr);
198
			String value = vals[0];
199
			System.out.println("Key " + (String) key + "     :    " + value);
200
			paymentParams.put(keyStr, value);
201
		}
202
		return paymentParams;
203
	}
204
 
21410 amit.gupta 205
	public static class ContactDetails{
206
		private String name;
207
		private String email;
208
		private String address;
209
		private String city;
210
		private String state;
211
		private String postalCode;
212
		private String country;
213
		private String phone;
214
 
215
		public ContactDetails(String name, String email, String address,
216
				String city, String state, String postalCode, String country,
217
				String phone) {
218
			this.name = name;
219
			this.email = email;
220
			this.address = address;
221
			this.city = city;
222
			this.state = state;
223
			this.postalCode = postalCode;
224
			this.country = country;
225
			this.phone = phone;
226
		}
227
 
228
		@Override
229
		public String toString() {
230
			return "ContactDetails [name=" + name + ", email=" + email
231
					+ ", address=" + address + ", city=" + city + ", state="
232
					+ state + ", postalCode=" + postalCode + ", country="
233
					+ country + ", phone=" + phone + "]";
234
		}
235
 
236
		public String getName() {
237
			return name;
238
		}
239
 
240
		public String getEmail() {
241
			return email;
242
		}
243
 
244
		public String getAddress() {
245
			return address;
246
		}
247
 
248
		public String getCity() {
249
			return city;
250
		}
251
 
252
		public String getState() {
253
			return state;
254
		}
255
 
256
		public String getPostalCode() {
257
			return postalCode;
258
		}
259
 
260
		public String getCountry() {
261
			return country;
262
		}
263
 
264
		public String getPhone() {
265
			return phone;
266
		}
267
	}
268
}