Skip to content

Commit d32ed92

Browse files
committed
Spring FullStack Backend Security
1 parent 0f36a59 commit d32ed92

File tree

10 files changed

+483
-16
lines changed

10 files changed

+483
-16
lines changed

Part-9.SpringBoot-React-Projects/Project-2.SpringBoot-React-ShoppingMall/fullstack/backend/src/main/java/com/urunov/kafkaService/Producer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.gson.Gson;
44
import com.urunov.model.Orders;
55
import com.urunov.payload.SmsResponse;
6+
import com.urunov.payload.order.OrderKafkaResponse;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
89
import org.springframework.beans.factory.annotation.Autowired;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.urunov.payload.order;
2+
3+
import com.urunov.model.OrderDetails;
4+
import com.urunov.model.Orders;
5+
import com.urunov.model.enumdto.OrderStatus;
6+
import com.urunov.payload.good.GoodOrderDetailsResponse;
7+
import com.urunov.payload.user.UserResponse;
8+
import lombok.*;
9+
10+
import java.math.BigDecimal;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
14+
/**
15+
* User: hamdamboy
16+
* Project: Shopping
17+
* Github: @urunov
18+
*/
19+
@Data
20+
@Getter
21+
@Setter
22+
@AllArgsConstructor
23+
@NoArgsConstructor
24+
public class OrderKafkaResponse {
25+
26+
private Long id;
27+
28+
private String email;
29+
30+
private String additionsPhone;
31+
32+
private String address;
33+
34+
private String name;
35+
36+
private String comment;
37+
38+
private UserResponse user;
39+
40+
private OrderStatus orderStatus;
41+
42+
private List<GoodOrderDetailsResponse> goodList;
43+
44+
private Float deliveryPrice;
45+
46+
private BigDecimal totalSum = new BigDecimal(0);
47+
48+
public OrderKafkaResponse(Orders orders)
49+
{
50+
this.id = orders.getId();
51+
this.email = orders.getEmail();
52+
this.additionsPhone = orders.getAdditionalPhone();
53+
this.address = orders.getAddress();
54+
this.name = orders.getName();
55+
this.comment = orders.getComment();
56+
this.user = new UserResponse(orders.getUser());
57+
this.orderStatus = orders.getStatus();
58+
this.deliveryPrice = orders.getDeliveryPrice();
59+
if(orders.getOrderDetailsList() != null)
60+
{
61+
List<GoodOrderDetailsResponse> orderDetailsResponses = new ArrayList<>();
62+
for(OrderDetails goodOrderDetailsResponse: orders.getOrderDetailsList()){
63+
orderDetailsResponses.add(new GoodOrderDetailsResponse(goodOrderDetailsResponse.getGood(), goodOrderDetailsResponse.getQuantity(),
64+
goodOrderDetailsResponse.getGood().getImageUrl(), goodOrderDetailsResponse.getGood().getRetailer()));
65+
}
66+
67+
this.goodList = orderDetailsResponses;
68+
}
69+
70+
for(OrderDetails orderDetails: orders.getOrderDetailsList())
71+
{
72+
this.totalSum = this.totalSum.add(orderDetails.getGood().getCurrentPrice() !=null ?
73+
orderDetails.getGood().getCurrentPrice().multiply(new BigDecimal(orderDetails.getQuantity())): new BigDecimal(0));
74+
}
75+
}
76+
77+
78+
79+
}

Part-9.SpringBoot-React-Projects/Project-2.SpringBoot-React-ShoppingMall/fullstack/backend/src/main/java/com/urunov/payload/order/OrderResponse.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ public OrderResponse(Orders orders)
6161
}
6262

6363

