Skip to content

Commit ce5c318

Browse files
authored
feat(assa): Add support for Advanced Commerce
1 parent ca8ad5a commit ce5c318

10 files changed

+157
-3
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ edition = "2021"
1414
[dependencies]
1515

1616
# Cryptography
17-
x509-parser = { version = "0.17.0", features = ["verify", "validate"] }
17+
x509-parser = { version = "0.18.0", features = ["verify", "validate"] }
1818
jsonwebtoken = { version = "9.3.1" }
1919
ring = "0.17.14"
2020
pem-rfc7468 = "1.0.0-rc.3"
@@ -27,7 +27,7 @@ serde = { version = "1.0.219", features = ["derive"] }
2727
serde_json = { version = "1.0.143" }
2828
serde_with = { version = "3.14.0", features = ["chrono"] }
2929
serde_repr = "0.1.20"
30-
uuid = { version = "1.18.0", features = ["serde", "v4"] }
30+
uuid = { version = "1.18.1", features = ["serde", "v4"] }
3131
chrono = { version = "0.4.41", features = ["serde"] }
3232
base64 = "0.22.1"
3333

src/primitives/advanced_commerce/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ pub mod subscription_migrate_response;
4747
pub mod in_app_request_operation;
4848
pub mod in_app_request_version;
4949
pub mod in_app_request;
50-
mod base_response;
50+
pub mod base_response;
51+
pub mod refund;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use chrono::{DateTime, Utc};
2+
use serde::{Deserialize, Serialize};
3+
use crate::primitives::advanced_commerce::refund_reason::RefundReason;
4+
use crate::primitives::advanced_commerce::refund_type::RefundType;
5+
6+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
7+
#[serde_with::serde_as]
8+
#[serde(rename_all = "camelCase")]
9+
pub struct Refund {
10+
pub refund_amount: i64,
11+
12+
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
13+
pub refund_date: DateTime<Utc>,
14+
15+
pub refund_reason: RefundReason,
16+
17+
pub refund_type: RefundType,
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use serde::{Deserialize, Serialize};
2+
use crate::primitives::advanced_commerce::descriptors::Descriptors;
3+
use crate::primitives::advanced_commerce::period::Period;
4+
use crate::primitives::advanced_commerce_renewal_item::AdvancedCommerceRenewalItem;
5+
6+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
7+
#[serde(rename_all = "camelCase")]
8+
pub struct AdvancedCommerceRenewalInfo {
9+
/// advancedCommerceConsistencyToken
10+
pub consistency_token: String,
11+
12+
/// advancedCommerceDescriptors
13+
pub descriptors: Descriptors,
14+
15+
/// advancedCommerceRenewalItems
16+
pub items: Vec<AdvancedCommerceRenewalItem>,
17+
18+
/// advancedCommercePeriod
19+
pub period: Period,
20+
21+
/// advancedCommerceRequestReferenceId
22+
pub request_reference_id: String,
23+
24+
/// advancedCommerceTaxCode
25+
pub tax_code: String,
26+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use serde::{Deserialize, Serialize};
2+
use crate::primitives::advanced_commerce::offer::Offer;
3+
4+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
5+
#[serde(rename_all = "camelCase")]
6+
pub struct AdvancedCommerceRenewalItem {
7+
#[serde(rename = "SKU")]
8+
pub sku: String,
9+
10+
pub description: String,
11+
12+
pub display_name: String,
13+
14+
pub offer: Offer,
15+
16+
pub price: i64,
17+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use serde::{Deserialize, Serialize};
2+
use crate::primitives::advanced_commerce::descriptors::Descriptors;
3+
use crate::primitives::advanced_commerce::period::Period;
4+
use crate::primitives::advanced_commerce_transaction_item::AdvancedCommerceTransactionItem;
5+
6+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
7+
#[serde(rename_all = "camelCase")]
8+
/// [AdvancedCommerceTransactionInfo](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetransactioninfo)
9+
pub struct AdvancedCommerceTransactionInfo {
10+
11+
/// [descriptors](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercedescriptors)
12+
pub descriptors: Descriptors,
13+
14+
/// [estimatedTax](https://developer.apple.com/documentation/appstoreserverapi/advancedcommerceestimatedtax)
15+
pub estimated_tax: i64,
16+
17+
/// [items](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetransactionitems)
18+
pub items: Vec<AdvancedCommerceTransactionItem>,
19+
20+
/// [period](https://developer.apple.com/documentation/appstoreserverapi/advancedcommerceperiod)
21+
pub period: Period,
22+
23+
/// [requestReferenceId](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercerequestreferenceid)
24+
pub request_reference_id: String,
25+
26+
/// [taxCode](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetaxcode)
27+
pub tax_code: String,
28+
29+
/// [taxExclusivePrice](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetaxexclusiveprice)
30+
pub tax_exclusive_price: i64,
31+
32+
/// [taxRate](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetaxrate)
33+
pub tax_rate: String,
34+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use chrono::{DateTime, Utc};
2+
use serde::{Deserialize, Serialize};
3+
use crate::primitives::advanced_commerce::offer::Offer;
4+
use crate::primitives::advanced_commerce::refund::Refund;
5+
6+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
7+
#[serde_with::serde_as]
8+
#[serde(rename_all = "camelCase")]
9+
/// [AdvancedCommerceTransactionItem](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetransactionitem)
10+
pub struct AdvancedCommerceTransactionItem {
11+
/// The SKU of the item.
12+
///
13+
/// [SKU](https://developer.apple.com/documentation/advancedcommerceapi/sku)
14+
#[serde(rename = "SKU")]
15+
pub sku: String,
16+
17+
/// The new description for the item.
18+
///
19+
/// [Description](https://developer.apple.com/documentation/advancedcommerceapi/description)
20+
pub description: String,
21+
22+
/// The display name for the item.
23+
///
24+
/// [Display Name](https://developer.apple.com/documentation/advancedcommerceapi/displayname)
25+
pub display_name: String,
26+
27+
/// An offer for the item.
28+
///
29+
/// [Offer](https://developer.apple.com/documentation/advancedcommerceapi/offer)
30+
pub offer: Offer,
31+
32+
/// The price in milliunits.
33+
///
34+
/// [Price](https://developer.apple.com/documentation/advancedcommerceapi/price)
35+
pub price: i64,
36+
37+
pub refunds: Vec<Refund>,
38+
39+
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
40+
pub revocation_date: DateTime<Utc>,
41+
}

src/primitives/jws_renewal_info_decoded_payload.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use serde::{Deserialize, Serialize};
99
use serde_with::formats::Flexible;
1010
use serde_with::TimestampMilliSeconds;
1111
use uuid::Uuid;
12+
use crate::primitives::advanced_commerce_renewal_info::AdvancedCommerceRenewalInfo;
1213

1314
/// A decoded payload containing subscription renewal information for an auto-renewable subscription.
1415
///
@@ -144,4 +145,9 @@ pub struct JWSRenewalInfoDecodedPayload {
144145
/// [offerPeriod](https://developer.apple.com/documentation/appstoreserverapi/offerPeriod)
145146
#[serde(rename = "offerPeriod")]
146147
pub offer_period: Option<String>,
148+
149+
/// Renewal information that is present only for Advanced Commerce SKUs.
150+
///
151+
/// [advancedCommerceRenewalInfo](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercerenewalinfo)
152+
pub advanced_commerce_info: Option<AdvancedCommerceRenewalInfo>,
147153
}

src/primitives/jws_transaction_decoded_payload.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use chrono::{DateTime, Utc};
99
use serde_with::formats::Flexible;
1010
use serde_with::TimestampMilliSeconds;
1111
use uuid::Uuid;
12+
use crate::primitives::advanced_commerce_transaction_info::AdvancedCommerceTransactionInfo;
1213

1314
/// A decoded payload containing transaction information.
1415
///
@@ -184,4 +185,10 @@ pub struct JWSTransactionDecodedPayload {
184185
/// [offerPeriod](https://developer.apple.com/documentation/appstoreserverapi/offerPeriod)
185186
#[serde(rename = "offerPeriod")]
186187
pub offer_period: Option<String>,
188+
189+
/// Transaction information that is present only for Advanced Commerce SKUs.
190+
///
191+
/// [advancedCommerceTransactionInfo](https://developer.apple.com/documentation/appstoreserverapi/advancedcommercetransactioninfo)
192+
#[serde(rename = "advancedCommerceInfo")]
193+
pub advanced_commerce_info: Option<AdvancedCommerceTransactionInfo>,
187194
}

src/primitives/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,7 @@ pub mod transaction_reason;
5757
pub mod update_app_account_token_request;
5858
pub mod user_status;
5959
pub mod advanced_commerce;
60+
pub mod advanced_commerce_transaction_item;
61+
pub mod advanced_commerce_transaction_info;
62+
pub mod advanced_commerce_renewal_info;
63+
pub mod advanced_commerce_renewal_item;

0 commit comments

Comments
 (0)