ReceiptVerifier

Verify iTunes receipt with the App Store.

⚠️ Only iOS 7 style app receipts is supported.

Build Status Hex.pm codebeat badge Inline docs

Installation

If available in Hex, the package can be installed as:

  1. Add receipt_verifier to your list of dependencies in mix.exs:
def deps do
[{:receipt_verifier, "~> 0.7.0"}]
end
  1. Ensure receipt_verifier is started before your application:
def application do
[applications: [:receipt_verifier]]
end

Usage

Use ReceiptVerifier/2 to verify the receipt. which accepts a Base64-Encoded receipt data and an optional option.

Options:

An Example

iex> ReceiptVerifier.verify(base64_encoded_receipt_data)
...> %ReceiptVerifier.ResponseData{app_receipt: %ReceiptVerifier.AppReceipt{adam_id: 0,
app_item_id: 0, application_version: "1241",
bundle_id: "com.sumiapp.GridDiary", download_id: 0,
in_app: [%ReceiptVerifier.IAPReceipt{expires_date: nil,
is_trial_period: false,
original_purchase_date: %DateTime{calendar: Calendar.ISO, day: 17, hour: 6,
microsecond: {491000, 6}, minute: 52, month: 1, second: 13, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
original_transaction_id: "1000000118990828",
product_id: "com.sumiapp.GridDiary.pro",
purchase_date: %DateTime{calendar: Calendar.ISO, day: 17, hour: 7,
microsecond: {546000, 6}, minute: 33, month: 1, second: 48, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
quantity: 1, transaction_id: "1000000118990828",
web_order_line_item_id: nil},
%ReceiptVerifier.IAPReceipt{expires_date: nil, is_trial_period: false,
original_purchase_date: %DateTime{calendar: Calendar.ISO, day: 17, hour: 7,
microsecond: {546000, 6}, minute: 33, month: 1, second: 48, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
original_transaction_id: "1000000122102348",
product_id: "com.sumiapp.griddiary.test",
purchase_date: %DateTime{calendar: Calendar.ISO, day: 17, hour: 7,
microsecond: {546000, 6}, minute: 33, month: 1, second: 48, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
quantity: 1, transaction_id: "1000000122102348",
web_order_line_item_id: nil}], original_application_version: "1.0",
original_purchase_date: %DateTime{calendar: Calendar.ISO, day: 16, hour: 22,
microsecond: {400000, 6}, minute: 2, month: 1, second: 20, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
receipt_creation_date: %DateTime{calendar: Calendar.ISO, day: 17, hour: 7,
microsecond: {546000, 6}, minute: 33, month: 1, second: 48, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
receipt_type: "ProductionSandbox",
request_date: %DateTime{calendar: Calendar.ISO, day: 18, hour: 2,
microsecond: {590831, 6}, minute: 47, month: 1, second: 30, std_offset: 0,
time_zone: "Etc/UTC", utc_offset: 0, year: 1970, zone_abbr: "UTC"},
version_external_identifier: 0}, base64_latest_app_receipt: nil,
latest_iap_receipts: []}

Error handling

If there is error, ReceiptVerifier.verify/1 will return {:error, %ReceiptVerifier.Error{code: code, message: msg}}.

An example:

{:error, %ReceiptVerifier.Error{code: 21002, message: "The data in the receipt-data property was malformed or missing."}}