-
Notifications
You must be signed in to change notification settings - Fork 1
/
PaymentRestController.java
89 lines (81 loc) · 4.05 KB
/
PaymentRestController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.snippet.paypal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class PaymentRestController {
private static final String PP_MERCHANT_URL = "<base URL>";
@RequestMapping(value="/paywithpaypal", method=RequestMethod.POST)
@ResponseBody
public PaymentData payWithPaypal(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
@RequestBody Map<String, Object> requestBody) {
String merchantId = (String) requestBody.get("merchantId");
String merchantName = (String) requestBody.get("merchantName");
String orderId = (String) requestBody.get("orderId");
Double amount = (Double) requestBody.get("amount");
System.out.println("Pay with PayPal: " + merchantId + ", "
+ merchantName + ", " + orderId + ", " + amount);
PaymentData paymentData = new PaymentData();
paymentData.setMerchantId(merchantId);
paymentData.setMerchantName(merchantName);
paymentData.setBillId(orderId);
paymentData.setAmount(amount);
paymentData.setStatus(updateMerchantPaymentStatus(merchantId, orderId, amount));
if (PaymentStatus.PAID != paymentData.getStatus()) {
paymentData.setErrMsg("rolling back the transaction");
}
return paymentData;
}
private static PaymentStatus updateMerchantPaymentStatus(String merchantId, String orderId, Double amount) {
RestTemplate restClient = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
List<MediaType> media = new ArrayList<>();
media.add(MediaType.ALL);
converter.setSupportedMediaTypes(media);
messageConverters.add(converter);
restClient.setMessageConverters(messageConverters);
if (StringUtils.isBlank(PP_MERCHANT_URL)) {
System.out.println("error, PP_MERCHANT_URL is empty, rolling back the transaction");
return PaymentStatus.ROLLBACK;
}
StringBuilder urlBuilder = new StringBuilder(PP_MERCHANT_URL);
urlBuilder.append("/merchantportal").append("/pay.rest");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
MerchantPaymentData params = new MerchantPaymentData();
params.setOrderId(orderId);
params.setMerchantId(merchantId);
HttpEntity<MerchantPaymentData> requestEntity = new HttpEntity<MerchantPaymentData>(params, headers);
try {
ResponseEntity<Boolean> response = restClient.exchange(urlBuilder.toString(), HttpMethod.POST, requestEntity, Boolean.class);
System.out.println("merchantportal response: " + response.getBody());
if (response.getBody() == null) {
return PaymentStatus.ROLLBACK;
}
if (response.getBody()) {
return PaymentStatus.PAID;
} else {
return PaymentStatus.ROLLBACK;
}
} catch (Exception ex) {
return PaymentStatus.ROLLBACK;
}
}
}