64+
6465
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.urunov.payload.payment;
2+
3+
import lombok.*;
4+
5+
/**
6+
* User: hamdamboy
7+
* Project: Shopping
8+
* Github: @urunov
9+
*/
10+
11+
@Data
12+
@Getter
13+
@Setter
14+
@AllArgsConstructor
15+
@NoArgsConstructor
16+
public class PaymentStatusResponse {
17+
/**
18+
* статус платежа
19+
*/
20+
private String state;
21+
22+
/**
23+
* сумма платежа в копейках
24+
*/
25+
private String totalAmount;
26+
27+
/**
28+
* время создания платежа (Время должно быть в формате: yyyy-mm-dd hh:mm:ss)
29+
*/
30+
private String createdDate;
31+
32+
/**
33+
* уникальный код провайдера услуг
34+
*/
35+
private String providerServCode;
36+
37+
/**
38+
* название провайдера услуг
39+
*/
40+
private String providerName;
41+
42+
/**
43+
* код ошибки, используется для локализации проблемы.(
44+
*/
45+
private String errorCode;
46+
47+
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.urunov.payload.user;
2+
3+
import com.urunov.model.User;
4+
5+
/**
6+
* User: hamdamboy
7+
* Project: Shopping
8+
* Github: @urunov
9+
*/
10+
public class UserResponse {
11+
12+
private Long id;
13+
14+
private String username;
15+
16+
private String name;
17+
18+
private String phone;
19+
20+
private String email;
21+
22+
private String city;
23+
24+
25+
public UserResponse(User user){
26+
this.id = user.getId();
27+
this.username = user.getUsername();
28+
this.name = user.getName();
29+
this.phone = user.getPhone();
30+
this.email = user.getEmail();
31+
this.city = user.getCity();
32+
}
33+
34+
public UserResponse(Long id, String username, String name, String phone, String email)
35+
{
36+
this.id = id;
37+
this.username = username;
38+
this.phone = phone;
39+
this.email = email;
40+
}
41+
42+
43+
}

Part-9.SpringBoot-React-Projects/Project-2.SpringBoot-React-ShoppingMall/fullstack/backend/src/main/java/com/urunov/service/order/OrderService.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,15 @@
1212
import com.urunov.repository.UserRepository;
1313
import com.urunov.security.UserPrincipal;
1414
import com.urunov.utils.AppConstants;
15-
import org.hibernate.criterion.Order;
1615
import org.springframework.beans.factory.annotation.Autowired;
1716
import org.springframework.data.domain.Page;
1817
import org.springframework.data.domain.PageRequest;
18+
import org.springframework.data.domain.Pageable;
1919
import org.springframework.data.domain.Sort;
2020
import org.springframework.http.HttpStatus;
2121
import org.springframework.http.ResponseEntity;
2222
import org.springframework.stereotype.Service;
2323

24-
import java.awt.print.Pageable;
2524
import java.util.Arrays;
2625
import java.util.Collections;
2726
import java.util.Date;
@@ -48,7 +47,7 @@ public PagedResponse<OrderResponse> getAllUserOrders(int page, int size, String
4847
{
4948
validatePageNumberAndSize(page, size);
5049
Pageable pageable;
51-
Page<Order> orderList;
50+
Page<Orders> ordersList;
5251

5352
if(sortOrder.equals("ascend"))
5453
pageable = (Pageable) PageRequest.of(page, size, Sort.by(
@@ -66,20 +65,20 @@ public PagedResponse<OrderResponse> getAllUserOrders(int page, int size, String
6665
}
6766

6867
if(isActive)
69-
orderList = orderRepository.findAllByUserAndStatusIn(user, Arrays.asList(OrderStatus.inProgress, OrderStatus.awaitingPayment,
68+
ordersList = orderRepository.findAllByUserAndStatusIn(user, Arrays.asList(OrderStatus.inProgress, OrderStatus.awaitingPayment,
7069
OrderStatus.paid, OrderStatus.deliveryInProgress, OrderStatus.courierFound, OrderStatus.courierSearch, OrderStatus.awaitingConfirmation), pageable);
7170
else
72-
orderList = orderRepository.findAllByUserAndStatusIn(user, Arrays.asList(OrderStatus.delivered, OrderStatus.canceled), pageable);
71+
ordersList = orderRepository.findAllByUserAndStatusIn(user, Arrays.asList(OrderStatus.delivered, OrderStatus.canceled), pageable);
7372

74-
if(orderList.getNumberOfElements() == 0)
73+
if(ordersList.getNumberOfElements() == 0)
7574
{
76-
return new PagedResponse<>(Collections.emptyList(), orderList.getNumber(),
77-
orderList.getSize(), orderList.getTotalElements(), orderList.getTotalPages(), orderList.isLast());
75+
return new PagedResponse<>(Collections.emptyList(), ordersList.getNumber(),
76+
ordersList.getSize(), ordersList.getTotalElements(), ordersList.getTotalPages(), ordersList.isLast());
7877
}
7978

80-
List<OrderResponse> responseList = orderList.map(order -> new OrderResponse(orders)).getContent();
81-
return new PagedResponse<>(responseList, orderList.getTotalPages(),
82-
orderList.isLast());
79+
List<OrderResponse> responseList = ordersList.map(orders -> new OrderResponse(orders)).getContent();
80+
return new PagedResponse<>(responseList, ordersList.getNumber(),
81+
ordersList.getSize(), ordersList.getTotalElements(), ordersList.getTotalPages(), ordersList.isLast());
8382
}
8483

8584

@@ -123,7 +122,7 @@ public ResponseEntity<?> statusDelivered(UserPrincipal userPrincipal, OrderRespo
123122
}
124123
orderRepository.save(orders);
125124
producer.sendOrderRequest(orders);
126-
return new ResponseEntity(new ApiResponse(true, "Status updated sucessfully/ Статус заказа успешно изменен!", new Date(), orderResponse), HttpStatus.OK));
125+
return new ResponseEntity(new ApiResponse(true, "Status updated sucessfully/ Статус заказа успешно изменен!", new Date(), orderResponse), HttpStatus.OK);
127126
}
128127
else
129128
{

Part-9.SpringBoot-React-Projects/Project-2.SpringBoot-React-ShoppingMall/fullstack/backend/src/main/java/com/urunov/service/order/payment/PaymentService.java

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
package com.urunov.service.order.payment;
22

33
import com.google.gson.Gson;
4+
import com.urunov.payload.order.OrderResponse;
5+
import com.urunov.payload.payment.CKassaRequestProperties;
46
import com.urunov.payload.payment.PaymentResponse;
7+
import com.urunov.payload.payment.PaymentStatusResponse;
58
import org.apache.http.client.utils.DateUtils;
69
import org.springframework.stereotype.Service;
710

11+
import java.math.BigDecimal;
12+
import java.security.MessageDigest;
13+
import java.security.NoSuchAlgorithmException;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
17+
import static org.apache.commons.codec.digest.MessageDigestAlgorithms.MD5;
18+
819
/**
920
* User: hamdamboy
1021
* Project: Shopping
@@ -30,7 +41,124 @@ public String registerUser() throws Exception{
3041

3142
PaymentResponse paymentResponse = new PaymentResponse();
3243
paymentResponse.setLogin("799999999");
44+
paymentResponse.setEmail("adasd@gmail.com");
45+
paymentResponse.setName("user");
46+
paymentResponse.setSurName("user");
47+
paymentResponse.setMiddleName("user");
48+
paymentResponse.setShopToken(shopToken);
49+
String requestBody = paymentResponse.getLogin() + '&'
50+
+ paymentResponse.getEmail() + '&'
51+
+ paymentResponse.getName() + '&'
52+
+ paymentResponse.getSurName() + '&'
53+
+ paymentResponse.getMiddleName() + '&'
54+
+ paymentResponse.getShopToken() + '&'
55+
+ secKey;
56+
paymentResponse.setSign(MD5(MD5(requestBody).toUpperCase()).toUpperCase());
57+
58+
return cKassaApi.call("user/registration", new Gson().toJson(paymentResponse));
59+
}
60+
61+
public String getUserStatus() throws Exception
62+
{
63+
PaymentResponse paymentResponse = new PaymentResponse();
64+
paymentResponse.setLogin("799999999");
65+
paymentResponse.setShopToken(shopToken);
66+
String requestBody = paymentResponse.getLogin() + '&'
67+
+ paymentResponse.getShopToken() + '&'
68+
+ secKey;
69+
paymentResponse.setSign(MD5(MD5(requestBody).toUpperCase()).toUpperCase());
70+
return cKassaApi.call("user/status", new Gson().toJson(paymentResponse));
71+
}
72+
73+
public String registerCard() throws Exception
74+
{
75+
PaymentResponse paymentResponse = new PaymentResponse();
76+
paymentResponse.setUserToken("450c2adc-e19f-4194-b081-a028bc381b64");
77+
paymentResponse.setShopToken(shopToken);
78+
79+
String requestBody =
80+
paymentResponse.getUserToken() + '&'
81+
+ paymentResponse.getShopToken() + '&'
82+
+ secKey;
83+
paymentResponse.setSign(MD5(MD5(requestBody).toUpperCase()).toUpperCase());
84+
85+
return cKassaApi.call("card/registration", new Gson().toJson(paymentResponse));
86+
}
87+
88+
public String getCardList() throws Exception
89+
{
90+
PaymentResponse paymentResponse = new PaymentResponse();
91+
paymentResponse.setUserToken("450c2adc-e19f-4194-b081-a028bc381b64");
92+
93+
paymentResponse.setShopToken(shopToken);
94+
String requestBody =
95+
paymentResponse.getUserToken() + '&'
96+
+ paymentResponse.getShopToken() + '&'
97+
+ secKey;
98+
paymentResponse.setSign(MD5(MD5(requestBody.toString()).toUpperCase()).toUpperCase());
99+
return cKassaApi.call("do/payment", new Gson().toJson(paymentResponse));
100+
}
101+
102+
public String makeAnonymousPayment(OrderResponse orderResponse) throws Exception
103+
{
104+
PaymentResponse paymentResponse = new PaymentResponse();
105+
paymentResponse.setServiceCode(servCode);
106+
paymentResponse.setAmount(BigDecimal.valueOf(orderResponse.getDeliveryPrice()).add(orderResponse.getTotalSum()).multiply(new BigDecimal(100)).intValue());
107+
paymentResponse.setComission("0");
108+
109+
List<CKassaRequestProperties> requestProperties = new ArrayList<>();
110+
requestProperties.add(new CKassaRequestProperties("Number_Order", orderResponse.getId().toString()));
111+
requestProperties.add(new CKassaRequestProperties("Order_date", orderResponse.getCreatedAt().substring(0, Integer.parseInt(orderResponse.getCreatedAt().substring(0, orderResponse.getCreatedAt().indexOf(" "))))));
112+
requestProperties.add(new CKassaRequestProperties("Receiver", orderResponse.getRetailerName()));
113+
paymentResponse.setProperties(requestProperties);
114+
paymentResponse.setShopToken(shopToken);
115+
116+
StringBuilder requestBody = new StringBuilder(paymentResponse.getServiceCode() + '&'
117+
+ paymentResponse.getAmount() + '&'
118+
+ paymentResponse.getComission() + '&');
119+
120+
for(CKassaRequestProperties properties: requestProperties)
121+
{
122+
requestBody.append(properties.getName()).append('&').append(properties.getValue()).append('&');
123+
}
124+
125+
requestBody.append(paymentResponse.getShopToken()).append('&');
126+
requestBody.append(secKey);
127+
paymentResponse.setSign(MD5(MD5(requestBody.toString()).toUpperCase()).toUpperCase());
128+
return cKassaApi.call("do/payment/anonymous", new Gson().toJson(paymentResponse));
129+
}
130+
131+
public PaymentStatusResponse getPaymentStatus(String paymentNumber) throws Exception
132+
{
133+
PaymentResponse paymentResponse = new PaymentResponse();
134+
paymentResponse.setRegPayNum(paymentNumber);
135+
paymentResponse.setShopToken(shopToken);
136+
137+
StringBuilder requestBody = new StringBuilder(paymentResponse.getRegPayNum() + '&');
138+
requestBody.append(paymentResponse.getShopToken()).append('&');
139+
requestBody.append(secKey);
140+
paymentResponse.setSign(MD5(MD5(requestBody.toString()).toUpperCase()).toUpperCase());
141+
return new Gson().fromJson(cKassaApi.call("check/payment/state", new Gson().toJson(paymentResponse)), PaymentStatusResponse.class);
142+
}
143+
144+
private String MD5(String str){
145+
MessageDigest md5;
146+
147+
StringBuffer nextString = new StringBuffer();
148+
try {
149+
md5 = MessageDigest.getInstance("md5");
150+
md5.reset();
151+
md5.update(str.getBytes());
152+
byte messageDigest[] = md5.digest();
153+
for(int i=0; i< messageDigest.length; i++){
154+
nextString.append(Integer.toHexString(0xFF & messageDigest[i] | 0x100).substring(1, 3).toUpperCase());
155+
}
156+
}
157+
158+
catch (NoSuchAlgorithmException e){
159+
return e.toString();
160+
}
33161

34-
return CKassaApi.call("user/registeration", new Gson().toJson(paymentResponse));
162+
return nextString.toString();
35163
}
36164
}

0 commit comments

Comments
 (0)