lib/candy_check/app_store/receipt.rb
module CandyCheck
module AppStore
# Describes a successful response from the AppStore verification server
class Receipt
include Utils::AttributeReader
# @return [Hash] the raw attributes returned from the server
attr_reader :attributes
# Initializes a new instance which bases on a JSON result
# from Apple's verification server
# @param attributes [Hash]
def initialize(attributes)
@attributes = attributes
end
# In most cases a receipt is a valid transaction except when the
# transaction was canceled.
# @return [Boolean]
def valid?
!has?("cancellation_date")
end
# The receipt's transaction id
# @return [String]
def transaction_id
read("transaction_id")
end
# The receipt's original transaction id which might differ from
# the transaction id for restored products
# @return [String]
def original_transaction_id
read("original_transaction_id")
end
# The version number for the app
# @return [String]
def app_version
read("bvrs")
end
# The app's bundle identifier
# @return [String]
def bundle_identifier
read("bid")
end
# The app's identifier of the product (SKU)
# @return [String]
def product_id
read("product_id")
end
# The app's item id of the product
# @return [String]
def item_id
read("item_id")
end
# The quantity of the product
# @return [Integer]
def quantity
read_integer("quantity")
end
# The purchase date
# @return [DateTime]
def purchase_date
read_datetime_from_string("purchase_date")
end
# The original purchase date which might differ from the
# actual purchase date for restored products
# @return [DateTime]
def original_purchase_date
read_datetime_from_string("original_purchase_date")
end
# The date of when Apple has canceled this transaction.
# From Apple's documentation: "Treat a canceled receipt
# the same as if no purchase had ever been made."
# @return [DateTime]
def cancellation_date
read_datetime_from_string("cancellation_date")
end
# The date of a subscription's expiration
# @return [DateTime]
def expires_date
read_datetime_from_string("expires_date")
end
# rubocop:disable Naming/PredicateName
def is_trial_period
# rubocop:enable Naming/PredicateName
read_bool("is_trial_period")
end
end
end
end