본문 바로가기
Language/Spring

[JAVA, SPRING, BOOTPAY] 부트페이 검증하기(SERVER)

by tyrannojung 2020. 11. 30.
반응형

부트페이 연동 : tyrannocoding.tistory.com/10

 

[JAVA, SPRING] 부트페이 연동(WEB)

부트페이란?  부트페이(Bootpay)는 무료로 서비스되는 결제 연동 API 입니다.  장점으로는 PG 계약과 상관없이 즉시 개발이 가능하며, 웹,앱 SDK 모두 지원합니다. 뿐만아니라 국내외 여러 PG(복수 선

tyrannocoding.tistory.com

부트페이 연동 이후 게시글입니다.

 

 

부트페이 검증이란?

부트페이에서 검증하기를 해야 하는 이유는 개발자들이 사용하기 쉽게 자바스크립트 형태로 제공하고 있어, 결제 금액 및 결제 상태에 대한 변조가 가능하다고 합니다. 그러므로 처음 요청했던 금액과 결제가 올바르게 이루어졌는지에 대해 부트페이 서버로 영수증 키를 보내 확인하는 과정을 거쳐야 합니다.

 

 

검증 절차① 설정

Rest Api를 통해 결제 검증 및 취소가 이루어지는데, 먼저 부트페이로 부터 AccessToken 발행을 부트페이 서버로 요청해야 합니다.

부트페이 서버로 토큰을 요청하면 3가지를 확인합니다.

 

1. REST Application ID

2. 인증키(Private Key)

3. 요청한 서버가 허가된 서버 IP인지 여부

 

(접근 허용 IP 관리에서는 TEST를 위해 위험성이 있지만, 모든 IP의 서버 요청을 허용하겠습니다.로 설정했습니다.)

 

부트페이 로그인 후

관리자 -> 결제설치 -> 인증키 및 보안 -> 검증 / 취소

 

REST Application ID와 인증키를 먼저 잘 저장해 두셔야 합니다.

 

 

검증 절차② JAVA SPRING 설정 (legacy, maven)

먼저 부트페이에서 제공해주는 GIT에서 JAVA 소스를 다운로드합니다.

 

github.com/bootpay/server_java_apache

 

스프링 프로젝트 pom.xml에 해당 코드를 추가합니다.

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>LATEST</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>LATEST</version>
</dependency>

httpcomponents : 자바에서 http 통신을 위해 필요한 것.

gson : json 변환

 

 

검증 절차③ JAVA파일 소스

GIT에서 제공해주는 소스를 그대로 사용합니다.

트리구조

request 패키지 /response 패키지 /bootpayApi.java 만 사용하므로 그대로 프로젝트에 복사 붙여 넣기를 합니다.

제가 추가한 건 BootPay.java 입니다.(Controller)

import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import io.nodehome.dapp.pay.dto.PayDTO; // 비교를위해.done에서 nice data를 AJAX로 전달(앞 게시글 참고)

@Controller
public class BootPay {
	
	/**
	 * NICE 와 부트페이 검증
	 * @param dto
	 * @param model
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value="/bootpay_confirm", method = RequestMethod.POST)
	public String bootpay_confirm(
			PayDTO dto
			, Model model
			) 
	{
		BootpayApi api = new BootpayApi("12345678901234","ABCDEFGHIJKLMNOPQRSTUVWXYZ="); //첫번째 매개변수에 REST Application ID, 두번째 매개변수에 인증키 (Private Key)  
		String bootpay_check = "";
		
		// 부트페이 인증 토큰 발급
    	try {
    		api.getAccessToken();
		} catch (Exception e) {
			e.printStackTrace();
		}
    	
    	// 부트페이로부터 검증데이터 가져오기
    	try {
    	    HttpResponse res = api.verify(dto.getParking_pay_pgid());
    	    
    	    //부트페이에서 가져온 검증 JSON
    	    bootpay_check = IOUtils.toString(res.getEntity().getContent(), "UTF-8");
    	    
    	    // NICE에서 넘겨주는 pgid
    	    String pay_pgid = dto.getParking_pay_pgid();
    	    // NICE에서 넘겨주는 pay_money
    	    String pay_money =  Integer.toString((dto.getParking_pay_money()));
    	    
    	    JSONParser jsonParse = new JSONParser();
			JSONObject jsonObj = (JSONObject)jsonParse.parse(bootpay_check);
			JSONObject jsonObj2 = (JSONObject)jsonParse.parse((jsonObj.get("data").toString()));
			
			// 결제 상태
			String boot_status = (jsonObj.get("status")).toString();
			// 부트페이에서 넘겨주는 pgid
			String boot_pgid = (jsonObj2.get("receipt_id")).toString();
			// 부트페이에서 넘겨주는 pay_money
			String boot_pay_money = (jsonObj2.get("price")).toString();
			// 부트페이에서 넘겨주는 거래상태 (1일 경우 결제 완료 상태)
			String boot_status2 = (jsonObj2.get("status")).toString();
			
			// 거래상태코드
			if(boot_status.equals("200")) 
			{	// 서버검증
				if(boot_pgid.equals(pay_pgid) 
						&&  boot_pay_money.equals(pay_money) 
						&&  boot_status2.equals("1")) 
				{
					System.out.println("이니시스 부트페이 비교 검증 성공");
					
					//성공
					return "OK";
				}
			}
    	} catch (Exception e) {
    	    e.printStackTrace();
    	    return "NO";
    	}
    	//실패
		return "NO";
	}
}

 

참고 URL : docs.bootpay.co.kr/rest/verify

 

해당 RETURN값이 "OK" 일 때 결제 승인처리를 해주면 됩니다.

(AJAX를 다루는 게시글이 아니므로 스크립트단은 생략했습니다.)

 

 

마치며

위 과정을 요약하자면 PG사를 통한 결제 승인 -> PG사 결과값 서버로 보냄 -> 서버에서 부트페이 토큰 발행 -> 해당 토큰으로 부트페이 내 결과값 확인 -> PG사 결과값과 부트페이 결과값 비교 -> 참이면 TRUE입니다.

 

 

반응형

댓글