Skip to content

Commit b4f94a7

Browse files
authored
Merge pull request #329 from richzw/master
feat(appstore): Support 1.19: add the Send Consumption Information endpoint
2 parents 8c0c5b5 + 36ccc63 commit b4f94a7

File tree

2 files changed

+117
-22
lines changed

2 files changed

+117
-22
lines changed

appstore/api/model.go

Lines changed: 96 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,34 @@ type MassExtendRenewalDateRequest struct {
7070
StorefrontCountryCodes []string `json:"storefrontCountryCodes"`
7171
}
7272

73+
type DeliveryStatus string
74+
75+
// DeliveryStatus https://developer.apple.com/documentation/appstoreserverapi/deliverystatus
76+
const (
77+
DELIVERED DeliveryStatus = "DELIVERED"
78+
UNDELIVERED_QUALITY_ISSUE DeliveryStatus = "UNDELIVERED_QUALITY_ISSUE"
79+
UNDELIVERED_WRONG_ITEM DeliveryStatus = "UNDELIVERED_WRONG_ITEM"
80+
UNDELIVERED_SERVER_OUTAGE DeliveryStatus = "UNDELIVERED_SERVER_OUTAGE"
81+
UNDELIVERED_OTHER DeliveryStatus = "UNDELIVERED_OTHER"
82+
)
83+
84+
type RefundPreference string
85+
86+
// RefundPreference https://developer.apple.com/documentation/appstoreserverapi/refundpreference
87+
const (
88+
DECLINE RefundPreference = "DECLINE"
89+
GRANT_FULL RefundPreference = "GRANT_FULL"
90+
GRANT_PRORATED RefundPreference = "GRANT_PRORATED"
91+
)
92+
7393
// ConsumptionRequestBody https://developer.apple.com/documentation/appstoreserverapi/consumptionrequest
94+
type ConsumptionRequest struct {
95+
CustomerConsented bool `json:"customerConsented"`
96+
ConsumptionPercentage int32 `json:"consumptionPercentage"`
97+
DeliveryStatus DeliveryStatus `json:"deliveryStatus"`
98+
RefundPreference RefundPreference `json:"refundPreference"`
99+
SampleContentProvided bool `json:"sampleContentProvided"`
100+
}
74101
type ConsumptionRequestBody struct {
75102
AccountTenure int32 `json:"accountTenure"`
76103
AppAccountToken string `json:"appAccountToken"`
@@ -86,32 +113,70 @@ type ConsumptionRequestBody struct {
86113
RefundPreference int32 `json:"refundPreference"`
87114
}
88115

116+
type AdvancedCommerceDescriptors struct {
117+
Description string `json:"description"`
118+
DisplayName string `json:"displayName"`
119+
}
120+
121+
type AdvancedCommercePriceIncreaseInfo struct {
122+
DependentSKUs []string `json:"dependentSKUs"`
123+
Price int64 `json:"price"`
124+
Status string `json:"status"`
125+
}
126+
127+
type AdvancedCommerceOffer struct {
128+
Period string `json:"period"`
129+
PeriodCount int32 `json:"periodCount"`
130+
Price int64 `json:"price"`
131+
Reason string `json:"reason"`
132+
}
133+
134+
type AdvancedCommerceRenewalItems struct {
135+
SKU string `json:"SKU"`
136+
Description string `json:"description"`
137+
DisplayName string `json:"displayName"`
138+
Offer AdvancedCommerceOffer `json:"offer"`
139+
Price int64 `json:"price"`
140+
PriceIncreaseInfo AdvancedCommercePriceIncreaseInfo `json:"priceIncreaseInfo"`
141+
}
142+
143+
// AdvancedCommerceRenewalInfo https://developer.apple.com/documentation/appstoreserverapi/advancedcommercerenewalinfo
144+
type AdvancedCommerceRenewalInfo struct {
145+
ConsistencyToken string `json:"consistencyToken"`
146+
Descriptors AdvancedCommerceDescriptors `json:"descriptors"`
147+
Items []AdvancedCommerceRenewalItems `json:"items"`
148+
Period string `json:"period"`
149+
RequestReferenceId string `json:"requestReferenceId"`
150+
TaxCode string `json:"taxCode"`
151+
}
152+
89153
// Verify that JWSRenewalInfoDecodedPayload implements jwt.Claims
90154
var _ jwt.Claims = JWSRenewalInfoDecodedPayload{}
91155

92156
// JWSRenewalInfoDecodedPayload https://developer.apple.com/documentation/appstoreserverapi/jwsrenewalinfodecodedpayload
93157
type JWSRenewalInfoDecodedPayload struct {
94-
AppAccountToken string `json:"appAccountToken,omitempty"`
95-
AppTransactionId string `json:"appTransactionId,omitempty"`
96-
AutoRenewProductId string `json:"autoRenewProductId"`
97-
AutoRenewStatus AutoRenewStatus `json:"autoRenewStatus"`
98-
Environment Environment `json:"environment"`
99-
ExpirationIntent int32 `json:"expirationIntent"`
100-
GracePeriodExpiresDate int64 `json:"gracePeriodExpiresDate"`
101-
IsInBillingRetryPeriod *bool `json:"isInBillingRetryPeriod"`
102-
OfferIdentifier string `json:"offerIdentifier"`
103-
OfferType int32 `json:"offerType"`
104-
OfferPeriod string `json:"offerPeriod"`
105-
OriginalTransactionId string `json:"originalTransactionId"`
106-
PriceIncreaseStatus *int32 `json:"priceIncreaseStatus"`
107-
ProductId string `json:"productId"`
108-
RecentSubscriptionStartDate int64 `json:"recentSubscriptionStartDate"`
109-
RenewalDate int64 `json:"renewalDate"`
110-
SignedDate int64 `json:"signedDate"`
111-
RenewalPrice int64 `json:"renewalPrice,omitempty"`
112-
Currency string `json:"currency,omitempty"`
113-
OfferDiscountType OfferDiscountType `json:"offerDiscountType,omitempty"`
114-
EligibleWinBackOfferIds []string `json:"eligibleWinBackOfferIds,omitempty"`
158+
AppAccountToken string `json:"appAccountToken,omitempty"`
159+
AppTransactionId string `json:"appTransactionId,omitempty"`
160+
AutoRenewProductId string `json:"autoRenewProductId"`
161+
AutoRenewStatus AutoRenewStatus `json:"autoRenewStatus"`
162+
Environment Environment `json:"environment"`
163+
ExpirationIntent int32 `json:"expirationIntent"`
164+
GracePeriodExpiresDate int64 `json:"gracePeriodExpiresDate"`
165+
IsInBillingRetryPeriod *bool `json:"isInBillingRetryPeriod"`
166+
OfferIdentifier string `json:"offerIdentifier"`
167+
OfferType int32 `json:"offerType"`
168+
OfferPeriod string `json:"offerPeriod"`
169+
OriginalTransactionId string `json:"originalTransactionId"`
170+
PriceIncreaseStatus *int32 `json:"priceIncreaseStatus"`
171+
ProductId string `json:"productId"`
172+
RecentSubscriptionStartDate int64 `json:"recentSubscriptionStartDate"`
173+
RenewalDate int64 `json:"renewalDate"`
174+
SignedDate int64 `json:"signedDate"`
175+
RenewalPrice int64 `json:"renewalPrice,omitempty"`
176+
Currency string `json:"currency,omitempty"`
177+
OfferDiscountType OfferDiscountType `json:"offerDiscountType,omitempty"`
178+
EligibleWinBackOfferIds []string `json:"eligibleWinBackOfferIds,omitempty"`
179+
AdvancedCommerceInfo AdvancedCommerceRenewalInfo `json:"advancedCommerceInfo,omitempty"`
115180
}
116181

117182
// GetAudience implements jwt.Claims.
@@ -179,6 +244,14 @@ const (
179244
OfferDiscountTypeOneTime OfferDiscountType = "ONE_TIME"
180245
)
181246

247+
type RevocationType string
248+
249+
const (
250+
REFUND_FULL RevocationType = "REFUND_FULL"
251+
REFUND_PRORATED RevocationType = "REFUND_PRORATED"
252+
FAMILY_REVOKE RevocationType = "FAMILY_REVOKE"
253+
)
254+
182255
// Verify that JWSTransaction implements jwt.Claims
183256
var _ jwt.Claims = JWSTransaction{}
184257

@@ -204,6 +277,8 @@ type JWSTransaction struct {
204277
OfferIdentifier string `json:"offerIdentifier,omitempty"`
205278
RevocationDate int64 `json:"revocationDate,omitempty"`
206279
RevocationReason *int32 `json:"revocationReason,omitempty"`
280+
RevocationType RevocationType `json:"revocationType,omitempty"`
281+
RevocationPercentage int32 `json:"revocationPercentage,omitempty"`
207282
IsUpgraded bool `json:"isUpgraded,omitempty"`
208283
Storefront string `json:"storefront,omitempty"`
209284
StorefrontId string `json:"storefrontId,omitempty"`

appstore/api/store.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const (
2929
PathTransactionInfo = "/inApps/v1/transactions/{transactionId}"
3030
PathRefundHistory = "/inApps/v2/refund/lookup/{originalTransactionId}"
3131
PathGetALLSubscriptionStatus = "/inApps/v1/subscriptions/{originalTransactionId}"
32+
PathConsumptionInfoV2 = "/inApps/v2/transactions/consumption/{transactionId}"
3233
PathConsumptionInfo = "/inApps/v1/transactions/consumption/{originalTransactionId}"
3334
PathExtendSubscriptionRenewalDate = "/inApps/v1/subscriptions/extend/{originalTransactionId}"
3435
PathExtendSubscriptionRenewalDateForAll = "/inApps/v1/subscriptions/extend/mass/"
@@ -98,6 +99,7 @@ type (
9899

99100
ConsumptionSender interface {
100101
SendConsumptionInfo(ctx context.Context, originalTransactionId string, body ConsumptionRequestBody) (statusCode int, err error)
102+
SendConsumptionInfoV2(ctx context.Context, transactionId string, body ConsumptionRequest) (statusCode int, err error)
101103
}
102104

103105
AppAccountSetter interface {
@@ -321,7 +323,7 @@ func (a *StoreClient) GetRefundHistory(ctx context.Context, originalTransactionI
321323
return
322324
}
323325

324-
// SendConsumptionInfo https://developer.apple.com/documentation/appstoreserverapi/send_consumption_information
326+
// https://developer.apple.com/documentation/appstoreserverapi/send-consumption-information-v1
325327
func (a *StoreClient) SendConsumptionInfo(ctx context.Context, originalTransactionId string, body ConsumptionRequestBody) (statusCode int, err error) {
326328
URL := a.host + PathConsumptionInfo
327329
URL = strings.Replace(URL, "{originalTransactionId}", originalTransactionId, -1)
@@ -339,6 +341,24 @@ func (a *StoreClient) SendConsumptionInfo(ctx context.Context, originalTransacti
339341
return statusCode, nil
340342
}
341343

344+
// SendConsumptionInfoV2 https://developer.apple.com/documentation/appstoreserverapi/send-consumption-information
345+
func (a *StoreClient) SendConsumptionInfoV2(ctx context.Context, transactionId string, body ConsumptionRequest) (statusCode int, err error) {
346+
URL := a.host + PathConsumptionInfoV2
347+
URL = strings.Replace(URL, "{transactionId}", transactionId, -1)
348+
349+
bodyBuf := new(bytes.Buffer)
350+
err = json.NewEncoder(bodyBuf).Encode(body)
351+
if err != nil {
352+
return 0, err
353+
}
354+
355+
statusCode, _, err = a.Do(ctx, http.MethodPut, URL, bodyBuf)
356+
if err != nil {
357+
return statusCode, err
358+
}
359+
return statusCode, nil
360+
}
361+
342362
// ExtendSubscriptionRenewalDate https://developer.apple.com/documentation/appstoreserverapi/extend_a_subscription_renewal_date
343363
func (a *StoreClient) ExtendSubscriptionRenewalDate(ctx context.Context, originalTransactionId string, body ExtendRenewalDateRequest) (statusCode int, err error) {
344364
URL := a.host + PathExtendSubscriptionRenewalDate

0 commit comments

Comments
 (0)