opencloset / OpenCloset-Share-Web

OpenCloset::Share::Web
https://share.theopencloset.net
Artistic License 2.0
2 stars 2 forks source link

결제안내 및 결제 #10

Closed aanoaa closed 7 years ago

keedi commented 7 years ago

오늘 인수 인계 받았습니다. 제가 나머지 진행합니다.

yongbin commented 7 years ago

지난주금 지난주 금요일(11월 25일) 논의에서 이 이슈는 제가 계속 진행하기로 했습니다. 다음과 같이 진행하겠습니다.

  1. [ ] import REST API client 작성
  2. [ ] import REST API 셈플 구현
  3. [ ] import 결제 취소 테스트
  4. [ ] share - import - pg 코드 구현
  5. [ ] share - import - pg - 정산 : 정합성 시나리오 코드 리뷰 (with @aanoaa, @keedi)
yongbin commented 7 years ago

이어서 진행합니다.

aanoaa commented 7 years ago

이제껏 작업이력을 검토해보고 저도 같이 진행하도록 하겠습니다.

10001if commented 7 years ago

@aanoaa @yongbin 온라인 오픈이 너무 늦어지고 있습니다. 빠른 작업 거듭 요청드립니다.

aanoaa commented 7 years ago

노출되면 안되는 정보가 있어서 이 이슈는 사내 이슈트래커인 bugzilla 에서도 같이 진행하고 있습니다. bug id: 918

aanoaa commented 7 years ago

성공, 실패의 여부를 떠나서 결제요청에 대한 정보를 따로 저장해두는 것이 좋을 것 같습니다. 환불이라던지 정산에 도움이 될 것 같습니다. iamport 의 API 를 사용해서 상세정보를 알아내는데 도움이 될 수 있습니다.

aanoaa commented 7 years ago

결제에 실패했을때에는 에러에 관련된 내용을 알려주고 다시 결제할 수 있도록 하겠습니다.

aanoaa commented 7 years ago

IMP.request_pay 메소드에 대해 결제에 성공했을때의 callback 인자입니다.

apply_num ""
buyer_addr "우리집주소"
buyer_email "xxx@gmail.com"
buyer_name "홍길동"
buyer_postcode ""
buyer_tel "010xxxxxxxx"
card_name ""
card_quota 0
custom_data null
imp_uid "imp_400904854856"
merchant_uid "merchant_1484636905371"
name "홍길동#50334"
paid_amount 28000
paid_at 0
pay_method "vbank"
pg_provider "html5_inicis"
pg_tid "StdpayVBNKINIpayTest20170117160841171550"
receipt_url "https://iniweb.inicis.com/DefaultWebApp/mall/cr/cm/mCmReceipt_head.jsp?noTid=StdpayVBNKINIpayTest20170117160841171550&noMethod=1"
request_id "req_1484636905373"
status "ready"
success true
vbank_date "2017-02-16 23:59:59"
vbank_holder "테스트  이니시스"
vbank_name "KB 국민은행"
vbank_num "87709011045574"
aanoaa commented 7 years ago

결제의 진행순서

aanoaa commented 7 years ago

hook 에서의

를 알아봐야 합니다.

yongbin commented 7 years ago

status:ready

3가지 결제방법중에서 card, trans는 즉시 결제수단이기 때문에 ready 상태가 없습니다. 다만 가상계좌는 사용자가 계좌이체를 완료해야 결제가 끝나기 때무에 ready 상태가 있습니다. 즉 vbank에서 ready는 "가상계좌를 생성하는데 성공했음" 으로 이해하면 됩니다. 이후 사용자가 입금을 하면 notification url callback 으로 paid 요청이 날아옵니다 이때 후속처리를 해야합니다.

결제금액정보

3가지 방법으로 확인가능합니다.

  1. 우리가 띄운 결제페이지에서 아임포트 js 가 돌려준 repose
  2. 아임포트 서버가 notification url 에 넘겨준 정보
  3. 결제완료시 확정된 상점id와 아임포트 id로 REST API에 직접 조회

이 3가지 중에 가장 확실한게 3번이기 때문에 3번으로 진행하는것으로 계획을 세워야 합니다.

aanoaa commented 7 years ago

결제 직후 Notification URL 이 호출될때

yongbin commented 7 years ago

결제의 진행순서

사용자가 결제방법을 선택하고 결제 버튼을 클릭

IMP.request_pay 메소드 호출

