in-app purchaseの自動更新購読型の期限切れを調べるプログラムを書いた際にミリ秒と秒を間違えてハマったのでメモです。
ハマったところ
expires_date_ms
のフィールドの値と現在時刻のミリ秒の値を比較して期限切れ有無を調べるプログラムを書いたけどGo言語のtime.Now().Unix()
の値は秒だった。
Goのドキュメントをよく読んでなかったせいで妙にハマってしまった・・・。
対処
expires_date_ms
の値を1000で割って比較する。
ruby製の課金ライブラリveniceもミリ秒を秒に直して使用してる様子。
https://github.com/nomad/venice/blob/d2d94b04cfd544c80b61377871763420e23a54d3/lib/venice/in_app_receipt.rb#L55
環境と使ったライブラリ
言語
Go 1.7.4
ライブラリ:
dogenzaka/go-iap
※レシート検証APIへレシートをポストするためのライブラリ。今回はAppStoreのレシート検証APIを叩くために使用
APIで返ってくるレシートの形式
{
"quantity": "1",
"product_id": "com.test.autorenewable",
"transaction_id": "1000000288220000",
"original_transaction_id": "1000000288220000",
"is_trial_period": "false",
"app_item_id": "",
"version_external_identifier": "",
"web_order_line_item_id": "1000000034760000",
"purchase_date": "2017-04-06 10:14:19 Etc/GMT",
"purchase_date_ms": "1491473659000",
"purchase_date_pst": "2017-04-06 03:14:19 America/Los_Angeles",
"original_purchase_date": "2017-04-06 10:09:20 Etc/GMT",
"original_purchase_date_ms": "1491473360000",
"original_purchase_date_pst": "2017-04-06 03:09:20 America/Los_Angeles",
"expires_date": "2017-04-06 10:19:19 Etc/GMT",
"expires_date_ms": "1491473959000",
"expires_date_pst": "2017-04-06 03:19:19 America/Los_Angeles",
"cancellation_date": "",
"cancellation_date_ms": "",
"cancellation_date_pst": ""
}
書いたプログラム
// タイムゾーンをEtc/GMTにします。
loc, err := time.LoadLocation("Etc/GMT")
if err != nil {
loc = time.FixedZone("Etc/GMT", 9*60*60)
}
// レシートの期限が切れていないか確認
// receipt.ExpiresDateMsがexpires_date_msになります。
if i, err := strconv.ParseInt(receipt.ExpiresDateMs, 10, 64); err != nil || time.Now().In(loc).Unix() > (i/1000) {
// ここにレシートの期限が切れていた場合の処理を書きます。
}
注意
書いといてなんですが、課金処理はいまいち自信なしです。