Серверная библиотека Java для API сервера App Store и уведомлений сервера App Store. Также доступно в Swift, Python и Node.js.
implementation ' com.apple.itunes.storekit:app-store-server-library:3.2.0 '
< dependency >
< groupId >com.apple.itunes.storekit groupId >
< artifactId >app-store-server-library artifactId >
< version >3.2.0 version >
dependency >
JavaДокументация
Видео WWDC
Чтобы использовать API сервера App Store или создавать подписи рекламных предложений, требуется ключ подписи, загруженный из App Store Connect. Чтобы получить этот ключ, вам необходима роль администратора. Откройте «Пользователи и доступ» > «Интеграции» > «Покупки в приложении». Здесь вы можете создавать ключи и управлять ими, а также найти идентификатор своего эмитента. При использовании ключа вам также понадобятся идентификатор ключа и идентификатор эмитента.
Загрузите и сохраните корневые сертификаты, которые можно найти в разделе «Корневые сертификаты Apple» на сайте Apple PKI. Предоставьте эти сертификаты в виде массива SignedDataVerifier, чтобы можно было проверить, что подписанные данные поступают от Apple.
import com . apple . itunes . storekit . client . APIException ;
import com . apple . itunes . storekit . client . AppStoreServerAPIClient ;
import com . apple . itunes . storekit . model . Environment ;
import com . apple . itunes . storekit . model . SendTestNotificationResponse ;
import java . io . IOException ;
import java . nio . file . Files ;
import java . nio . file . Path ;
public class APIExample {
public static void main ( String [] args ) throws Exception {
String issuerId = "99b16628-15e4-4668-972b-eeff55eeff55" ;
String keyId = "ABCDEFGHIJ" ;
String bundleId = "com.example" ;
Path filePath = Path . of ( "/path/to/key/SubscriptionKey_ABCDEFGHIJ.p8" );
String encodedKey = Files . readString ( filePath );
Environment environment = Environment . SANDBOX ;
AppStoreServerAPIClient client =
new AppStoreServerAPIClient ( encodedKey , keyId , issuerId , bundleId , environment );
try {
SendTestNotificationResponse response = client . requestTestNotification ();
System . out . println ( response );
} catch ( APIException | IOException e ) {
e . printStackTrace ();
}
}
}
import com . apple . itunes . storekit . model . Environment ;
import com . apple . itunes . storekit . model . ResponseBodyV2DecodedPayload ;
import com . apple . itunes . storekit . verification . SignedDataVerifier ;
import com . apple . itunes . storekit . verification . VerificationException ;
import java . io . FileInputStream ;
import java . io . InputStream ;
import java . util . Set ;
public class ExampleVerification {
public static void main ( String [] args ) {
String bundleId = "com.example" ;
Environment environment = Environment . SANDBOX ;
Set < InputStream > rootCAs = Set . of (
new FileInputStream ( "/path/to/rootCA1" ),
new FileInputStream ( "/path/to/rootCA2" )
);
Long appAppleId = null ; // appAppleId must be provided for the Production environment
SignedDataVerifier signedPayloadVerifier = new SignedDataVerifier ( rootCAs , bundleId , appAppleId , environment , true );
String notificationPayload = "ey..." ;
try {
ResponseBodyV2DecodedPayload payload = signedPayloadVerifier . verifyAndDecodeNotification ( notificationPayload );
System . out . println ( payload );
} catch ( VerificationException e ) {
e . printStackTrace ();
}
}
}
import com . apple . itunes . storekit . client . AppStoreServerAPIClient ;
import com . apple . itunes . storekit . client . GetTransactionHistoryVersion ;
import com . apple . itunes . storekit . migration . ReceiptUtility ;
import com . apple . itunes . storekit . model . Environment ;
import com . apple . itunes . storekit . model . HistoryResponse ;
import com . apple . itunes . storekit . model . TransactionHistoryRequest ;
import java . nio . file . Files ;
import java . nio . file . Path ;
import java . util . LinkedList ;
import java . util . List ;
public class ExampleMigration {
public static void main ( String [] args ) throws Exception {
String issuerId = "99b16628-15e4-4668-972b-eeff55eeff55" ;
String keyId = "ABCDEFGHIJ" ;
String bundleId = "com.example" ;
Path filePath = Path . of ( "/path/to/key/SubscriptionKey_ABCDEFGHIJ.p8" );
String encodedKey = Files . readString ( filePath );
Environment environment = Environment . SANDBOX ;
AppStoreServerAPIClient client =
new AppStoreServerAPIClient ( encodedKey , keyId , issuerId , bundleId , environment );
String appReceipt = "MI..." ;
ReceiptUtility receiptUtil = new ReceiptUtility ();
String transactionId = receiptUtil . extractTransactionIdFromAppReceipt ( appReceipt );
if ( transactionId != null ) {
TransactionHistoryRequest request = new TransactionHistoryRequest ()
. sort ( TransactionHistoryRequest . Order . ASCENDING )
. revoked ( false )
. productTypes ( List . of ( TransactionHistoryRequest . ProductType . AUTO_RENEWABLE ));
HistoryResponse response = null ;
List < String > transactions = new LinkedList <>();
do {
String revision = response != null ? response . getRevision () : null ;
response = client . getTransactionHistory ( transactionId , revision , request , GetTransactionHistoryVersion . V2 );
transactions . addAll ( response . getSignedTransactions ());
} while ( response . getHasMore ());
System . out . println ( transactions );
}
}
}
import com . apple . itunes . storekit . offers . PromotionalOfferSignatureCreator ;
import java . nio . file . Files ;
import java . nio . file . Path ;
import java . util . UUID ;
public class ExampleSignatureCreation {
public static void main ( String [] args ) throws Exception {
String keyId = "ABCDEFGHIJ" ;
String bundleId = "com.example" ;
Path filePath = Path . of ( "/path/to/key/SubscriptionKey_ABCDEFGHIJ.p8" );
String encodedKey = Files . readString ( filePath );
PromotionalOfferSignatureCreator signatureCreator = new PromotionalOfferSignatureCreator ( encodedKey , keyId , bundleId );
String productId = "" ;
String subscriptionOfferId = "" ;
String appAccountToken = "" ;
UUID nonce = UUID . randomUUID ();
long timestamp = System . currentTimeMillis ();
String encodedSignature = signatureCreator . createSignature ( productId , subscriptionOfferId , appAccountToken , nonce , timestamp );
System . out . println ( encodedSignature );
}
}
Обновления, включая обновления безопасности, будут получать только последняя основная версия библиотеки. Поэтому рекомендуется обновиться до новых основных версий.