해당 게시물은 rails 와 stripe 를 연동한 webhook 에 다루고 있습니다. 저와 같이 rails 와 stripe 를 사용하여 웹사이트를 개발하고 계시면서 여려움을 겪고 계시다면, 더욱 확실한 도움을 드릴 수 있을 것 같으니, 댓글 혹은 연락을 주세요
The following post is about integrating Rails with Stripe for webhooks. If you're working on a website using Rails and Stripe and encountering challenges, I'd be happy to provide assistance. Please leave a comment or get in touch.
결제 시스템을 사용 중, 최근 너무 비싸진 상품 때문에 분할결제를 위해 구독 모델을 사용하게 되었습니다
한국 PG 결제 시스템을 사용하는게 아닌 해외 결제 모듈을 쓰다 보니 할부라는 개념을 어떻게든 개발로 풀어나가려 했습니다
그래서 구독 모델로 하되, 텀은 1달, 구독 횟수는 n 회로 개발을 했습니다.
나누는 n 회가 커질 수록 총 결제 금액은 조금씩 늘어나는 방향으로 개발을 했습니다.
웹훅은 웹 개발에서 사용자 정의 콜백을 사용하여 웹 페이지 또는 웹 애플리케이션의 동작을 강화하거나 변경하는 방법입니다.
저는 사용중인 모듈에서 이벤트가 발생할 때에 내가 운영중인 웹사이트로 신호(데이터)를 보내, DB 에서 연관 데이터를 업데이트 하는 기능을 개발하려고 했습니다. 너무 어렵게 생각하지 마시고, 기본 적인 방법은 거의 동일 할테니, 참고해주시면 좋을 것 같아요. 저의 예시는 Rails 앱과 Stripe 라는 결제 모듈을 사용합니다. 물론 세부 사항들은 모듈마다 다를 테니 참고만 해주세요
1. 사용하는 모듈에서 webhook endpoint 를 만드는 페이지로 이동.
endpoint 라는 것은 해당 모듈에서 어떤 주소로 보낼 것인지 정하는 부분입니다.
ex) 나의도메인.com/webhook
저는 kyurasi.com/webhook 으로 했습니다.
2. endpoint 로 사용될 주소 url 를 생각해봅니다.
post 로 json 형태의 값을 보낼 것이니, 정말 간단하게 controller 와 route 파일만 건들겠습니다.
1) controller
class WebhooksController < ApplicationController
skip_before_action :verify_authenticity_token, only: [:webhook]
def webhook
payload = request.body.read
sig_header = request.env['HTTP_STRIPE_SIGNATURE']
event = nil
whsec = ENV['stripe_webhook_staging']
puts "whsec: #{whsec}"
begin
event = Stripe::Webhook.construct_event(payload, sig_header, whsec)
rescue JSON::ParserError => e
render json: { error: e.message }, status: :bad_request
return
rescue Stripe::SignatureVerificationError => e
render json: { error: e.message }, status: :bad_request
return
end
case event.type
when 'customer.updated'
puts "customer.updated!!"
else
puts "Unhandled event type: #{event.type}"
end
render json: { status: 'success' }
end
end
rails 에서 skip_before_action를 사용하여 컨트롤러에서 특정 동작을 건너뛰거나 생략할 수 있습니다.
이 경우, skip_before_action를 사용하여 authenticate_user! 및 verify_authenticity_token 동작을 건너뛰고 있습니다.
- authenticate_user!: 이 동작은 Devise 또는 다른 인증 미들웨어를 사용하는 경우에 사용됩니다. 사용자의 인증 상태를 확인하고, 로그인하지 않은 사용자를 리디렉션하거나 처리할 때 사용됩니다. 만약 이 동작이 필요하다면 그대로 두셔야 합니다. 만약 웹훅 엔드포인트에 인증이 필요하지 않다면 빼도 됩니다.
- verify_authenticity_token: 이 동작은 Cross-Site Request Forgery (CSRF) 공격을 방지하기 위해 사용됩니다. 기본적으로 Rails 애플리케이션은 모든 POST 요청에서 CSRF 토큰을 확인하므로, 웹훅 요청에서는 이 토큰을 확인하지 않도록 설정하는 것이 일반적입니다. 만약 웹훅 요청에서 CSRF 토큰을 확인할 필요가 없다면 이 동작을 건너뛰도록 설정해야 합니다.
해당 기능들을 skip 한 이유는, 내 사이트로 post로 데이터를 보내주는 stripe 는 내 사이트 내의 user나 공격이 아니기에, skip 을 하지 않으면 오류가 날 가능성이 더 크기 때문입니다.
2) routes
stripe 는 post 로 결과를 보내준다고 하였으니, post 로 받을 부분을 kyurasi.com/webhook 라고 했으므로 그에 맞는 함수를 짜줘야겠죠.
이렇게 해둔다면, stripe 에서는 내가 지정한 이벤트가 발생을 했을 시, 그 결과를 kyurasi.com/webhook 으로 보냅니다. 그러면, controller내에 작성해둔 함수에서 event 들을 case 로 나누어 핸들링 하면 됩니다. 이 때에 함수 내에서 db를 update 한다거나, email 발송을 한다거나 할 수 있겠죠.
3. 배포 후 확인
해당 모듈에서 반응을 할 이벤트를 실행을 시켜봅니다 (저는 실 결제 혹은 복잡한 update 가 일어나는게 싫어서 customer.updated 로 해서 고객이 정보를 변경했을 때에 잘 인식하는지 확인했습니다ㅎㅎ)
배포 후 확인을 하라고 한 것은, 너무나도 당연히 kyurasi.com/webhook 과 같이 도메인.com/webhook 과 같이 webhook endpoint 를 지정했으므로, localhost:4242/webhook 과 같은 것들은 작동을 안하겠죠ㅎㅎ 로컬에서 확인하는 방법은 모듈마다 확실하게 다를거라 따로 적어놓지 않겠습니다.
'테크 세미나' 카테고리의 다른 글
도메인 구매하기 - 가격 부터 방법 까지. 연 만원대 도메인 (0) | 2023.11.30 |
---|---|
2024 맥북 개발 세팅하기 (처음부터) (5) | 2023.11.24 |
강동구 개발자 오픈카톡방 개설했습니다 (0) | 2023.02.23 |
openAI ChatGPT로 코딩 시켜보기 (0) | 2023.01.09 |
ESTA 전자비자 신청 방법 (0) | 2022.12.31 |