20221130(수)
- 목차
- 카카오페이 결제시스템 적용
- 카카오페이 클릭 후 작업
- 결제승인 요청
- 주문하기 기능 안에서 일어나는 작업
< 카카오페이 결제시스템 적용 >
- API
: 요청과 응답의 기능을 제공하는 프로그램.
: 요청 주소 : 파라미터 제공 ↔ 응답(결과) - 신규 프로젝트 - 주요 기능
(1) 라이브러리 (부품) : 프로젝트에 포함
라이브러리는 부품의 개념이다. (프로그램 안에 포함되어있다.)
(2) API 이용 : 프로젝트 외부에 서버를 두고 기능을 제공.
API는 원격의 개념이다. (외부에 서버를 두고 기능을 끌어다 쓴다.) - 결제시스템
- PG사 : 전자지급결제대행 서비스 / 우리가 선택하는 개념이 아니다
- 전자지급결제대행 서비스(Payment Gateway) : 온라인 상점에서 상품과 서비스 판매 시,
고객이 신용카드 및 다양한 결제수단을 이용하여 안전하게 결제할 수 있도록 지원하는 서비스 - https://bit.ly/3gP6Vh1
- 개발 성격에 따라 키가 다르다.
- 위 내용을 우리 환경에 맞게 작업을 해주어야 한다.
< 카카오페이 클릭 후 작업 >
- 결제방법을 '카카오페이' 선택 ➡ 아래 카카오페이 이미지 클릭 시 일어나는 작업
1. 결제정보 테이블 DB에 추가
-- 결제정보 테이블
CREATE TABLE PAYMENT_TBL (
PAY_CODE NUMBER CONSTRAINT PK_PAYMENT_CODE PRIMARY KEY,
ODR_CODE NUMBER NOT NULL,
PAY_METHOD VARCHAR2(30) NOT NULL,
PAY_DATE DATE DEFAULT SYSDATE,
PAY_TOT_PRICE NUMBER NOT NULL,
PAY_REST_PRICE NUMBER NOT NULL,
PAY_NOBANK_USER VARCHAR2(20) NULL,
PAY_NOBANK VARCHAR2(20) NULL
);
CREATE SEQUENCE SEQ_PAYMENT_CODE;
COMMIT;
2. PaymentVO 클래스 생성
+) kakaoPay 관련 클래스 생성
1. com.swimlover.kakaopay 패키지 생성
2. Amount.java 생성
package com.docmall.kakaopay;
import lombok.Data;
@Data
public class Amount {
private int total; // 전체 결제 금액
private int tax_free; // 비과세 금액
private int vat; // 부가세 금액
private int point; // 사용한 포인트 금액
private int discount; // 할인 금액
}
3. ApproveResponse.java 생성
package com.docmall.kakaopay;
import lombok.Data;
// 결제 승인요청에 의하여 응답받는 정보(두번째 요청)
@Data
public class ApproveResponse {
private String aid; // 요청 고유 번호
private String tid; // 결제 고유 번호
private String cid; // 가맹점 코드
private String sid; // 정기결제용 ID, 정기결제 CID로 단건결제 요청 시 발급
private String partner_order_id; // 가맹점 주문번호, 최대 100자
private String partner_user_id; // 가맹점 회원 id, 최대 100자
private String payment_method_type; // 결제 수단, CARD 또는 MONEY 중 하나
private Amount amount; // 결제 금액 정보
private String item_name; // 상품 이름, 최대 100자
private String item_code; // 상품 코드, 최대 100자
private int quantity; // 상품 수량
private String created_at; // 결제 준비 요청 시각
private String approved_at; // 결제승인 시각
private String payload; // 결제 승인 요청에 대해 저장한 값, 요청 시 전달된 내용
}
4. ReadyResponse.java 생성
package com.docmall.kakaopay;
import javax.annotation.Generated;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
// 결제준비를 위한 정보를 응답받음.(첫번째 요청)
@Getter
@Setter
@ToString
public class ReadyResponse {
private String tid; // 결제 고유 번호, 20자
/*
요청한 클라이언트가 PC 웹일 경우 카카오톡으로 결제 요청 메시지(TMS)를 보내기 위한 사용자 정보 입력 화면 Redirect URL
*/
private String next_redirect_pc_url;
private String partner_order_id;
}
3. KakaoPayServiceImpl (서비스 파일은 따로 안 만들고 직접 코드)
✔ 카카오 Pay API에 요청하기 위한 작업
1) HttpURLConnection을 이용한 HTTP 통신
2) Rest Template를 이용한 통신(권장)
- 참고 링크 : https://minkwon4.tistory.com/178
4. KakaoPayServiceImpl에 값 구성하기
요구하는 파라미터 정보를 다루기 위해 MultiValueMap을 이용해서 값 구성
https://developers.kakao.com/docs/latest/ko/kakaopay/single-payment
✨ 클래스 특징
HttpEntity<T> : HttpHeader, HttpBody를 포함하는 특징.
HttpEntity<T> 클래스를 상속받아 구현한 클래스가 있다. RequestEntity, ResponseEntity
ResponseEntity 클래스 : HttpHeader, HttpBody, HttpStatus 3가지 정보를 관리.
httpHeaders 클래스 : 헤더 정보를 구성하는 기능.
5. KakaoPayServiceImpl 클래스에 HttpHeaders 클래스 추가
- 카카오 Admin 키 삽입하기
6. KakaoPayServiceImpl 클래스에 외부 API 연결
✔ postForObject 메서드
- 첫 번째 파라미터 : 카카오페이 요청 주소
- 두번째 파라미터 : 요청 시 사용할 파라미터와 헤더 정보 구성
- 세번째 파라미터 : 리턴 받는 클래스 정보
7. Order 컨트롤러에 주입 및 코드 추가
8. orderListInfo.jsp 코드 추가
< 결제승인 요청 >
1. Order 컨트롤러
- 틀 잡기
2. KakaoPayServiceImpl 클래스
3. orderListInfo.jsp 코드 작업
- ajax 코드 추가 작업
< 주문하기 기능 안에서 일어나는 작업 >
💫 주문하기 기능 안에서 일어나는 작업
- 주문내역 정보
(1) 주문 테이블 삽입
(2) 주문 상세 테이블 삽입
- 결제내역 정보
(3) 결제 테이블 삽입
- 장바구니 비우기
(4) 장바구니 테이블 삭제
- 결제 : 카카오페이 기본 작업
(지금은 기본 작업만 한 상태다. 위에 세 가지 작업이 남았다!)
1. Order 매퍼
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docmall.mapper.OrderMapper">
<insert id="orderSave" parameterType="com.docmall.domain.OrderVO">
<selectKey keyProperty="odr_code" order="BEFORE" resultType="long">
SELECT SEQ_ORD_CODE.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO ORDER_TBL
(ODR_CODE, MEM_ID, ODR_NAME, ODR_ZIPCODE, ODR_ADDR, ODR_ADDR_D, ODR_PHONE, ODR_TOTAL_PRICE)
VALUES
(#{odr_code}, #{mem_id}, #{odr_name}, #{odr_zipcode}, #{odr_addr}, #{odr_addr_d}, #{odr_phone}, #{odr_total_price})
</insert>
<insert id="orderDetailSave">
INSERT INTO ORDER_DETAIL_TBL
(ODR_CODE, PDT_NUM, ODR_AMOUNT, ODR_PRICE)
SELECT
#{odr_code}, C.PDT_NUM, C.CART_AMOUNT, P.PDT_PRICE * C.CART_AMOUNT
FROM
CART_TBL C INNER JOIN PRODUCT_TBL P
ON
C.PDT_NUM = P.PDT_NUM
WHERE
C.MEM_ID = #{mem_id}
</insert>
<insert id="paymentSave">
INSERT INTO PAYMENT_TBL
(PAY_CODE, ODR_CODE, MEM_ID, PAY_METHOD, PAY_TOT_PRICE)
VALUES
(SEQ_PAYMENT_CODE.NEXTVAL, #{odr_code}, #{mem_id}, #{pay_method}, #{pay_tot_price})
</insert>
</mapper>
2. Order 서비스
3. Order 컨트롤러
참고링크
https://jungkeung.tistory.com/149
'🏫 Open API_JAVA' 카테고리의 다른 글
[92일차] 주문하기 코드모음 / 상품 상세페이지 / 상품 후기 작성 (0) | 2022.12.05 |
---|---|
[91일차] 카카오페이 연결 / 상품 목록에서 바로구매 진행하기 (0) | 2022.12.01 |
[89일차] 주문하기 / 주문자 정보 & 배송지 정보 폼 / 카카오페이 결제 (0) | 2022.12.01 |
[87일차] 장바구니 담기 / 장바구니 목록 (0) | 2022.11.27 |
[86일차 - 2] 삭제 이벤트 처리 / nav에 링크연결 / admin 계정 생성 / 상품 메인페이지 만들기 / 카테고리 목록 만들기 (0) | 2022.11.27 |