사용자의 결제 클릭과 IMP.request_pay 메소드 호출 사이에 한가지가 빠졌습니다. https://api.iamport.kr/#!/payments.validation/preparePayment 에 요청을 한번 보내는 과정이 필요합니다.

aanoaa commented 7 years ago

hook 에 대한 테스트는 이미 등록되어있습니다.

https://github.com/opencloset/OpenCloset-Share-Web/issues/10#issuecomment-259067180

aanoaa commented 7 years ago

입금이 완료된 후에는 누구한테 알려줘야 할까요?

입금이 확인 되었습니다.

SMS 혹은 email 이 될텐데 주문이 정상적으로 처리되고 있다는 알림이겠죠. 열린옷장 입장에서는 결제가 정상적으로 처리된 주문서만 결제완료 상태로 변경되므로 결제완료에 대해 알려야 할 필요는 없습니다.

yongbin commented 7 years ago

제 생각에도 열린옷장측에서는 따로 알릴필요가 없고 주문자에게 입금확인, 배송준비 시작관련 문자를 보내야 할 것 같습니다.

aanoaa commented 7 years ago

손쉽게 사용하기 위해서 https://github.com/opencloset/iamport-rest-client-perl 에서 REST API client 모듈을 작성중입니다.

aanoaa commented 7 years ago

화면단위로 생각했을때에,

  1. 결제 버튼을 누른다
  2. pg사의 결제창이 떠서 진행
  3. 결제완료

식으로 진행됩니다.

결제가 완료되었거나 가상계좌를 통한 입금대기 일때에는 결제가 정상적으로 이루어졌다는 화면이 보여져야 하지 않나 싶습니다.

aanoaa commented 7 years ago

가상계좌 입금은 주문서의 상태가 결제대기 -> 입금대기 -> 결제완료 처럼 3단계를 거쳐야 합니다.

입금대기일때에는 입금대기상태의 화면을 보여줘야 하는게 아닐까 합니다. 가상계좌를 포함한 입금정보를 나타내주는게 좋을 것 같습니다.

yongbin commented 7 years ago

로컬에 전체 환경을 구축하고 좀 더 구체적으로 전체적인 프로세스를 확인해봤습니다. 현재까지 확인된 몇가지 이슈와 의견을 공유합니다.

merchant_uid 의 생성건

merchant_uidOpenCloset::Share::Web::Plugin::Helpers 에서 아래 merchant_uid 함수를 통해서 생성됩니다. 이 함수는 Time::HiResgettimeofday 함수를 이용해 서버측 시간기준 밀리세컨의 3자리를 조합해서 13자리의 timestamp를 생성해내는 방십니다. 주석을 참고할때 아임포트의 JS 예제 코드를 그대로 구현한것으로 보이는데, 이 예제 코드는 create_prepare API를 호출하는것을 고려하지 않은 시나리오의 코드이기 때문에 잠재적인 키 중복에 대해서 충분히 고려하지 않은것이고 현재 기준으로는 동시에 불특정 다수가 사용하는 온라인 서비스 특성상 키 중복이 발생할 가능성이 존재하기 개선할 필요가 있을것 같습니다.

당장은 사용자 식별번호를 저희쪽 salt와 조합한 해쉬결과와 timestamp를 적절하게 조합하는 형태이면 될것 같은데 더 좋은 아이디어가 필요합니다. @aanoaa , @keedi

payment_method 컬럼 저장건

신용카드 결제이면서 결제가 실패한 경우 이 필드가 적절하게 체워지지 않느것을 확인했습니다. 아직 구체적으로 코드에서 원인을 확인하지는 않았습니다.

기타 DB 스키마 관련

dump JSON에 들어있는 항목중 추후 DB 수준에서 사용할 가능성이 높은 아래 필드의 값을 컬럼수준에 저장했으면 좋겠습니다.

keedi commented 7 years ago

pg사에 보내는 merchantuid의 경우 기존 `merchant접두어에서opencloset-share--로 변경했습니다. 더불어order_id대신payment_id를 붙이는 것이 더 좋겠지만 저 접두어를 생성하는 시점에는 사실payment_id를 알 방법이 없습니다. 따라서 주문서 번호로 대체합니다. 사용자 아이디를 추가하지 않는 것은 이미 해당 주문서 번호는 사용자 아이디랑 연계되어 있기 때문에 유일성을 보장하는데 아무 도움이 되지 않습니다. 대신 생성한merchant_uid제일 끝에-iHy`와 같은 무작위 문자열 3개를 덧붙입니다. 완전 완벽하지는 않지만 최소 주문서 번호로 한번 구분 짓고, 기존의 시간 정보에다가, 그 안에서 랜덤 문자열 3개가 추가되었으니 왠만해서는 중복되기 쉽지 않을 것으로 보입니다.

