Stripe の Order で送料を商品によって変更するときは Callback API を実装する必要がある

Stripe の Order で送料を設定するパターンは 4 つある。

  • Free
  • Flat-rate
  • Callback
  • Provider

f:id:star__hoshi:20171129120506p:plain

Stripe Document

この情報は 2017-11-29 時点の情報であり、正確な情報は Orders API Dynamic Shipping and Tax Calculation を参照してほしい。

Order の種類

Order は sku に対し行うもので、初期状態だと送料を設定できない。
送料を設定するには https://dashboard.stripe.com/account/relay/settings の設定を変更する。

Free

送料無料。デフォルトでこれ。

Flat-rate

一律同じ送料。商品の個数や配達先に関係なく送料が同じになる。

Provider

サードパーティの配達先と連携できる。
海の向こうだとこういうサービスが整っていて、 API 投げたらよしなに送料など計算して配送してくれるようだ。

Callback

一番自由度が高く、しかし実装コストが面倒。コールバック URL を指定する必要がある。

流れとしてはこんな感じになる。

  1. ユーザが商品を購入する
  2. Stripe で Order.create する
  3. Stripe から送料いくらにする? って聞かれる
    • Callback API が叩かれるので、 API を用意しておく
  4. 送料が設定され Order.create が完了する

Callback API

コードは雑なんだけど、ざっくりこんな感じで実装する、TypeScript で書いてある。
Stripe から飛んできた Order に対し送料を渡して Update する。

export const orderCallback = functions.https.onRequest(async (request, response) => {
  if (request.method.toLowerCase() !== 'post') { response.status(405).end() }

  const stripeOrderID: string = request.body.order.id
  const itemIDs: string[] = request.body.order.metadata.itemIDs
  const items: Item[] = itemIDs.map(itemID => {
    // 送料などの情報を持った Item を取得
  }

  const shippingMethods = items.map(item => {
    return {
      id: item.id,
      amount:item.postage,
      description: item.shippingMethod,
      currency: 'jpy'
    }
  })

  const json = {
    order_update: {
      order_id: stripeOrderID,
      shipping_methods: shippingMethods
    }
  }

  response.status(200).json(json)
})

雑実装なので、 Production 入れる前にもっとエラーハンドリングしないとまずいですね。

おわり

Order するときに shipping_methods も渡せればいいのにと思うけど、まあ色々事情があるのだと思う。

ちなみにこの情報は https://stripe.com/docs を眺めていてもどこにもリンクがなく、 Stripe の設定画面を眺めていたら配送設定みたいなのがあって、そこから document にたどり着いた。
重要な情報だし最初からリンク載せておいてくれ〜...