Pustaka server Java untuk API Server App Store dan Pemberitahuan Server App Store. Juga tersedia dalam Swift, Python, dan 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 >
JavaDocs
Video WWDC
Untuk menggunakan API Server App Store atau membuat tanda tangan penawaran promosi, diperlukan kunci penandatanganan yang diunduh dari App Store Connect. Untuk mendapatkan kunci ini, Anda harus memiliki peran Admin. Buka Pengguna dan Akses > Integrasi > Pembelian Dalam Aplikasi. Di sini Anda dapat membuat dan mengelola kunci, serta menemukan ID penerbit Anda. Saat menggunakan kunci, Anda juga memerlukan ID kunci dan ID penerbit.
Unduh dan simpan sertifikat akar yang terdapat di bagian Sertifikat Root Apple di situs Apple PKI. Berikan sertifikat ini sebagai array ke SignedDataVerifier untuk memungkinkan verifikasi data yang ditandatangani berasal dari 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 );
}
}
Hanya perpustakaan versi utama terbaru yang akan menerima pembaruan, termasuk pembaruan keamanan. Oleh karena itu, disarankan untuk memperbarui ke versi utama yang baru.