forked from Mirrors/go-iap
append new IAP receipt fields
This commit is contained in:
@@ -1,10 +1,19 @@
|
|||||||
package appstore
|
package appstore
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
// https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html
|
||||||
// The IAPRequest type has the request parameter
|
// The IAPRequest type has the request parameter
|
||||||
IAPRequest struct {
|
IAPRequest struct {
|
||||||
ReceiptData string `json:"receipt-data"`
|
ReceiptData string `json:"receipt-data"`
|
||||||
Password string `json:"password,omitempty"`
|
Password string `json:"password,omitempty"`
|
||||||
|
ExcludeOldTransactions bool `json:"exclude_old_transactions,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// The ReceiptCreationDate type indicates the date when the app receipt was created.
|
||||||
|
ReceiptCreationDate struct {
|
||||||
|
CreationDate string `json:"receipt_creation_date"`
|
||||||
|
CreationDateMS string `json:"receipt_creation_date_ms"`
|
||||||
|
CreationDatePST string `json:"receipt_creation_date_pst"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// The RequestDate type indicates the date and time that the request was sent
|
// The RequestDate type indicates the date and time that the request was sent
|
||||||
@@ -48,14 +57,23 @@ type (
|
|||||||
ProductID string `json:"product_id"`
|
ProductID string `json:"product_id"`
|
||||||
TransactionID string `json:"transaction_id"`
|
TransactionID string `json:"transaction_id"`
|
||||||
OriginalTransactionID string `json:"original_transaction_id"`
|
OriginalTransactionID string `json:"original_transaction_id"`
|
||||||
IsTrialPeriod string `json:"is_trial_period"`
|
|
||||||
AppItemID string `json:"app_item_id"`
|
AppItemID string `json:"app_item_id"`
|
||||||
VersionExternalIdentifier string `json:"version_external_identifier"`
|
VersionExternalIdentifier string `json:"version_external_identifier"`
|
||||||
WebOrderLineItemID string `json:"web_order_line_item_id"`
|
WebOrderLineItemID string `json:"web_order_line_item_id"`
|
||||||
|
|
||||||
|
IsTrialPeriod string `json:"is_trial_period"`
|
||||||
|
SubscriptionExpirationIntent string `json:"expiration_intent"`
|
||||||
|
SubscriptionRetryFlag string `json:"is_in_billing_retry_period"`
|
||||||
|
SubscriptionAutoRenewProductID string `json:"auto_renew_product_id"`
|
||||||
|
SubscriptionAutoRenewStatus string `json:"auto_renew_status"`
|
||||||
|
SubscriptionPriceConsentStatus string `json:"price_consent_status"`
|
||||||
|
ExpiresDate
|
||||||
|
|
||||||
PurchaseDate
|
PurchaseDate
|
||||||
OriginalPurchaseDate
|
OriginalPurchaseDate
|
||||||
ExpiresDate
|
|
||||||
CancellationDate
|
CancellationDate
|
||||||
|
CancellationReason string `json:"cancellation_reason"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// The Receipt type has whole data of receipt
|
// The Receipt type has whole data of receipt
|
||||||
@@ -66,12 +84,24 @@ type (
|
|||||||
BundleID string `json:"bundle_id"`
|
BundleID string `json:"bundle_id"`
|
||||||
ApplicationVersion string `json:"application_version"`
|
ApplicationVersion string `json:"application_version"`
|
||||||
DownloadID int64 `json:"download_id"`
|
DownloadID int64 `json:"download_id"`
|
||||||
|
VersionExternalIdentifier int64 `json:"version_external_identifier"`
|
||||||
OriginalApplicationVersion string `json:"original_application_version"`
|
OriginalApplicationVersion string `json:"original_application_version"`
|
||||||
InApp []InApp `json:"in_app"`
|
InApp []InApp `json:"in_app"`
|
||||||
|
ReceiptCreationDate
|
||||||
RequestDate
|
RequestDate
|
||||||
OriginalPurchaseDate
|
OriginalPurchaseDate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A pending renewal may refer to a renewal that is scheduled in the future or a renewal that failed in the past for some reason.
|
||||||
|
PendingRenewalInfo struct {
|
||||||
|
SubscriptionExpirationIntent string `json:"expiration_intent"`
|
||||||
|
SubscriptionAutoRenewProductID string `json:"auto_renew_product_id"`
|
||||||
|
SubscriptionRetryFlag string `json:"is_in_billing_retry_period"`
|
||||||
|
SubscriptionAutoRenewStatus string `json:"auto_renew_status"`
|
||||||
|
SubscriptionPriceConsentStatus string `json:"price_consent_status"`
|
||||||
|
ProductID string `json:"product_id"`
|
||||||
|
}
|
||||||
|
|
||||||
// The IAPResponse type has the response properties
|
// The IAPResponse type has the response properties
|
||||||
// We defined each field by the current IAP response, but some fields are not mentioned
|
// We defined each field by the current IAP response, but some fields are not mentioned
|
||||||
// in the following Apple's document;
|
// in the following Apple's document;
|
||||||
@@ -83,5 +113,8 @@ type (
|
|||||||
Receipt Receipt `json:"receipt"`
|
Receipt Receipt `json:"receipt"`
|
||||||
LatestReceiptInfo []InApp `json:"latest_receipt_info"`
|
LatestReceiptInfo []InApp `json:"latest_receipt_info"`
|
||||||
LatestReceipt string `json:"latest_receipt"`
|
LatestReceipt string `json:"latest_receipt"`
|
||||||
|
LatestExpiredReceiptInfo InApp `json:"latest_expired_receipt_info"`
|
||||||
|
PendingRenewalInfo []PendingRenewalInfo `json:"pending_renewal_info"`
|
||||||
|
IsRetryable bool `json:"is-retryable"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -50,18 +50,32 @@ func HandleError(status int) error {
|
|||||||
case 21003:
|
case 21003:
|
||||||
message = "The receipt could not be authenticated."
|
message = "The receipt could not be authenticated."
|
||||||
|
|
||||||
|
case 21004:
|
||||||
|
message = "The shared secret you provided does not match the shared secret on file for your account."
|
||||||
|
|
||||||
case 21005:
|
case 21005:
|
||||||
message = "The receipt server is not currently available."
|
message = "The receipt server is not currently available."
|
||||||
|
|
||||||
|
case 21006:
|
||||||
|
// Only returned for iOS 6 style transaction receipts for auto-renewable subscriptions.
|
||||||
|
message = "This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response."
|
||||||
|
|
||||||
case 21007:
|
case 21007:
|
||||||
message = "This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead."
|
message = "This receipt is from the test environment, but it was sent to the production environment for verification. Send it to the test environment instead."
|
||||||
|
|
||||||
case 21008:
|
case 21008:
|
||||||
message = "This receipt is from the production environment, but it was sent to the test environment for verification. Send it to the production environment instead."
|
message = "This receipt is from the production environment, but it was sent to the test environment for verification. Send it to the production environment instead."
|
||||||
|
|
||||||
|
case 21010:
|
||||||
|
message = "This receipt could not be authorized. Treat this the same as if a purchase was never made."
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
if status >= 21100 && status <= 21199 {
|
||||||
|
message = "Internal data access error."
|
||||||
|
} else {
|
||||||
message = "An unknown error occurred"
|
message = "An unknown error occurred"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return errors.New(message)
|
return errors.New(message)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user