The Rust server library for the App Store Server API and App Store Server Notifications
Specify app-store-server-library
in your project's Cargo.toml
file, under the [dependencies]
section:
[dependencies]
app-store-server-library = { version = "2.3.0", features = ["receipt-utility", "api-client"] }
Check crates.io for the latest version number.
use app_store_server_library::{AppStoreServerApiClient, Environment, AppStoreApiResponse, APIError};
#[tokio::main]
async fn main() {
let issuer_id = "99b16628-15e4-4668-972b-eeff55eeff55";
let key_id = "ABCDEFGHIJ";
let bundle_id = "com.example";
let encoded_key = std::fs::read_to_string("/path/to/key/SubscriptionKey_ABCDEFGHIJ.p8").unwrap(); // Adjust the path accordingly
let environment = Environment::Sandbox;
let client = AppStoreServerApiClient::new(encoded_key, key_id, issuer_id, bundle_id, environment);
match client.request_test_notification().await {
Ok(response) => {
println!("{}", response.test_notification_token);
}
Err(err) => {
println!("{}", err.http_status_code);
println!("{:?}", err.raw_api_error);
println!("{:?}", err.api_error);
println!("{}", err.error_message);
}
}
}
Note: To extract transaction id from app/tx receipt,
api-client
feature must be enabled.
// .unwrap() used for example purposes only
let root_cert = "apple-root-cert-in-base-base64-format"; // https://www.apple.com/certificateauthority/AppleRootCA-G3.cer
let root_cert_der = root_cert.as_der_bytes().unwrap(); // Use `base64` crate to decode base64 string into bytes
let verifier = SignedDataVerifier::new(
vec![root_cert_der], // Vector of root certificates
Environment::Sandbox, // Environment
"app.superapp.apple".to_string(), // Bundle id
Some(12345678), // App id
);
let payload = "signed-payload";
let decoded_payload = verifier.verify_and_decode_notification(payload).unwrap();
let receipt = "MI..";
let transaction_id = extract_transaction_id_from_app_receipt(receipt);
Note: To extract transaction id from app/tx receipt,
receipt-utility
feature must be enabled.
// .unwrap() used for example purposes only
let private_key = include_str!("../assets/SubscriptionKey_L256SYR32L.p8");
let creator = PromotionalOfferSignatureCreator::new(private_key, "L256SYR32L".to_string(), "com.test.app".to_string()).unwrap();
let signature: String = creator.create_signature("com.test.product", "com.test.offer", uuid::Uuid::new_v4().to_string().as_str(), &uuid::Uuid::new_v4(), i64::try_from(system_timestamp()).unwrap()).unwrap();
- The full documentation is available at docs.rs
- WWDC Video