yongbin commented 7 years ago

사용자 아이디를 추가하지 않는 것은 이미 해당 주문서 번호는 사용자 아이디랑 연계되어 있기 때문에 유일성을 보장하는데 아무 도움이 되지 않습니다.

넵 동시에 불특정 다수가 사용했을때 동일한 merchant_id 가 생성되지 않아야 한다는 취지에서 사용자 id를 언급했던겁니다. 주문서번호를 추가해도 효과는 동일하기때문에 상관없을것 같습니다.

keedi commented 7 years ago

merchant_uid를 사용자 지정으로 변경했는데 계속 옛날 방식으로 들어가고 있습니다. 애초에 merchant_uid 값을 우리 마음대로 지정할 수 있는지 여부부터 다시 확인해야 할 것 같습니다. :(

keedi commented 7 years ago

https://github.com/iamport/iamport-manual/tree/master/%EC%9D%B8%EC%A6%9D%EA%B2%B0%EC%A0%9C 상기 주소를 확인했을 때 merchant_uid 값을 다음과 같이 설명하고 있습니다.

merchant_uid    string  가맹점에서 생성/관리하는 고유 주문번호   random  (필수항목) 결제가 된 적이 있는 merchant_uid로는 재결제 불가    1.0.0부터

필수이며, 유형은 문자열이고, 기본은 랜덤이라고 되어있습니다. 그럼에도 불구하고 변경되지 않는 것으로 보입니다.

keedi commented 7 years ago

keedi commented 5 minutes ago

merchant_uid를 사용자 지정으로 변경했는데 계속 옛날 방식으로 들어가고 있습니다. 애초에 merchant_uid 값을 우리 마음대로 지정할 수 있는지 여부부터 다시 확인해야 할 것 같습니다. :( @keedi Member keedi commented 3 minutes ago

https://github.com/iamport/iamport-manual/tree/master/%EC%9D%B8%EC%A6%9D%EA%B2%B0%EC%A0%9C 상기 주소를 확인했을 때 merchant_uid 값을 다음과 같이 설명하고 있습니다.

merchant_uid string 가맹점에서 생성/관리하는 고유 주문번호 random (필수항목) 결제가 된 적이 있는 merchant_uid로는 재결제 불가 1.0.0부터

필수이며, 유형은 문자열이고, 기본은 랜덤이라고 되어있습니다. 그럼에도 불구하고 변경되지 않는 것으로 보입니다.

음 아닙니다. hypnotoad의 reload 이슈인 것 같습니다. 다시 확인해보겠습니다. 제 장비 문제일 가능성이 높습니다.

aanoaa commented 7 years ago

가상계좌 입금을 제외한 결제 테스트를 성공했습니다. 가상계좌의 환불을 어떻게 해야하는지 파악하고 나머지 테스트를 해야합니다.

aanoaa commented 7 years ago

가상계좌의 계좌명을 알아야 합니다.

샌드박스모드에서는 테스트 이니시스 라고 입금계좌명이 나옵니다.


샌드박스 모드라서 그런지는 모르겠는데, hook 이 오지 않습니다. 시간이 좀 걸리는 걸 수도 있겟네요.

aanoaa commented 7 years ago
          notice_url:   'https://test-share.theopencloset.net/webhooks/iamport'

@keedi: 이건 잘못된 것 아닌가요?

각 payment 마다 hook 이 달라지나요?

aanoaa commented 7 years ago

샌드박스모드에서 가상계좌로 23,000원 입금했습니다. 이거 취소해야 하는데..

aanoaa commented 7 years ago

한시간이 지났는데도 안오는걸 보면 sandbox 모드에서는 가상계좌의 hook 을 지원하지 않는 것 같습니다.

aanoaa commented 7 years ago

admin.iamport.kr 에서 확인해봤는데 미결제 로 나타나고 있습니다. 저는 입금하고 계좌에서 이체된 금액을 확인했습니다.

미결제라서 훅이 오지 않은 것 같습니다.

왜 미결제인지 확인해봐야 합니다.

aanoaa commented 7 years ago

ss

aanoaa commented 7 years ago

아직 입금한 돈을 받지 못했지만 마무리 되었습니다. 이슈가 길어졌기 때문에 문제가 있으면 새로운 이슈를 만들어서 진행하겠습니다.