New QR payment app
We built the core payment flow of a mobile app that pays at stores by QR code. Users get a prepaid payment method issued inside the app, pay at merchants by scanning a QR code, and redeem points and coupons in the same app. The project had stalled once at the prototype stage and was being relaunched, simplified around payments. In a payment app, a request sent twice or a failed payment that looks successful is immediately a money problem. The work spans the whole payment flow, from QR scan and payment request to reading the server response and showing success or failure, along with its exception handling.
One unbroken flow from QR scan to payment complete
A payment in the QR payment app goes in order: scan the code, request the payment, receive the server response, and show success or failure. We tied these steps into one flow so the user can tell from the screen which step they are on. The rule for the screens was that a user should never be unsure whether a payment is still in progress or already done.

Payment requests designed around duplicates, delays, and cancellation
A payment request does not always come back with a normal response. Duplicate requests, failure responses, network delays, and a user cancelling mid-payment were designed together with the payment flow itself. Across the request and the result check, the request, the response, and the screen state were kept consistent so the user never sees a wrong payment status.

Rules that turn an unusual server response into app states
The payment server answered in an unusual format rather than the commonly used data format. We built the parsing for these responses and mapped each response case to the state the app should move to. Not just successful payments but error codes, missing fields, and malformed responses all lead the app to a defined screen instead of leaving it stuck.

Collaboration that kept both platforms on the same payment rules
The other platform's app for the same payment service was handled by another developer. We walked that developer through the payment logic and how server responses were handled, and helped with the implementation. The payment policy and exception rules have to match across platforms, or the same payment shows a different result depending on the app.

Highlights
A payment flow that runs from QR scan to showing success or failure
Exception handling for duplicate requests, failure responses, network delays, and user cancellation
Parsing an unusual server response format, including error codes and missing fields
Insights
GA4 client_storage: 'none'은 정말 쿠키를 막을까?
두 달 전 이 블로그에 「GA4 쿠키 없이 쓰기」라는 글을 썼습니다. clientstorage: 'none' 으로 쿠키 저장을 끄고, 자체 분석이 쓰던 익명 ID 를 clientid 로 넘기면 쿠키 0개로 GA4 를 쓸 수 있다는 내…
GA4 Measurement Protocol: gtag.js 없이 서버에서 이벤트 보내기
랜딩 페이지의 전송량을 파일 단위로 쪼개 보다가, 가장 큰 파일이 우리 코드가 아니라는 것을 알았습니다. Google Analytics 의 gtag.js 였고, 방문 한 번에 176KB 를 받고 있었습니다. 페이지 전체가 1,094K…
중소 제조업 AI 도입 순서: DX를 먼저 끝내야 할까?
공장을 가진 중소·중견 제조기업 16만여 곳 가운데 스마트공장을 도입한 곳은 19.5%입니다. 회사가 작을수록 이 비율은 더 떨어집니다. 중소벤처기업부가 2025년 4월에 낸 제1차 스마트제조혁신 실태조사 결과입니다. 그림: 기업 규…
Next.js loading.tsx와 404: 버튼이 화면보다 먼저 살아나게 하기
관리 화면 왼쪽 위에 사이드바를 접고 펴는 ☰ 버튼이 있습니다. 폭 하나 바꾸는 버튼인데, 대시보드에서 누르면 2초 넘게 아무 반응이 없었습니다. 레이아웃만 바꾸는 일이 왜 이렇게 오래 걸리는지부터 들여다봤습니다. Next.js 16…



