Skip to content

Commit

Permalink
Adds support for the 'cancellation_date' field for autorenewable subs…
Browse files Browse the repository at this point in the history
…criptions.

Users can contact Apple customer support to cancel an autorenewable
subscription.  After doing so, validating a receipt for the subscription
will return a response with a 'cancellation_date' field.

From the Apple docs:

  "For a transaction that was canceled by Apple customer support, the time and
  date of the cancellation.  Treat a canceled receipt the same as if no purchase
  had ever been made."

Closes nov#18
  • Loading branch information
Gordon McNaughton committed Aug 24, 2015
1 parent cbe5d7f commit 1e0411a
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
12 changes: 12 additions & 0 deletions lib/itunes/receipt.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ def initialize(attributes = {})
:bvrs,
:download_id,
:expires_date,
:cancellation_date,
:cancellation_date_ms,
:cancellation_date_pst,
:in_app,
:is_trial_period,
:itunes_env,
Expand Down Expand Up @@ -61,6 +64,15 @@ def initialize(attributes = {})
@expires_date = if receipt_attributes[:expires_date]
Time.at(receipt_attributes[:expires_date].to_i / 1000)
end
@cancellation_date = if receipt_attributes[:cancellation_date]
Time.parse receipt_attributes[:cancellation_date].sub('Etc/GMT', 'GMT')
end
@cancellation_date_ms = if receipt_attributes[:cancellation_date_ms]
receipt_attributes[:cancellation_date_ms].to_i
end
@cancellation_date_pst = if receipt_attributes[:cancellation_date_pst]
Time.parse receipt_attributes[:cancellation_date_pst].sub('America/Los_Angeles', 'PST')
end
@in_app = if receipt_attributes[:in_app]
receipt_attributes[:in_app].map { |ia| self.class.new(:receipt => ia) }
end
Expand Down
2 changes: 2 additions & 0 deletions spec/fake_json/autorenew_subscription_cancelled.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"receipt":{"original_purchase_date_pst":"2012-10-11 07:45:40 America/Los_Angeles", "unique_identifier":"4d69cc362c5c58ce62da68ee43721ea670907bad", "original_transaction_id":"1000000057005439", "expires_date":"1350157508197", "cancellation_date":"2012-10-13 19:42:08 Etc/GMT", "cancellation_date_ms":"1350157328197", "cancellation_date_pst":"2012-10-13 12:42:08 America/Los_Angeles", "transaction_id":"1000000055076747", "quantity":"1", "product_id":"com.notkeepingitreal.fizzbuzz.subscription.autorenew1m", "original_purchase_date_ms":"1349966740000", "bid":"com.notkeepingitreal.fizzbuzz", "web_order_line_item_id":"1000000026553289", "bvrs":"1.0", "expires_date_formatted":"2012-10-13 19:45:08 Etc/GMT", "purchase_date":"2012-10-13 19:40:08 Etc/GMT", "purchase_date_ms":"1350157208197", "expires_date_formatted_pst":"2012-10-13 12:45:08 America/Los_Angeles", "purchase_date_pst":"2012-10-13 12:40:08 America/Los_Angeles", "original_purchase_date":"2012-10-11 14:45:40 Etc/GMT", "item_id":"570504929"}, "latest_receipt_info":{"original_purchase_date_pst":"2012-10-11 07:45:40 America/Los_Angeles", "unique_identifier":"4d79cc562c5c58ce62da68ee43721ea670907bad", "original_transaction_id":"1000000057005439", "expires_date":"1350157808000", "cancellation_date":"2012-10-13 19:42:08 Etc/GMT", "cancellation_date_ms":"1350157328197", "cancellation_date_pst":"2012-10-13 12:42:08 America/Los_Angeles", "transaction_id":"1000000052076747", "quantity":"1", "product_id":"com.notkeepingitreal.fizzbuzz.subscription.autorenew1m", "original_purchase_date_ms":"1349966740000", "bid":"com.notkeepingitreal.fizzbuzz", "web_order_line_item_id":"1000000027293289", "bvrs":"1.0", "expires_date_formatted":"2012-10-13 19:50:08 Etc/GMT", "purchase_date":"2012-10-13 19:40:08 Etc/GMT", "purchase_date_ms":"1350157208000", "expires_date_formatted_pst":"2012-10-13 12:50:08 America/Los_Angeles", "purchase_date_pst":"2012-10-13 12:40:08 America/Los_Angeles", "original_purchase_date":"2012-10-11 14:45:40 Etc/GMT", "item_id":"570504929"}, "status":0, "latest_receipt":"junk="}

20 changes: 20 additions & 0 deletions spec/itunes/receipt_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,10 @@
receipt.original.quantity.should be_nil
receipt.original.transaction_id.should == '1000000001479608'
receipt.original.purchase_date.should == Time.utc(2011, 2, 17, 6, 20, 57)
receipt.original.cancellation_date.should be_nil
receipt.expires_date.should be_nil
receipt.receipt_data.should be_nil
receipt.cancellation_date.should be_nil
receipt.itunes_env.should == :production

# Those attributes are not returned from iTunes Connect Sandbox
Expand Down Expand Up @@ -143,6 +145,7 @@
receipt.bid.should be_nil
receipt.bvrs.should be_nil
receipt.expires_date.should be_nil
receipt.cancellation_date.should be_nil
receipt.receipt_data.should be_nil
receipt.itunes_env.should == :production

Expand Down Expand Up @@ -172,6 +175,7 @@
receipt.original.transaction_id.should == original_transaction_id
receipt.original.purchase_date.should == original_purchase_date
receipt.expires_date.should == Time.utc(2012, 10, 13, 19, 45, 8)
receipt.cancellation_date.should be_nil
receipt.receipt_data.should be_nil

# Those attributes are not returned from iTunes Connect Sandbox
Expand All @@ -185,6 +189,7 @@
latest.transaction_id.should == '1000000052076747'
latest.purchase_date.should == Time.utc(2012, 10, 13, 19, 40, 8)
latest.expires_date.should == Time.utc(2012, 10, 13, 19, 50, 8) # five minutes after the "old" receipt
latest.cancellation_date.should be_nil
latest.bid.should == 'com.notkeepingitreal.fizzbuzz'
latest.bvrs.should == '1.0'
latest.original.quantity.should be_nil
Expand Down Expand Up @@ -213,6 +218,21 @@

end

context 'when cancelled autorenew subscription' do
before do
fake_json :autorenew_subscription_cancelled
end

it 'should return valid Receipt instance for autorenew subscription, with the cancellation_date field set' do
receipt = Itunes::Receipt.verify! 'autorenew_subscription_cancelled'
receipt.should be_instance_of Itunes::Receipt
receipt.purchase_date.should == Time.utc(2012, 10, 13, 19, 40, 8)
receipt.expires_date.should == Time.utc(2012, 10, 13, 19, 45, 8)
receipt.cancellation_date.should == Time.utc(2012, 10, 13, 19, 42, 8) # user cancelled via Apple Customer Support 2 minutes after their subscription began
end

end

context 'when offline' do
before do
fake_json :offline
Expand Down

0 comments on commit 1e0411a

Please sign in to comment.