lib/itunes/receipt.rb in itunes-receipt-0.0.5 vs lib/itunes/receipt.rb in itunes-receipt-0.1.0
- old
+ new
@@ -8,41 +8,52 @@
@status = attributes[:status]
super attributes[:exception]
end
end
- attr_reader :quantity, :product_id, :transaction_id, :purchase_date, :app_item_id, :version_external_identifier, :bid, :bvrs, :original
+ # expires_date, receipt_data, and latest (receipt) will only appear for autorenew subscription products
+ attr_reader :quantity, :product_id, :transaction_id, :purchase_date, :app_item_id, :version_external_identifier, :bid, :bvrs, :original, :expires_date, :receipt_data, :latest
def initialize(attributes = {})
- if attributes[:quantity]
- @quantity = attributes[:quantity].to_i
+ receipt_attributes = attributes.with_indifferent_access[:receipt]
+ if receipt_attributes[:quantity]
+ @quantity = receipt_attributes[:quantity].to_i
end
- @product_id = attributes[:product_id]
- @transaction_id = attributes[:transaction_id]
- @purchase_date = if attributes[:purchase_date]
- Time.parse attributes[:purchase_date].sub('Etc/', '')
+ @product_id = receipt_attributes[:product_id]
+ @transaction_id = receipt_attributes[:transaction_id]
+ @purchase_date = if receipt_attributes[:purchase_date]
+ Time.parse receipt_attributes[:purchase_date].sub('Etc/', '')
end
- @app_item_id = attributes[:app_item_id]
- @version_external_identifier = attributes[:version_external_identifier]
- @bid = attributes[:bid]
- @bvrs = attributes[:bvrs]
- if attributes[:original_transaction_id] || attributes[:original_purchase_date]
- @original = self.class.new(
- :transaction_id => attributes[:original_transaction_id],
- :purchase_date => attributes[:original_purchase_date]
- )
+ @app_item_id = receipt_attributes[:app_item_id]
+ @version_external_identifier = receipt_attributes[:version_external_identifier]
+ @bid = receipt_attributes[:bid]
+ @bvrs = receipt_attributes[:bvrs]
+ if receipt_attributes[:original_transaction_id] || receipt_attributes[:original_purchase_date]
+ @original = self.class.new(:receipt => {
+ :transaction_id => receipt_attributes[:original_transaction_id],
+ :purchase_date => receipt_attributes[:original_purchase_date]
+ })
end
+
+ # autorenew subscription handling
+ # attributes[:latest_receipt_info] and attributes[:latest_receipt] will be nil if you already have the receipt for the most recent renewal.
+ if attributes[:latest_receipt_info]
+ full_receipt_data = attributes[:latest_receipt] # should also be in the top-level hash if attributes[:latest_receipt_info] is there, but this won't break if it isn't
+ @latest = self.class.new(:receipt => attributes[:latest_receipt_info], :latest_receipt => full_receipt_data, :receipt_type => :latest)
+ end
+ @expires_date = Time.at(receipt_attributes[:expires_date].to_i / 1000) if receipt_attributes[:expires_date]
+ @receipt_data = attributes[:latest_receipt] if attributes[:receipt_type] == :latest # it feels wrong to include the receipt_data for the latest receipt on anything other than the latest receipt
end
def self.verify!(receipt_data)
response = RestClient.post(
Itunes.endpoint,
{:'receipt-data' => receipt_data}.to_json
)
response = JSON.parse(response).with_indifferent_access
case response[:status]
when 0
- new response[:receipt]
+ new response
else
raise VerificationFailed.new(response)
end
end
end