Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Apple App Store Server Java Library
The Java server library for the [App Store Server API](https://developer.apple.com/documentation/appstoreserverapi), [App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications), and [Retention Messaging API](https://developer.apple.com/documentation/retentionmessaging). Also available in [Swift](https://github.com/apple/app-store-server-library-swift), [Python](https://github.com/apple/app-store-server-library-python), and [Node.js](https://github.com/apple/app-store-server-library-node).
The Java server library for the [App Store Server API](https://developer.apple.com/documentation/appstoreserverapi), [App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications), [Retention Messaging API](https://developer.apple.com/documentation/retentionmessaging), and [Advanced Commerce API](https://developer.apple.com/documentation/AdvancedCommerceAPI). Also available in [Swift](https://github.com/apple/app-store-server-library-swift), [Python](https://github.com/apple/app-store-server-library-python), and [Node.js](https://github.com/apple/app-store-server-library-node).

## Table of Contents
1. [Installation](#installation)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright (c) 2026 Apple Inc. Licensed under MIT License.
package com.apple.itunes.storekit.model;

import com.fasterxml.jackson.annotation.JsonProperty;

public abstract class AbstractAdvancedCommerceBaseItem {
private static final String SERIALIZED_NAME_SKU = "SKU";

@JsonProperty(value = SERIALIZED_NAME_SKU, required = true)
protected String sku;

protected AbstractAdvancedCommerceBaseItem() {}

protected AbstractAdvancedCommerceBaseItem(String sku) {
this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
}

protected abstract AbstractAdvancedCommerceBaseItem self();

public AbstractAdvancedCommerceBaseItem sku(String sku) {
this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
return self();
}

/**
* The product identifier of an in-app purchase product you manage in your own system.
*
* @return SKU
* @see <a href="https://developer.apple.com/documentation/advancedcommerceapi/sku">SKU</a>
**/
public String getSku() {
return sku;
}

public void setSku(String sku) {
this.sku = AdvancedCommerceValidationUtils.validateSku(sku);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// Copyright (c) 2026 Apple Inc. Licensed under MIT License.

package com.apple.itunes.storekit.model;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Objects;

public abstract class AbstractAdvancedCommerceInAppRequest<T extends AbstractAdvancedCommerceInAppRequest<T>> extends AdvancedCommerceRequest<T> implements AdvancedCommerceInAppRequest {

private static final String SERIALIZED_NAME_OPERATION = "operation";
private static final String SERIALIZED_NAME_VERSION = "version";

@JsonProperty(value = SERIALIZED_NAME_OPERATION, required = true)
private final String operation;
@JsonProperty(value = SERIALIZED_NAME_VERSION, required = true)
private final String version;

protected AbstractAdvancedCommerceInAppRequest() {
this.operation = null;
this.version = null;
}

protected AbstractAdvancedCommerceInAppRequest(String operation, String version, AdvancedCommerceRequestInfo requestInfo) {
super(requestInfo);
this.operation = Objects.requireNonNull(operation);
this.version = Objects.requireNonNull(version);
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (!super.equals(o)) return false;
AbstractAdvancedCommerceInAppRequest<?> that = (AbstractAdvancedCommerceInAppRequest<?>) o;
return Objects.equals(operation, that.operation) && Objects.equals(version, that.version);
}

@Override
public int hashCode() {
return Objects.hash(super.hashCode(), operation, version);
}

protected abstract T self();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// Copyright (c) 2026 Apple Inc. Licensed under MIT License.

package com.apple.itunes.storekit.model;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;
import java.util.Objects;

public abstract class AbstractAdvancedCommerceItem extends AbstractAdvancedCommerceBaseItem {
private static final String SERIALIZED_NAME_DESCRIPTION = "description";
private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";

@JsonProperty(value = SERIALIZED_NAME_DESCRIPTION, required = true)
protected String description;
@JsonProperty(value = SERIALIZED_NAME_DISPLAY_NAME, required = true)
protected String displayName;

protected AbstractAdvancedCommerceItem() {}

protected AbstractAdvancedCommerceItem(String sku, String description, String displayName) {
super(sku);
this.description = AdvancedCommerceValidationUtils.validateDescription(description);
this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
}

protected abstract AbstractAdvancedCommerceItem self();

public AbstractAdvancedCommerceItem description(String description) {
this.description = AdvancedCommerceValidationUtils.validateDescription(description);
return self();
}

/**
* A string you provide that describes a SKU.
*
* @return description
* @see <a href="https://developer.apple.com/documentation/advancedcommerceapi/description">description</a>
**/
public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = AdvancedCommerceValidationUtils.validateDescription(description);
}

public AbstractAdvancedCommerceItem displayName(String displayName) {
this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
return self();
}

/**
* A string with a product name that you can localize and is suitable for display to customers.
*
* @return displayName
* @see <a href="https://developer.apple.com/documentation/advancedcommerceapi/displayname">displayName</a>
**/
public String getDisplayName() {
return displayName;
}

public void setDisplayName(String displayName) {
this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
AbstractAdvancedCommerceItem that = (AbstractAdvancedCommerceItem) o;
return Objects.equals(this.sku, that.sku) &&
Objects.equals(this.description, that.description) &&
Objects.equals(this.displayName, that.displayName);
}

@Override
public int hashCode() {
return Objects.hash(sku, description, displayName);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright (c) 2026 Apple Inc. Licensed under MIT License.

package com.apple.itunes.storekit.model;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;
import java.util.Objects;

public abstract class AbstractAdvancedCommerceResponse {

private static final String SERIALIZED_NAME_SIGNED_RENEWAL_INFO = "signedRenewalInfo";
private static final String SERIALIZED_NAME_SIGNED_TRANSACTION_INFO = "signedTransactionInfo";

@JsonProperty(SERIALIZED_NAME_SIGNED_RENEWAL_INFO)
private String signedRenewalInfo;
@JsonProperty(SERIALIZED_NAME_SIGNED_TRANSACTION_INFO)
private String signedTransactionInfo;
@JsonAnySetter
private Map<String, Object> unknownFields;

protected AbstractAdvancedCommerceResponse() {}

protected abstract AbstractAdvancedCommerceResponse self();

protected AbstractAdvancedCommerceResponse(String signedRenewalInfo, String signedTransactionInfo) {
this.signedRenewalInfo = signedRenewalInfo;
this.signedTransactionInfo = signedTransactionInfo;
}

public AbstractAdvancedCommerceResponse signedRenewalInfo(String signedRenewalInfo) {
this.signedRenewalInfo = signedRenewalInfo;
return self();
}

/**
* Subscription renewal information, signed by the App Store, in JSON Web Signature (JWS) format.
*
* @return signedRenewalInfo
* @see <a href="https://developer.apple.com/documentation/appstoreserverapi/jwsrenewalinfo">JWSRenewalInfo</a>
**/
public String getSignedRenewalInfo() {
return signedRenewalInfo;
}

public void setSignedRenewalInfo(String signedRenewalInfo) {
this.signedRenewalInfo = signedRenewalInfo;
}

public AbstractAdvancedCommerceResponse signedTransactionInfo(String signedTransactionInfo) {
this.signedTransactionInfo = signedTransactionInfo;
return self();
}

/**
* Transaction information signed by the App Store, in JSON Web Signature (JWS) Compact Serialization format.
*
* @return signedTransactionInfo
* @see <a href="https://developer.apple.com/documentation/appstoreserverapi/jwstransaction">JWSTransaction</a>
**/
public String getSignedTransactionInfo() {
return signedTransactionInfo;
}

public void setSignedTransactionInfo(String signedTransactionInfo) {
this.signedTransactionInfo = signedTransactionInfo;
}

public AbstractAdvancedCommerceResponse unknownFields(Map<String, Object> unknownFields) {
this.unknownFields = unknownFields;
return self();
}

public Map<String, Object> getUnknownFields() {
return unknownFields;
}

public void setUnknownFields(Map<String, Object> unknownFields) {
this.unknownFields = unknownFields;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractAdvancedCommerceResponse that = (AbstractAdvancedCommerceResponse) o;
return Objects.equals(signedRenewalInfo, that.signedRenewalInfo) && Objects.equals(signedTransactionInfo, that.signedTransactionInfo) && Objects.equals(unknownFields, that.unknownFields);
}

@Override
public int hashCode() {
return Objects.hash(signedRenewalInfo, signedTransactionInfo, unknownFields);
}

@Override
public String toString() {
return getClass().getSimpleName() + "{" +
"signedRenewalInfo='" + signedRenewalInfo + '\'' +
", signedTransactionInfo='" + signedTransactionInfo + '\'' +
", unknownFields=" + unknownFields +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Copyright (c) 2026 Apple Inc. Licensed under MIT License.

package com.apple.itunes.storekit.model;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.Map;
import java.util.Objects;

/**
* The display name and description of a subscription product.
*
* @see <a href="https://developer.apple.com/documentation/advancedcommerceapi/descriptors">Descriptors</a>
*/
public class AdvancedCommerceDescriptors {
private static final String SERIALIZED_NAME_DESCRIPTION = "description";
private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName";

@JsonProperty(value = SERIALIZED_NAME_DESCRIPTION, required = true)
protected String description;
@JsonProperty(value = SERIALIZED_NAME_DISPLAY_NAME, required = true)
protected String displayName;
@JsonAnySetter
private Map<String, Object> unknownFields;

protected AdvancedCommerceDescriptors() {}

protected AdvancedCommerceDescriptors(String description, String displayName) {
this.description = AdvancedCommerceValidationUtils.validateDescription(description);
this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
}

public AdvancedCommerceDescriptors description(String description) {
this.description = AdvancedCommerceValidationUtils.validateDescription(description);
return this;
}

/**
* A string you provide that describes a SKU.
*
* @return description
* @see <a href="https://developer.apple.com/documentation/advancedcommerceapi/description">description</a>
**/
public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = AdvancedCommerceValidationUtils.validateDescription(description);
}

public AdvancedCommerceDescriptors displayName(String displayName) {
this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
return this;
}

/**
* A string with a product name that you can localize and is suitable for display to customers.
*
* @return displayName
* @see <a href="https://developer.apple.com/documentation/advancedcommerceapi/displayname">displayName</a>
**/
public String getDisplayName() {
return displayName;
}

public void setDisplayName(String displayName) {
this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName);
}

public AdvancedCommerceDescriptors unknownFields(Map<String, Object> unknownFields) {
this.unknownFields = unknownFields;
return this;
}

public Map<String, Object> getUnknownFields() {
return unknownFields;
}

public void setUnknownFields(Map<String, Object> unknownFields) {
this.unknownFields = unknownFields;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AdvancedCommerceDescriptors that = (AdvancedCommerceDescriptors) o;
return Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName) && Objects.equals(unknownFields, that.unknownFields);
}

@Override
public int hashCode() {
return Objects.hash(description, displayName, unknownFields);
}

@Override
public String toString() {
return "AdvancedCommerceDescriptors{" +
"description='" + description + '\'' +
", displayName='" + displayName + '\'' +
", unknownFields=" + unknownFields +
'}';
}
}
Loading
Loading