Python으로 Stripe 로그 및 Invoice 정보 수집

이 문서는 Stripe Advent Calendar 2018의 12월 7일 항목입니다.

Stripe를 운용하고 있어, 단번에 로그를 취득하고 싶은 경우나 다음에 오는 정기 지불의 Invoice를 정리해 확인하고 싶은 경우 등, 대시보드 경유라고 꽤 생각한 것처럼 가지 않는 일도 많을까 생각합니다. 나는 파이썬을 사용하여 처리하는 경우가 많기 때문에 그 방법을 정리해 보았습니다.

준비


pip install stripe

Stripe SDK를 설치합니다.

API 키 가져오기



API 요청에서 실수하지 않도록 제한된 API 키를 만듭니다.
Stripe 대시보드에서 만들 수 있습니다. "Restricted keys"라는 곳에서 제한된 API 키를 만들 수 있습니다.


LIVE 키를 사용하여 너무 골고루 하면 사고했을 때 매우 무섭기 때문에 참조 조작의 경우는 읽기만의 액세스를 붙인 키로 작업합니다.

로그의 일괄 취득(기본 조작)



로그를 정리해 취득하는 경우는, List all events 를 사용하는 것이 편리합니다.
htps : // st 리페. 코 m / 드 cs / 아피 / 에ゔ ㅇ ts / ぃ St

전체 코드는 이런 느낌이 듭니다. 2018년 11월의 이벤트를 모두 취득해, 이벤트의 타입을 화면에 표시하는 처리입니다.

get_log.py
import stripe
import datetime
import time

stripe.api_key = "rk_test_1xxxxxxxxxxxxxxxxxxxxxxx"

# 日付の文字列を Stripe API で使う UNIX タイムスタンプに変換する関数
def convert_to_time(formated_date):
    return int(time.mktime(datetime.datetime.strptime(formated_date, '%Y-%m-%d %H:%M:%S').timetuple()))

# 100件ずつリクエストして、次のデータがなくなるまで取得
starting_after = None
while True:
    result = stripe.Event.list(
        created = {
            'gte': convert_to_time('2018-11-1 00:00:00'),
            'lte': convert_to_time('2018-12-1 00:00:00')
        },
        starting_after=starting_after,
        limit=100
    )
    if len(result) == 0:
        break

    # 結果を出力
    for data in result['data']:
        starting_after = data['id']    # ここで Event の Object id を保持
        print(data['type'])


List event 의 API 는 1회의 리퀘스트로 취득할 수 있는 상한 건수가 100건입니다. starting_after 매개 변수를 지정하여 요청하면 첫 번째 데이터를 검색할 수 있습니다. 데이터를 표시하는 루프 안에서, Event 의 Object id 를 보관 유지해 두는 것으로, 다음의 요구시에 계속으로부터 데이터를 취득할 수 있게 됩니다.

다른 Stripe 의 API도 List 계의 것은 같은 생각이므로, 기본형으로서 마스터 해 두면 안심입니다.

이벤트 유형은 공식 문서에 기재되어 있습니다.
htps : // st 리페. 코 m / 드 cs / 아피 / 에 ぇ ts / ty ぺ s

모든 건의 로그를 가져오면 Stripe의 데이터 구조와 이벤트가 발생하는 흐름을 더 깊이 이해할 수 있을까 생각합니다.

로그의 일괄 취득(응용형)



파라미터에 type 을 지정하는 것으로 여러가지 좁힐 수 있습니다.

성공한 Invoice.py
    result = stripe.Event.list(
        created = {
            'gte': convert_to_time('2018-11-1 00:00:00'),
            'lte': convert_to_time('2018-11-10 00:00:00')
        },
        starting_after=starting_after,
        limit=100,
        type='invoice.payment_succeeded'
    )

Invoice 관련 .py
        type='invoice.payment*'

고객 정보 관련.py
        type='customer*'

이와 같이, 와일드 카드도 사용할 수 있으므로 비교적 유연하게 취득할 수 있습니다.

Invoice 집계



앞으로 발생하는 Invoice를 확인하고 집계하고 싶은 경우는 아래와 같습니다. 직접 Upcoming의 Invoice를 List 하는 방법을 찾을 수 없었기 때문에, 한 번 Subscription 의 리스트를 취득해 Customer 마다 취득하고 있습니다.

amount_of_upcomming.py
count = 0
total = 0
while True:
    result = stripe.Subscription.list(
        starting_after=starting_after,
        limit=100
    )
    if len(result) == 0:
        break

    for data in result['data']:
        starting_after = data['id']
        invoices = stripe.Invoice.upcoming(
            customer=data['customer']
        )
        count = count + 1
        total = total + invoices['total']

print('人数: ' + str(count))
print('合計金額: ' + str(total))

요약



Stripe 에서는 SDK 를 사용하는 것으로 매우 간단하게 데이터를 취득하는 것이 가능하게 되어 있습니다. 기존 대시보드에서도 충분히 강력한 기능을 갖고 있습니다만, 독자적인 데이터를 집계하고 싶은 경우에도, 기본적인 데이터는 모두 API 경유로 취득할 수 있습니다.

이 근처의 유연성은 개발자로서 매우 고맙습니다.

KR_Stripes 히로시마



JP_Stripes 히로시마는 현재 Vol.3까지 개최되었습니다! 등단자가 부족하기 때문에, 히로시마에 올 예정이 있는 분, 또는 거주하는 분으로 「말해도 좋다!」라고 하는 분은 꼭 연락을 기다리고 있습니다.

좋은 웹페이지 즐겨찾기