読者です 読者をやめる 読者になる 読者になる

kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

WebPay3分後のあと〜顧客の詳細をまねる〜

webpay

WebPay: 開発者向けクレジットカード決済サービスを使う流れになりそうなので、ちょっと実際に試してみることにしたので、そのメモ。

アカウント作って、3分で分かる使い方に従って、課金したり顧客を作ったりした後にダッシュボードを見ると、課金情報とかが表示されるようになっている。
で、顧客の情報をクリックすると顧客の詳細情報が表示されるようになりますが、これをどうプログラムで取得するかについて勉強がてら調べてみた。

今回書いたサンプル的なコードの全体はGistにあげておいた。
Rubyを使いました。

顧客情報の詳細

これは、Customerオブジェクトを取得して、それから直接的に取得できる。
コードは以下のような感じ。

customer = Stripe::Customer.retrieve("cus_c4F1nGgK7eEwegF")

puts "顧客情報の詳細"
puts " ID: #{customer.id}"
puts " 作成日: " + Time.at(customer.created).strftime("%Y/%m/%d %H:%M %Z")
puts " メールアドレス: " + (customer.email ? customer.email : "未登録")
puts " メモ: #{customer.description}"

あまり説明もいらないと思う。

クレジットカード情報

Customerオブジェクトのactive_card属性から情報を取得できる。

card = customer.active_card
puts "クレジットカード情報"
puts " 名前: #{card.name}"
puts " カード番号(下4桁): #{card.last4}"
puts " 有効期限: #{card.exp_month} / #{card.exp_year}"
puts " タイプ: #{card.type}"

カード番号全体は取得できないようになっている。下4桁のみ取得可能。

課金履歴

最初に悩んだのがこの課金履歴。
Customerオブジェクト自体から取得するものではなく、Chargesの方から検索するような感じとなる。

puts "課金履歴"
charges = Stripe::Charge.all(:count => 100, :customer => "cus_c4F1nGgK7eEwegF")
charges.each do |charge|
  puts " 金額 => #{charge.amount} (#{charge.currency}), メモ => #{charge.description ? charge.description : charge.id}, 課金日時 => #{Time.at(charge.created).strftime("%Y/%m/%d %H:%M %Z")}"
end

注:実際は課金履歴が100件以上の場合も考慮して記述する必要がある。

加入中の定期課金プラン

CustomerオブジェクトのSubscriptionオブジェクトから情報を取得する。
またSubscriptionオブジェクト内のPlanオブジェクトからも情報を取得する。

subscription = customer.subscription
puts "加入中の定期課金プラン"
puts " ステータス: " + (subscription ? "加入中" : "プランに加入していません。")
puts " プラン: #{subscription.plan.name}#{subscription.plan.amount} / #{subscription.plan.interval})"
puts " 次回の課金日: " + Time.at(subscription.current_period_end + 1).strftime("%Y/%m/%d %H:%M %Z")

少なくとも次回に課金があるかのチェックは必要なはず。
その上で、次回の課金日がこの方法でよいのか疑問。だけど、この次回の課金日という明示的な情報がないので、これが一番妥当そう。

定期課金の請求情報

これはChargesと同様にInvoicesから検索するような感じとなる。

puts "定期課金の請求情報"
invoices = Stripe::Invoice.all(:count => 100, :customer => "cus_c4F1nGgK7eEwegF")
invoices.each do |invoice|
  puts " 金額 => #{invoice.total} (#{invoice.currency}), ID => #{invoice.id}, 請求日時 => #{Time.at(invoice.date).strftime("%Y/%m/%d %H:%M %Z")}"
end

とりあえずざっとこんな感じで、ダッシュボードで表示される情報と同等なデータを得ることができた。
つづく(?)