module RubyNative::IAP::Decodable
def decode_and_verify_jws(jws)
def decode_and_verify_jws(jws) JWT.decode(jws, nil, true, algorithm: "ES256") { |header| verify_certificate_chain(header["x5c"]) }.first end
def parse_notification(signed_payload)
def parse_notification(signed_payload) payload = decode_and_verify_jws(signed_payload) transaction_info = decode_and_verify_jws(payload["data"]["signedTransactionInfo"]) Notification.new( notification_type: payload["notificationType"], subtype: payload["subtype"], notification_uuid: payload["notificationUUID"], bundle_id: payload["data"]["bundleId"], app_account_token: transaction_info["appAccountToken"], product_id: transaction_info["productId"], original_transaction_id: transaction_info["originalTransactionId"], transaction_id: transaction_info["transactionId"], purchase_date: parse_timestamp(transaction_info["purchaseDate"]), expires_date: parse_timestamp(transaction_info["expiresDate"]), offer_type: transaction_info["offerType"], environment: payload["data"]["environment"]&.downcase ) end
def parse_timestamp(milliseconds)
def parse_timestamp(milliseconds) return nil if milliseconds.nil? Time.at(milliseconds / 1000.0).utc end