Source code for appstoreserverlibrary.promotional_offer
# Copyright (c) 2023 Apple Inc. Licensed under MIT License.
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.hashes import SHA256
from cryptography.hazmat.primitives.asymmetric.ec import ECDSA, EllipticCurvePrivateKey
import uuid
import base64
[docs]
class PromotionalOfferSignatureCreator:
_signing_key: EllipticCurvePrivateKey
_key_id: str
_bundle_id: str
def __init__(self, signing_key: bytes, key_id: str, bundle_id: str):
self._signing_key = serialization.load_pem_private_key(signing_key, password=None, backend=default_backend())
self._key_id = key_id
self._bundle_id = bundle_id
[docs]
def create_signature(self, product_identifier: str, subscription_offer_id: str, application_username: str, nonce: uuid.UUID, timestamp: int):
"""
Return the Base64 encoded signature
https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/subscriptions_and_offers/generating_a_signature_for_promotional_offers
:param product_identifier: The subscription product identifier
:param subscription_offer_id: The subscription discount identifier
:param application_username: An optional string value that you define; may be an empty string
:param nonce: A one-time UUID value that your server generates. Generate a new nonce for every signature.
:param timestamp: A timestamp your server generates in UNIX time format, in milliseconds. The timestamp keeps the offer active for 24 hours.
:return: The Base64 encoded signature
"""
payload = self._bundle_id + '\u2063' + \
self._key_id + '\u2063' + \
product_identifier + '\u2063' + \
subscription_offer_id + '\u2063' + \
application_username.lower() + '\u2063'+ \
str(nonce).lower() + '\u2063' + \
str(timestamp)
return base64.b64encode(self._signing_key.sign(
payload.encode('utf-8'), ECDSA(SHA256())
)).decode('utf-8')