『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

Djangoで使えるiOS用のIAPのレシート検証サーバサイドのライブラリパッケージをリリースした

はじめに

なんかタイトルから意味わからんって自分でもなったので、自分でもわかるようにちょっと説明すると。

In-App Purchase っていうアプリ内課金のレシートがあるんですけど、それの検証をサーバサイドに持っていくことが多くあるんですが、
それのDjango用のライブラリパッケージです。

github.com

Starください!

pypi.python.org

一応、AppleDeveloperProgramに加入していないと検証サーバ等を叩けないと思うので、そこら辺はごめんなさい

対応バージョン

Python

2.7, 3.4, 3.5, 3.6

setup.py にPython3.7対応してるみたいなこと書いてますが、対応してないです。ごめんなさい。確認不足でした。

Django

1.7 - 1.11

2.0はまだ確認してないので以後対応していきます。2.0に対応したあとはPython2.7は切り捨てます。

インストール

pipでのインストール

$ pip install django-ios-storekit

Gitクローンでのインストール

$ pip install https://github.com/nnsnodnb/django-ios-storekit.git && cd /path/to/django-ios-storekit
$ python setup.py install

Wheelでのインストールにも対応してるのですが、私は使ったことないので知らん!!

使い方

project_name/settings.pyINSTALLED_APPSstorekit を追加

INSTALLED_APPS += (
    'storekit',
)

同じく project_name/settings.pySTOREKIT_APP_BUNDLE_ID を追加

これはXcodeで設定する com.example.sample のようなやつ

STOREKIT_APP_BUNDLE_ID = 'com.example.sample'

同じく project_name/settings.pySTOREKIT_PURCHASED_SECRET を追加

これは、後で説明する 定期購読型 に使われるものだけで使用するシークレットキーです。

STOREKIT_PURCHASED_SECRET = ''

検証用DBがあるのでマイグレーション

$ python manage.py migrate

検証実装

IAPには大きく分けて、 消費型 非消費型 定期購読型 があります。
その中でもレシートは2つに分類されていたような気がします。(ちょっと曖昧。)多分この曖昧さがバグを生み出してしまっている可能性が高い。

消費型非消費型 で1つ。 定期購読型 で1つのレシートの分類。

前者の実装例

from storekit.receipt import normal_receipt


def hoge(request):
    ・・・
    receipt = request.POST['receipt']  # iOSアプリからreceiptのキーでpayloadにデータが含まれている場合
    purchases = normal_receipt(receipt, sandbox=True)  # sandboxサーバはこっち
    # purchases = normal_receipt(receipt, sandbox=False)  # 本番サーバはこっち
    ・・・

後者の実装例

from storekit.receipt import subscribe_receipt

def hoge(request):
    ・・・
    receipt = request.POST['receipt']
    purchases = subscribe_receipt(receipt, sandbox=True)
    # purchases = subscribe_receipt(receipt, sandbox=False)
    ・・・

どっちも storekit.modelsPurchase が1番親でリストで戻ってきます。

https://github.com/nnsnodnb/django-ios-storekit/blob/master/storekit/tests/response.jsongithub.com

上記テストで使用しているJSONの形式だと認識してもらえればいいかと思います。
ちなみに上記は 消費型 での本物のレスポンスの値を弄ったものなので値を信用しなければ正確さは高いかと思います。

モデルも使用しているのでDBにレシート全体が保存されるようにはなっています。

最後に

今後ちゃんと、 非消費型 定期購読型 のレシートも拾ってきてテストコードに入れて確実なものにします。
また、バグがあればIssue立ててもらえるとモチベーション上がるのでお願いしますm( )m

また、ディレクトリ構成がまたクソな感じになってたり example があるのに、実装がないとかふざけたものがあるのでちゃんとやります。