From 6c3675823e1ae54f9af1ef9f0930c488498838e6 Mon Sep 17 00:00:00 2001 From: GimHaLim Date: Wed, 31 Jul 2024 23:50:29 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EB=A1=9C=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=B6=A9?= =?UTF-8?q?=EC=A0=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 11 ++++ .../user/application/PaymentService.java | 54 +++++++++++++++++++ .../user/application/response/PaymentDto.java | 17 ++++++ .../user/presentation/MypageController.java | 16 ++++-- 4 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/soongsil/poppin/user/application/PaymentService.java create mode 100644 src/main/java/com/soongsil/poppin/user/application/response/PaymentDto.java diff --git a/build.gradle b/build.gradle index 75814b7..ebfa6ff 100644 --- a/build.gradle +++ b/build.gradle @@ -57,6 +57,17 @@ dependencies { // reset password implementation 'org.springframework.boot:spring-boot-starter-mail' + + // kakao pay (test) + implementation 'com.github.iamport:iamport-rest-client-java:0.2.21' +} + +repositories { + allprojects { + repositories { + maven { url 'https://jitpack.io' } + } + } } tasks.named('test') { diff --git a/src/main/java/com/soongsil/poppin/user/application/PaymentService.java b/src/main/java/com/soongsil/poppin/user/application/PaymentService.java new file mode 100644 index 0000000..85e0a5e --- /dev/null +++ b/src/main/java/com/soongsil/poppin/user/application/PaymentService.java @@ -0,0 +1,54 @@ +package com.soongsil.poppin.user.application; + +import com.siot.IamportRestClient.IamportClient; +import com.siot.IamportRestClient.exception.IamportResponseException; +import com.siot.IamportRestClient.response.IamportResponse; +import com.siot.IamportRestClient.response.Payment; +import com.soongsil.poppin.global.response.ErrorCode; +import com.soongsil.poppin.user.application.exception.UserException; +import com.soongsil.poppin.user.application.response.PaymentDto; +import com.soongsil.poppin.user.domain.Member; +import com.soongsil.poppin.user.domain.UserRepository; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; + +@Service +@Transactional +@Log4j2 +public class PaymentService { + private final IamportClient iamportClient; + private final UserRepository userRepository; + + public PaymentService(UserRepository userRepository) { + this.userRepository = userRepository; + this.iamportClient = new IamportClient("8754401450070487", "oU0hOQPSSuFLK6qSfLZZRrprvF3pqz3K0OOniDSvrS58RfR6sPFZnhXhVt7Av9AVPtPqItaiuL43BLR1"); + } + + public PaymentDto verifyPayment(String imp_uid) throws IamportResponseException, IOException { + IamportResponse iamportResponse = iamportClient.paymentByImpUid(imp_uid); // 결제 검증 시작 + Long amount = (iamportResponse.getResponse().getAmount()).longValue(); // 결제 금액 + String nickname = iamportResponse.getResponse().getBuyerName(); // 유저 닉네임 + String status = iamportResponse.getResponse().getStatus(); // Paid 이면 1 + + Member result = userRepository.findBynickName(nickname); + if (result == null) { + throw new UserException(ErrorCode.USER_NOT_FOUND); + } + + Long newPoint = result.getPoint() + amount; + result.setPoint(newPoint); + + userRepository.save(result); + + PaymentDto paymentDto = PaymentDto.builder() + .impuid(imp_uid) + .amount(newPoint) + .nickname(nickname) + .status(amount + "포인트가 충전되었습니다.") + .build(); + + return paymentDto; + } +} \ No newline at end of file diff --git a/src/main/java/com/soongsil/poppin/user/application/response/PaymentDto.java b/src/main/java/com/soongsil/poppin/user/application/response/PaymentDto.java new file mode 100644 index 0000000..3eeed24 --- /dev/null +++ b/src/main/java/com/soongsil/poppin/user/application/response/PaymentDto.java @@ -0,0 +1,17 @@ +package com.soongsil.poppin.user.application.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@AllArgsConstructor +@Getter +@Setter +@Builder +public class PaymentDto { + private String impuid; // 거래 고유 번호 + private String nickname; // 사용자 닉네임 + private String status; // 결제 여부 paid = 1, 그 외 실패 + private Long amount; // 결제 금액 +} diff --git a/src/main/java/com/soongsil/poppin/user/presentation/MypageController.java b/src/main/java/com/soongsil/poppin/user/presentation/MypageController.java index 9abbc9c..dc66cf5 100644 --- a/src/main/java/com/soongsil/poppin/user/presentation/MypageController.java +++ b/src/main/java/com/soongsil/poppin/user/presentation/MypageController.java @@ -1,11 +1,10 @@ package com.soongsil.poppin.user.presentation; +import com.siot.IamportRestClient.exception.IamportResponseException; import com.soongsil.poppin.global.response.ResponseDto; import com.soongsil.poppin.user.application.MemberService; -import com.soongsil.poppin.user.application.response.ChargePointDto; -import com.soongsil.poppin.user.application.response.JWTUtil; -import com.soongsil.poppin.user.application.response.MypageDto; -import com.soongsil.poppin.user.application.response.UserDto; +import com.soongsil.poppin.user.application.PaymentService; +import com.soongsil.poppin.user.application.response.*; import com.soongsil.poppin.user.domain.Member; import com.soongsil.poppin.userchat.application.response.JoinUserChat; import lombok.RequiredArgsConstructor; @@ -14,6 +13,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.io.IOException; import java.util.Map; @RestController @@ -21,6 +21,7 @@ @Log4j2 public class MypageController { private final MemberService memberService; + private final PaymentService paymentService; @GetMapping("/v1/user/kakao") public Map getMemberFromKakao(String accessToken) { @@ -53,6 +54,13 @@ public ResponseEntity chargePoint(@RequestBody ChargePointDto chargePointD return ResponseEntity.ok(newPoint); } + @ResponseBody + @RequestMapping("/v1/verify/{imp_uid}") + public PaymentDto paymentByImpUid(@PathVariable("imp_uid") String imp_uid) + throws IamportResponseException, IOException { + return paymentService.verifyPayment(imp_uid); // 결제 및 검증 DB 값 삽입 + } + @PostMapping("/v1/user/modify-password") public ResponseEntity modifyPassword(@RequestBody String userId) { try {