使用Elixir

时间:2018-06-04 16:04:13

标签: elixir stripe-payments stripe-invoices

我正在尝试使用Elixir计算Stripe中的比例成本。 我正在使用Stripity_Stripe库 https://github.com/code-corps/stripity_stripe/tree/2.0-alpha

这就是我所做的。

  1. 获取当前时间作为unix时间
  2. proration_date = DateTime.to_unix(DateTime.utc_now)
    
    1. 使用Stripe.Invoice
    2. 获取即将发票
      params = %{customer: customer_id,
                 subscription: subscription_id,
                 subscription_items: [%{plan: plan_id}],
                 subscription_proration_date: proration_date}
      
      upcoming_invoice = Invoice.upcoming(params, opts)
      

      我将customer_id替换为客户的id,将customer_id替换为客户的subscription_id,将plan_id替换为新的plan_id(希望进行更改),将subscription_proration_date替换为proration_date

      它返回

      {:ok,
       %Stripe.Invoice{
         amount_due: 17226,
         application_fee: nil,
         attempt_count: 0,
         attempted: false,
         charge: nil,
         closed: false,
         currency: "usd",
         customer: "cus_CxY2gOrcBX568N",
         date: 1530382817,
         description: nil,
         discount: nil,
         ending_balance: nil,
         forgiven: false,
         id: nil,
         lines: %Stripe.List{
           data: [
             %{
               amount: 5235,
               currency: "usd",
               description: "Remaining time on Gold after 04 Jun 2018",
               discountable: false,
               id: "ii_1CZJOQE0U7CBdOnaJ2JiTU3p",
               invoice_item: "ii_1CZJOQE0U7CBdOnaJ2JiTU3p",
               livemode: false,
               metadata: %{},
               object: "line_item",
               period: %{end: 1530382817, start: 1528121306},
               plan: %Stripe.Plan{
                 amount: 6000,
                 created: 1527787728,
                 currency: "usd",
                 id: "plan_CxqGQzrlZKzsyX",
                 interval: "month",
                 interval_count: 1,
                 livemode: false,
                 metadata: %{},
                 name: "Gold",
                 object: "plan",
                 statement_descriptor: "Gold",
                 trial_period_days: nil
               },
               proration: true,
               quantity: 1,
               subscription: "sub_Cxr5eVusfDmwpD",
               subscription_item: "si_CzHykruREBJmer",
               type: "invoiceitem"
             },
             %{
               amount: -1991,
               currency: "usd",
               description: "Unused time on Bronze after 31 May 2018",
               discountable: false,
               id: "ii_1CXyMGE0U7CBdOna7pMyz65c",
               invoice_item: "ii_1CXyMGE0U7CBdOna7pMyz65c",
               livemode: false,
               metadata: %{},
               object: "line_item",
               period: %{end: 1530382817, start: 1527802256},
               plan: %Stripe.Plan{
                 amount: 2000,
                 created: 1527789541,
                 currency: "usd",
                 id: "plan_CxqkbcqfX4hDB8",
                 interval: "month",
                 interval_count: 1,
                 livemode: false,
                 metadata: %{},
                 name: "Bronze",
                 object: "plan",
                 statement_descriptor: nil,
                 trial_period_days: nil
               },
               proration: true,
               quantity: 1,
               subscription: "sub_Cxr5eVusfDmwpD",
               subscription_item: "si_Cxr5FLLMsPXBhq",
               type: "invoiceitem"
             },
             %{
               amount: 3982,
               currency: "usd",
               description: "Remaining time on Silver after 31 May 2018",
               discountable: false,
               id: "ii_1CXyMGE0U7CBdOnazohKmlP6",
               invoice_item: "ii_1CXyMGE0U7CBdOnazohKmlP6",
               livemode: false,
               metadata: %{},
               object: "line_item",
               period: %{end: 1530382817, start: 1527802256},
               plan: %Stripe.Plan{
                 amount: 4000,
                 created: 1527787680,
                 currency: "usd",
                 id: "plan_CxqFiVIY2FqTL3",
                 interval: "month",
                 interval_count: 1,
                 livemode: false,
                 metadata: %{},
                 name: "Silver",
                 object: "plan",
                 statement_descriptor: "Silver",
                 trial_period_days: nil
               },
               proration: true,
               quantity: 1,
               subscription: "sub_Cxr5eVusfDmwpD",
               subscription_item: "si_Cxr5FLLMsPXBhq",
               type: "invoiceitem"
             },
             %{
               amount: 4000,
               currency: "usd",
               description: nil,
               discountable: true,
               id: "sub_Cxr5eVusfDmwpD",
               livemode: false, 
               metadata: %{},
               object: "line_item",
               period: %{end: 1533061217, start: 1530382817},
               plan: %Stripe.Plan{
                 amount: 4000,
                 created: 1527787680,
                 currency: "usd",
                 id: "plan_CxqFiVIY2FqTL3",
                 interval: "month",
                 interval_count: 1,
                 livemode: false,
                 metadata: %{},
                 name: "Silver",
                 object: "plan", 
                 statement_descriptor: "Silver",
                 trial_period_days: nil
               },
               proration: false,
               quantity: 1,
               subscription: nil,
               subscription_item: "si_Cxr5FLLMsPXBhq",
               type: "subscription"
             },
             %{
               amount: 6000,
               currency: "usd",
               description: nil,
               discountable: true,
               id: "sub_Cxr5eVusfDmwpD",
               livemode: false,
               metadata: %{},
               object: "line_item",
               period: %{end: 1533061217, start: 1530382817},
               plan: %Stripe.Plan{
                 amount: 6000,
                 created: 1527787728,
                 currency: "usd",
                 id: "plan_CxqGQzrlZKzsyX",
                 interval: "month",
                 interval_count: 1,
                 livemode: false,
                 metadata: %{},
                 name: "Gold",
                 object: "plan",
                 statement_descriptor: "Gold",
                 trial_period_days: nil
               },
               proration: false,
               quantity: 1,
               subscription: nil,
               subscription_item: "si_CzHykruREBJmer",
               type: "subscription"
             }
           ],
           has_more: false,
           object: "list",
           total_count: 5,
           url: "/v1/invoices/upcoming/lines?customer=cus_CxY2gOrcBX568N&subscription=sub_Cxr5eVusfDmwpD&subscription_proration_date=1528121306"
         },
         livemode: false, 
         metadata: %{},
         next_payment_attempt: 1530386417,
         object: "invoice",
         paid: false,
         period_end: 1530382817,
         period_start: 1527790817,
         receipt_number: nil,
         starting_balance: 0,
         statement_descriptor: nil,
         subscription: "sub_Cxr5eVusfDmwpD",
         subscription_proration_date: 1528121306,
         subtotal: 17226,
         tax: nil,
         tax_percent: nil,
         total: 17226,
         webhooks_delivered_at: nil
       }}
      
      1. 所以我做了一个模式匹配来获取数据项(https://stripe.com/docs/billing/subscriptions/prorations
      2.   

        {:ok,%Stripe.Invoice {lines:%Stripe.List {data:data}}} = coming_invoice

        1. 然后我尝试了这个

          数据|> Enum.find(&& amp; 1.period.start == proration_date)

        2. 它返回此

        3. %{
            amount: 5235,
            currency: "usd",
            description: "Remaining time on Gold after 04 Jun 2018",
            discountable: false,
            id: "ii_1CZJPIE0U7CBdOna36eKJQfg",
            invoice_item: "ii_1CZJPIE0U7CBdOna36eKJQfg",
            livemode: false,
            metadata: %{},
            object: "line_item",
            period: %{end: 1530382817, start: 1528121306},
            plan: %Stripe.Plan{
              amount: 6000,
              created: 1527787728,
              currency: "usd",
              id: "plan_CxqGQzrlZKzsyX",
              interval: "month",
              interval_count: 1,
              livemode: false,
              metadata: %{},
              name: "Gold",
              object: "plan",
              statement_descriptor: "Gold",
              trial_period_days: nil
            },
            proration: true,
            quantity: 1,
            subscription: "sub_Cxr5eVusfDmwpD",
            subscription_item: "si_CzHzbTUPBrfqPA",
            type: "invoiceitem"
          }
          

          然后我不知道接下来该做什么。 在使用python的条带文档中,按照这样做。

          current_prorations = [ii for ii in invoice.lines.data if ii.period.start == proration_date]
          cost = sum([p.amount for p in current_prorations])
          

          但我的代码只返回1个结果,我升级了计划以检查我的代码是否返回正确的成本,但是它不正确。

          我错过了什么?

1 个答案:

答案 0 :(得分:0)

您的两行Python代码最直接的翻译是:

current_prorations = for ii <- invoice.lines.data, ii.period.start == proration_date, do: ii
cost = for(p <- current_prorations, do: p.amount) |> Enum.sum()