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 {