#apple #server-api #app-store

app-store-server-library

App Store 服务器 API 和 App Store 服务器通知的 Rust 服务器库

18 个版本 (5 个稳定版)

2.3.0 2024年8月9日
2.1.0 2024年5月13日
1.0.0 2024年2月2日
0.9.1 2024年1月29日
0.5.0 2023年9月4日

Web 编程 中排名第 211

Download history 131/week @ 2024-05-13 23/week @ 2024-05-20 11/week @ 2024-05-27 21/week @ 2024-06-03 8/week @ 2024-06-10 29/week @ 2024-06-24 131/week @ 2024-07-08 42/week @ 2024-07-22 49/week @ 2024-07-29 213/week @ 2024-08-05 50/week @ 2024-08-12

每月下载量 354

MIT 许可证

280KB
3.5K SLoC

苹果 App Store 服务器 Rust 库

App Store 服务器 API 和 App Store 服务器通知的 Rust 服务器库

安装

在项目的 Cargo.toml 文件中的 dependencies 部分指定 app-store-server-library

[dependencies]
app-store-server-library = { version = "2.3.0", features = ["receipt-utility", "api-client"] }

查看 crates.io 获取最新版本号。

使用方法

API 使用

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);
        }
    }
}

注意:要从应用/tx 收据中提取事务 ID,必须启用 api-client 功能。

验证使用

// .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);

注意:要从应用/tx 收据中提取事务 ID,必须启用 receipt-utility 功能。

促销优惠签名创建

// .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();

文档

参考

依赖关系

~12–25MB
~478K SLoC