#Stripe API/구독 스케줄 등록에서 종료일을 설정하여 취소했을 때의 일일 계산적인 조정액 = 인보이스 확인/with Ruby

19408 단어 스트라이프

포인트


  • 예약 등록이 이미 활성화되어 있고 구독이 시작된 경우의 동작 확인, 테스트
  • 서브스크립션이 개시하고 있는 경우는, 이미 청구는 발행되고 있어 서브스크립션의 기간을 바꾸면, 다음에 청구의 내용이 되풀이되는 것 같다.
  • 1일 기간의 플랜의 구독으로, 정확히 1일에 구독 기간이 종료하도록 end_date 를 지정했을 경우는, 다음의 청구도 발생하지 않고, 단지 솔직하게 구독이 취소되는 것 같다 .
  • 1일 기간의 플랜의 구독으로, 이미 청구가 발행되고 있어 또 그것을 반나절로 축소했을 경우, 다음번 청구의 일할 계산의 조정으로서, 플랜의 반액이 ​​환불되는 거동 보였다. 한층 더 그것을 원래의 1일에 되돌린 경우는, 한층 더 다음회 청구가 되풀이되어, 다음회 청구가 0엔이 되는 것 같다. 가격의 진달래는 맞기 때문에 맞다.
  • SubscriptionSchedule 의 end_behaviour 는 디폴트의 release 가 아니고 cancel일 필요가 있다.
  • 이 기사를 쓴 후에 알았지만, 아무래도 SubscriptionSchedule 의 작성시에도 일할 계산의 무효 옵션을 지정할 수 있는 것 같다 ( prorate = false ) . 조금 시도했는데, 이때의 거동도 왠지 같아 보였지만, 어떠한 때에 거동이 바뀌어 오는 것일 것이다. 쫓아 조사하고 싶다.

  • Docs



    htps : // st 리페. 코 m / 두 cs / bit g / su bsc p chion s / su bsc p chion s chi ぇ s s
    htps : // st 리페. 코 m / 두 cs / 병 g / su bsc p chion s / su bsc p p chion-s chi zu s / use-kase s
    htps : // st 리페. 코 m / 두 cs / 아피 / 스 bsc 리 p 치온
    htps : // 꼬리 rt. st 리페. 코 m / 쿠에 s 치온 s / c Rete-p p-te-an ds Chi-Zu-bsc Ri p Chion s

    Stripe의 기본



    일본 공식 출시한 Stripe를 사용하여 구독형 결제 시스템 구현 - Qiita
    htps : // m / dy / / ms / 7617 e62b2 a 5402 e bd0fb

    Stripe Billing 101 - Qiita
    htps : // 이 m / y_ 토쿠 / ms / 235b5에 7 예 00792 에 dc bf

    Stripe 초보자를 위한 기본적인 사용법(Rails편) - Qiita
    htps : // 코 m / 료 / ms / 6 예 8f277471 아 3b02f7b

    코드


    
    require 'stripe'
    
    Stripe::api_key = ENV['STRIPE_SECRET_KEY']
    
    product1 = Stripe::Product.create(name: "Gold plan #{rand(9999999999)}")
    plan1 = Stripe::Plan.create(interval: 'day', currency: 'jpy', amount: 5000, product: product1.id, usage_type: 'licensed')
    
    tax_rate = Stripe::TaxRate.create(display_name: 'Tax Rate', percentage: 10.0, inclusive: false)
    customer = Stripe::Customer.create
    payment_method = Stripe::PaymentMethod.create(type: 'card', card: { number: '4242424242424242', exp_year: 2030, exp_month: 01})
    customer_payment_method = Stripe::PaymentMethod.attach(payment_method.id, customer: customer.id)
    
    def put_subscription_schedule(subscription_schedule, message)
      puts '-' * 100
      puts "Subscription Schedule"
      puts message
      puts '-' * 100
      puts subscription_schedule
      puts '-' * 100
      puts "https://dashboard.stripe.com/test/subscription_schedules/#{subscription_schedule.id}"
    end
    
    # https://stripe.com/docs/api/subscription_schedules/create
    subscription_schedule = Stripe::SubscriptionSchedule.create(
      {
        customer: customer.id,
        start_date: Time.now.to_i + 5,
        default_settings: {
          default_payment_method: customer_payment_method.id,
        },
        phases: [
          {
            plans:
              [
                { plan: plan1.id, quantity: 1 },
              ],
            default_tax_rates: [tax_rate],
          },
        ],
      }
    )
    put_subscription_schedule(subscription_schedule, 'CREATED')
    
    puts '-' * 100
    puts "Wait until subscription schedule starts"
    puts '-' * 100
    until subscription_schedule.status == 'active' do
      subscription_schedule = Stripe::SubscriptionSchedule.retrieve(subscription_schedule.id)
      puts subscription_schedule.status
      sleep 2
    end
    
    
    def update_subscription_schedule(base_subscription_schedule, end_from_start_date: )
      Stripe::SubscriptionSchedule.update(
        base_subscription_schedule.id,
        {
          end_behavior: 'cancel',
          phases: [
            {
              plans:
                [
                  {
                    plan:     base_subscription_schedule.phases[0].plans[0].plan,
                    quantity: base_subscription_schedule.phases[0].plans[0].quantity
                  },
                ],
              default_tax_rates: [base_subscription_schedule.phases[0].default_tax_rates[0].id],
              start_date: base_subscription_schedule.phases[0].start_date,
              end_date: base_subscription_schedule.phases[0].start_date + end_from_start_date
            },
          ]
        }
      )
    end
    
    
    # STEP A
    # Set subscrition canceled in one day, fit to plan natural cycle "day"
    # It does not create proration adjustment or Upcoming invoice Because subscription schedule cycle is smart finishing.
    #
    # Happens events kinds are ...
    #  subscription_schedule.updated
    updated_subscription_schedule = update_subscription_schedule(subscription_schedule, end_from_start_date: 24*60*60)
    put_subscription_schedule(updated_subscription_schedule, 'UPDATED')
    
    # STEP B
    # Set subscrition canceled in half a day.
    # Not wait natural plan interval end.
    # It makes proration adjustment half price of plan in Upcoming invoice.
    #
    #   Unused time on Gold plan xxxxxxxx after 02 Jan 2020 / 1 / -¥2,500
    #
    #   Subtotal -¥2,500
    #   Tax Rate (10%) -¥250
    #   Total -¥2,750
    #   Applied balance ¥2,750
    #   Amount due ¥0
    #
    # Happens events kinds are ...
    #   subscription_schedule.updated
    #   customer.subscription.updated
    #   invoiceitem.created
    updated_subscription_schedule = update_subscription_schedule(subscription_schedule, end_from_start_date: 12*60*60)
    put_subscription_schedule(updated_subscription_schedule, 'UPDATED')
    
    # STEP C
    # Set subscription back natural full ony day.
    # It makes Upcoming Invoice plice zero
    #
    #   Time on Gold plan xxxxxxxx after 02 Jan 2020 / 1 / ¥2,500
    #   Unused time on Gold plan xxxxxxxx after 02 Jan 2020 / 1 / -¥2,500
    #
    #   Subtotal ¥0
    #   Tax Rate (10%) ¥0
    #   Total ¥0
    #   Amount due ¥0
    updated_subscription_schedule = update_subscription_schedule(subscription_schedule, end_from_start_date: 24*60*60)
    put_subscription_schedule(updated_subscription_schedule, 'UPDATED')
    
    # STEP D
    #   Gold plan 5392253972 / 1 / ¥5,000 / ¥5,000
    #   Unused time on Gold plan 5392253972 after 02 Jan 2020 / 1 / -¥2,500
    #
    #   Subtotal ¥2,500
    #   Tax Rate (10%) ¥250
    #   Total ¥2,750
    #   Amount due ¥2,750
    updated_subscription_schedule = update_subscription_schedule(subscription_schedule, end_from_start_date: 36*60*60)
    put_subscription_schedule(updated_subscription_schedule, 'UPDATED')
    
    

    BEFORE UPDATE



    무기한 구독이므로 종료일이 설정되지 않았습니다.
    다음 번 청구도 예약되었습니다.




    STEP A



    Ends was set
    구독이 현재 기간에 끝나도록 설정한 경우
    종료일이 설정됨
    다음 번 청구가 사라졌습니다.



    STEP B



    Upcoming invoice occurs
    현재 기간의 구독 기간을 반나절로 줄인 경우
    다음 번 청구에서 조정 금액이 발생했습니다.



    STEP C



    다음 Upcoming invoice occurs
    현재 기간의 구독 기간을 반나절로 줄인 후 하루로 되돌린 경우
    다음 번 청구에서 조정 금액에 대해 추가 조정 금액이 발생하여 청구가 0 엔입니다.



    STEP D





    Original by Github issue

    좋은 웹페이지 즐겨찾기