Closed aanoaa closed 7 years ago
지난주금 지난주 금요일(11월 25일) 논의에서 이 이슈는 제가 계속 진행하기로 했습니다. 다음과 같이 진행하겠습니다.
이어서 진행합니다.
이제껏 작업이력을 검토해보고 저도 같이 진행하도록 하겠습니다.
@aanoaa @yongbin 온라인 오픈이 너무 늦어지고 있습니다. 빠른 작업 거듭 요청드립니다.
노출되면 안되는 정보가 있어서 이 이슈는 사내 이슈트래커인 bugzilla 에서도 같이 진행하고 있습니다. bug id: 918
성공, 실패의 여부를 떠나서 결제요청에 대한 정보를 따로 저장해두는 것이 좋을 것 같습니다. 환불이라던지 정산에 도움이 될 것 같습니다. iamport 의 API 를 사용해서 상세정보를 알아내는데 도움이 될 수 있습니다.
결제에 실패했을때에는 에러에 관련된 내용을 알려주고 다시 결제할 수 있도록 하겠습니다.
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"
결제의 진행순서
사용자가 결제방법
을 선택하고 결제
버튼을 클릭
IMP.request_pay
메소드 호출
IMP.request_pay
메소드 callback
사용자가 어떤방법으로든 가상계좌로 입금
결제직후 Notification URL
로의 POST request
[Tue Jan 17 16:30:49 2017] [debug] POST "/webhooks/import"
[Tue Jan 17 16:30:49 2017] [debug] Routing to controller "OpenCloset::Share::Web::Controller::Root" and action "import_hook"
[Tue Jan 17 16:30:49 2017] [debug] imp_uid: imp_852235673108
[Tue Jan 17 16:30:49 2017] [debug] merchant_uid: merchant_1484638235621
[Tue Jan 17 16:30:49 2017] [debug] status: ready
[Tue Jan 17 16:30:49 2017] [debug] 200 OK (0.001742s, 574.053/s)
여기에서 status: ready
가 무슨 뜻인지 확인해봐야 합니다.
그리고 결제액과 관련된 정보가 없습니다.
결제 완료된 금액이 결제 요청한 금액과 일치하지 않으면 사용자에 의해 가격변조가 일어난 것으로 판단
해야 하는데 방법이 hook 에 결제액 관련된 정보가 없으면 미리 저장을 해두어야 하는 것인지 알아봐야 합니다.
hook 에서 요청금액과 결제금액이 같을때에 주문서의 상태를 변경합니다.
hook 에서의
를 알아봐야 합니다.
3가지 결제방법중에서 card, trans는 즉시 결제수단이기 때문에 ready 상태가 없습니다. 다만 가상계좌는 사용자가 계좌이체를 완료해야 결제가 끝나기 때무에 ready
상태가 있습니다. 즉 vbank에서 ready는 "가상계좌를 생성하는데 성공했음" 으로 이해하면 됩니다. 이후 사용자가 입금을 하면 notification url callback 으로 paid 요청이 날아옵니다 이때 후속처리를 해야합니다.
3가지 방법으로 확인가능합니다.
이 3가지 중에 가장 확실한게 3번이기 때문에 3번으로 진행하는것으로 계획을 세워야 합니다.
결제 직후 Notification URL
이 호출될때
ready
일때 paid
일때 두번 호출됨결제의 진행순서
사용자가 결제방법을 선택하고 결제 버튼을 클릭
IMP.request_pay 메소드 호출
사용자의 결제 클릭과 IMP.request_pay 메소드 호출 사이에 한가지가 빠졌습니다. https://api.iamport.kr/#!/payments.validation/preparePayment 에 요청을 한번 보내는 과정이 필요합니다.
hook 에 대한 테스트는 이미 등록되어있습니다.
https://github.com/opencloset/OpenCloset-Share-Web/issues/10#issuecomment-259067180
IMP.request_pay
의 결과를 저장 A입금이 완료된 후에는 누구한테 알려줘야 할까요?
입금이 확인 되었습니다.
SMS 혹은 email 이 될텐데 주문이 정상적으로 처리되고 있다는 알림이겠죠.
열린옷장 입장에서는 결제가 정상적으로 처리된 주문서만 결제완료
상태로 변경되므로 결제완료에 대해 알려야 할 필요는 없습니다.
제 생각에도 열린옷장측에서는 따로 알릴필요가 없고 주문자에게 입금확인, 배송준비 시작관련 문자를 보내야 할 것 같습니다.
손쉽게 사용하기 위해서 https://github.com/opencloset/iamport-rest-client-perl 에서 REST API client 모듈을 작성중입니다.
화면단위로 생각했을때에,
식으로 진행됩니다.
결제가 완료되었거나 가상계좌를 통한 입금대기 일때에는 결제가 정상적으로 이루어졌다는 화면이 보여져야 하지 않나 싶습니다.
가상계좌 입금은 주문서의 상태가 결제대기 -> 입금대기 -> 결제완료
처럼 3단계를 거쳐야
합니다.
입금대기일때에는 입금대기상태의 화면을 보여줘야 하는게 아닐까 합니다. 가상계좌를 포함한 입금정보를 나타내주는게 좋을 것 같습니다.
로컬에 전체 환경을 구축하고 좀 더 구체적으로 전체적인 프로세스를 확인해봤습니다. 현재까지 확인된 몇가지 이슈와 의견을 공유합니다.
merchant_uid
는 OpenCloset::Share::Web::Plugin::Helpers
에서 아래 merchant_uid
함수를 통해서 생성됩니다. 이 함수는 Time::HiRes
의 gettimeofday
함수를 이용해 서버측 시간기준 초
와 밀리세컨
의 3자리를 조합해서 13자리의 timestamp를 생성해내는 방십니다. 주석을 참고할때 아임포트의 JS 예제 코드를 그대로 구현한것으로 보이는데, 이 예제 코드는 create_prepare
API를 호출하는것을 고려하지 않은 시나리오의 코드이기 때문에 잠재적인 키 중복에 대해서 충분히 고려하지 않은것이고 현재 기준으로는 동시에 불특정 다수가 사용하는 온라인 서비스 특성상 키 중복이 발생할 가능성이 존재하기 개선할 필요가 있을것 같습니다.
당장은 사용자 식별번호를 저희쪽 salt와 조합한 해쉬결과와 timestamp를 적절하게 조합하는 형태이면 될것 같은데 더 좋은 아이디어가 필요합니다. @aanoaa , @keedi
신용카드 결제이면서 결제가 실패한 경우 이 필드가 적절하게 체워지지 않느것을 확인했습니다. 아직 구체적으로 코드에서 원인을 확인하지는 않았습니다.
dump JSON에 들어있는 항목중 추후 DB 수준에서 사용할 가능성이 높은 아래 필드의 값을 컬럼수준에 저장했으면 좋겠습니다.
pg_tid
PG 사에서 제공한 결제 ID로 DB에서 단독필드로 저장이 필요합니다. success
: 사용자 화면에 뜬 PG창의 프로세스가 최종 성공, 실패했는지 여부의 bool 이기 때문에 역시 컬럼으로 분리했으면 합니다.request_id
용도는 정확하게 모르겠지만 어쨌던 식별자는 가능하면 컬럼으로 뺐으면 좋겠습니다.pg사에 보내는 merchantuid의 경우 기존 `merchant접두어에서
opencloset-share-로 변경했습니다. 더불어
order_id대신
payment_id를 붙이는 것이 더 좋겠지만 저 접두어를 생성하는 시점에는 사실
payment_id를 알 방법이 없습니다. 따라서 주문서 번호로 대체합니다. 사용자 아이디를 추가하지 않는 것은 이미 해당 주문서 번호는 사용자 아이디랑 연계되어 있기 때문에 유일성을 보장하는데 아무 도움이 되지 않습니다. 대신 생성한
merchant_uid제일 끝에
-iHy`와 같은 무작위 문자열 3개를 덧붙입니다. 완전 완벽하지는 않지만 최소 주문서 번호로 한번 구분 짓고, 기존의 시간 정보에다가, 그 안에서 랜덤 문자열 3개가 추가되었으니 왠만해서는 중복되기 쉽지 않을 것으로 보입니다.
사용자 아이디를 추가하지 않는 것은 이미 해당 주문서 번호는 사용자 아이디랑 연계되어 있기 때문에 유일성을 보장하는데 아무 도움이 되지 않습니다.
넵 동시에 불특정 다수가 사용했을때 동일한 merchant_id 가 생성되지 않아야 한다는 취지에서 사용자 id를 언급했던겁니다. 주문서번호를 추가해도 효과는 동일하기때문에 상관없을것 같습니다.
merchant_uid
를 사용자 지정으로 변경했는데 계속 옛날 방식으로 들어가고 있습니다. 애초에 merchant_uid
값을 우리 마음대로 지정할 수 있는지 여부부터 다시 확인해야 할 것 같습니다. :(
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 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 이슈인 것 같습니다. 다시 확인해보겠습니다. 제 장비 문제일 가능성이 높습니다.
가상계좌 입금을 제외한 결제 테스트를 성공했습니다. 가상계좌의 환불을 어떻게 해야하는지 파악하고 나머지 테스트를 해야합니다.
가상계좌의 계좌명을 알아야 합니다.
샌드박스모드에서는 테스트 이니시스
라고 입금계좌명이 나옵니다.
샌드박스 모드라서 그런지는 모르겠는데, hook 이 오지 않습니다. 시간이 좀 걸리는 걸 수도 있겟네요.
notice_url: 'https://test-share.theopencloset.net/webhooks/iamport'
@keedi: 이건 잘못된 것 아닌가요?
각 payment 마다 hook 이 달라지나요?
샌드박스모드에서 가상계좌로 23,000
원 입금했습니다.
이거 취소해야 하는데..
한시간이 지났는데도 안오는걸 보면 sandbox 모드에서는 가상계좌의 hook 을 지원하지 않는 것 같습니다.
admin.iamport.kr 에서 확인해봤는데 미결제
로 나타나고 있습니다.
저는 입금하고 계좌에서 이체된 금액을 확인했습니다.
미결제라서 훅이 오지 않은 것 같습니다.
왜 미결제인지 확인해봐야 합니다.
아직 입금한 돈을 받지 못했지만 마무리 되었습니다. 이슈가 길어졌기 때문에 문제가 있으면 새로운 이슈를 만들어서 진행하겠습니다.
오늘 인수 인계 받았습니다. 제가 나머지 진행합니다.