[Flutter] kakaolink로 kakaopay 돈 요청하기

LOCKED·2021년 1월 12일
8
post-thumbnail

이전 글에 이어서...

kakao pay와 연동하기에 대해서 글을 작성해보려한다.

지난 포스트에는 toss와 kakaolink를 이용하여 원하는 금액을 요청할 수 있는 카카오 메시지를 만들었다.

이번 포스트에는 kakaopay로 이것을 해보려한다.

Kakao pay

카카오페이의 송금 api를 찾는데 찾아지지가 않았다. 그래서 카카오페이 앱 내를 살펴 보던 중

QR code 송금 받기 이라는 기능을 찾았다.

  • 금액 및 메모 입력 가능

이름부터 송금 받기 여서, qrcode에 금액을 넣는 방식만 알면 사용할 수 있을 것 같았다.

QR code 송금

먼저, 해당 QR Code를 스캔해보면 꽤나 직관적인 데이터가 나온다.

// 나의 경우 userId 는 24글자이다.
https://qr.kakaopay.com/${userId}

그리고 저 주소로 들어가게 되면 카카오페이의 송금 화면으로 이동된다.

이제 QR Code 송금 받기에서 금액을 입력하고 QR Code를 만들어 보았다.

1000원을 입력하고 만드니 다음과 같은 주소가 생성되었다.

// 1000 일 때, 1f401650
https://qr.kakaopay.com/${userId}1f401650

아마 16진수를 사용하여 값을 변환한 듯하다. toss의 경우 amount 라는 직관적인 파라미터를 사용하는데 비해서 카카오페이는 값을 숨겨뒀다.

일단 몇 번 시도해 보아도 1000원을 입력했을 때는 저 값이 나오는 것을 확인 할 수 있었다.

그렇다면 어떻게 1000 -> 1f401650 로 변환되는지 과정을 추론해 보았다.

1f401650 를 단순히 16진수라는 가정하에 10진수로 파싱해 보았다.

print(int.parse('1f401650',radix:16));
// 524293712

전혀 의미 없어보이는 숫자가 나왔다. 1000이 아닌 다른 숫자들을 참고하여 패턴을 분석해보려한다.

print(int.parse('3209180',radix:16));
// 100 -> 52466048
print(int.parse('505450',radix:16));
//  10 -> 5264464
print(int.parse('88876',radix:16));
//   1 -> 559222

여기까지.. 사실 전혀 모르겠다...
1의 값이 2^19~2^20의 숫자라는 범위만 얻었다.

그럼 반대로 559222가 1이라면, 559223은 몇일까?

print((559223).toRadixString(16));
// 88877

위의 값을 카카오페이의 주소에 대입하니 1이 나왔다.

그럼 어느정도의 쓰레기 값이 붙어 의미를 파악하기 힘들게 했다?라고 생각하고 값을 다시 찾아보기로 했다. 어디까지가 1의 값으로 나오게될지 값을 줄여가며 확인해보았다.

결과적으론, 524287(7ffff) 을 넣었을 때부터 값이 나오지 않았다.
우연의 일치인지는 모르겠지만 위의 값은 2^19-1 이다.

이 값을 기본이라 가정하고 다른 숫자들에 테스트해보니, 카카오페이 요청이 정상적으로 되는 것을 확인할 수 있었다.

다행히도 다른 변환을 추가적으로 하거나 예외가 생기는 상황이 없어서 이렇게 끝이났다.

String toHexValue(int value){
  return (value * 524288).toRadixString(16);
}

위의 함수를 사용하여 다음 주소에 요청하면 된다.

https://qr.kakaopay.com/${userId}${toHexValue(moneyValue)}

카카오링크 등록

카카오 링크에 https://qr.kakaopay.com를 등록하고, 앱에서 userId와 금액을 포함하여 요청한다.

결과

지난 앱에 카카오페이 기능을 추가하여 업데이트하였다.
사실 코드는 보여줄만큼 대단한 것도 없고, 너무 간단해서 생략하였다.

  • 금액 입력
  • (optional) 내용 입력
  • 공유하기

카카오페이, 토스를 하나의 카카오톡 메시지에서 골라 보낼 수 있어서 돈을 주는 사람, 받는 사람 둘 다 좀 더 편해졌다.

  • 받는 사람이 요청 금액을 적어야하는 불편함이 있다.
  • 하지만 그럼에도 모든 서비스는 사용자(보내는사람)가 편해야하기 때문에 옳은 방향인 것 같다.
  • 친구들에게 몇 번 사용해봤는데 사용성에서 괜찮다라는 평이 있다.(버튼만 누르고 인증만하면 끝이라)

https://play.google.com/store/apps/details?id=com.locked.money_request 에서 확인해 보세요.

profile
Flutter 개발자 :'>

2개의 댓글

comment-user-thumbnail
2021년 2월 18일

좋은 기능이네요~ 혹시 해당 기능을 구현하려면 Flutter에서 어떻게 해야 하나요.
소스 코드 공유 부탁드립니다~

1개의 답글