Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

246
Visualizações
Generación de una firma para ofertas de suscripción - Xcode - Swift

Quería preguntar si alguien ya implementó las nuevas Ofertas para la suscripción dentro de la aplicación (renovación automática), la dificultad de crear el sistema del lado del servidor para crear esta firma usando la clave p8 con php si es posible. Encontré esto en la documentación de Apple, no estoy seguro de entenderlo: https://developer.apple.com/documentation/storekit/in-app_purchase/generating_a_signature_for_subscription_offers

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Aquí hay un tutorial de RevenueCat: Ofertas de suscripción de iOS

La publicación contiene muchos más detalles, pero la generación de la firma es:

 import json import uuid import time import hashlib import base64 from ecdsa import SigningKey from ecdsa.util import sigencode_der bundle_id = 'com.myapp' key_id = 'XWSXTGQVX2' product = 'com.myapp.product.a' offer = 'REFERENCE_CODE' # This is the code set in ASC application_username = 'user_name' # Should be the same you use when # making purchases nonce = uuid.uuid4() timestamp = int(round(time.time() * 1000)) payload = '\u2063'.join([bundle_id, key_id, product, offer, application_username, str(nonce), # Should be lower case str(timestamp)]) # Read the key file with open('cert.der', 'rb') as myfile: der = myfile.read() signing_key = SigningKey.from_der(der) signature = signing_key.sign(payload.encode('utf-8'), hashfunc=hashlib.sha256, sigencode=sigencode_der) encoded_signature = base64.b64encode(signature) print(str(encoded_signature, 'utf-8'), str(nonce), str(timestamp), key_id)

Esto es solo una prueba de concepto. Querrá esto en su servidor y tal vez tenga alguna lógica para determinar, para un usuario determinado, si la oferta solicitada es apropiada.

Una vez que haya generado la firma, el nonce y la marca de tiempo, envíelos junto con key_id a su aplicación, donde puede crear un SKPaymentDiscount .

Descargo de responsabilidad: trabajo en RevenueCat. Admitimos ofertas de suscripción listas para usar con nuestro SDK, no se requiere firma de código: https://www.revenuecat.com/2019/04/25/signing-ios-subscription-offers

over 4 years ago · Santiago Trujillo Relatório

0

Puedo confirmar que esto está funcionando:

 <?php use Ramsey\Uuid\Uuid; class ItunesSignatureGenerator { private $appBundleID = 'your.bundle.id'; private $keyIdentifier = 'ZZZZZZZ'; private $itunesPrivateKeyPath = '/path/to/the/file.p8; /** * @see https://developer.apple.com/documentation/storekit/in-app_purchase/generating_a_signature_for_subscription_offers * * @param $productIdentifier * @param $offerIdentifier * * @return Signature */ public function generateSubscriptionOfferSignature($productIdentifier, $offerIdentifier) { $nonce = strtolower(Uuid::uuid1()->toString()); $timestamp = time() * 1000; $applicationUsername = 'username'; $message = implode( "\u{2063}", [ $this->appBundleID, $this->keyIdentifier, $productIdentifier, $offerIdentifier, $applicationUsername, $nonce, $timestamp ] ); $message = $this->sign($message); return new Signature( base64_encode($message), $nonce, $timestamp, $this->keyIdentifier ); } private function sign($data) { $signature = ''; openssl_sign( $data, $signature, openssl_get_privatekey('file://' . $this->itunesPrivateKeyPath), OPENSSL_ALGO_SHA256 ); return $signature; } }

Tuvimos un problema en el lado del cliente porque el dispositivo estaba conectado a 2 cuentas diferentes de iTunes, una normal y otra sandbox. Estaba creando un error de firma no válido que no tenía sentido. Desconectamos la cuenta normal y solo usamos la cuenta sandbox y todo funciona.

over 4 years ago · Santiago Trujillo Relatório

0

Solía tener problemas con las ofertas de suscripción, pero este problema en GitHub me ayudó a hacerlo funcionar. Instalé la biblioteca Sop CryptoBridge ( composer require sop/crypto-bridge ) y finalmente funcionó para mi cliente de aplicación iOS. Aquí está mi código PHP de trabajo:

 use Sop\CryptoBridge\Crypto; use Sop\CryptoEncoding\PEM; use Sop\CryptoTypes\AlgorithmIdentifier\Hash\SHA256AlgorithmIdentifier; use Sop\CryptoTypes\AlgorithmIdentifier\Signature\SignatureAlgorithmIdentifierFactory; use Sop\CryptoTypes\Asymmetric\PrivateKeyInfo; // you can copy your p8 file contents here or just use file_get_contents() $privateKeyPem = <<<'PEM' -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY----- PEM; // load private key $privateKeyInfo = PrivateKeyInfo::fromPEM(PEM::fromString($privateKeyPem)); // you can also load p8 file like this // PrivateKeyInfo::fromPEM(PEM::fromFile($pathToP8)); // combine the parameters $appBundleId = 'com.github.yaronius'; // iOS app bundle ID $keyIdentifier = 'A1B2C3D4E5'; // Key ID from AppStore Connect $productIdentifier = 'product_identifier'; $offerIdentifier = 'offer_identifier'; $applicationUsername = 'username'; // same as in the iOS app $nonce = 'db6ba7a6-9ec2-4504-bcb9-c0dfbdc3d051'; // some UUID in lowercase $timestamp = time() * 1000; // milliseconds! as stated in the docs $dataArray = [ $appBundleId, $keyIdentifier, $productIdentifier, $offerIdentifier, $applicationUsername, $nonce, $timestamp ]; $data = implode("\u{2063}", $dataArray); // signature algorithm $algo = SignatureAlgorithmIdentifierFactory::algoForAsymmetricCrypto( $privateKeyInfo->algorithmIdentifier(), new SHA256AlgorithmIdentifier() ); // generate signature $signature = Crypto::getDefault()->sign($data, $privateKeyInfo, $algo); // encode as base64 encoded DER $encodedSignature = base64_encode($signature->toDER()); // send signature to your app echo $encodedSignature;

Tenga en cuenta algunas cosas:

  • como delimitador, debe usar el punto de código PHP Unicode , es decir, "\u{2063}" . Usar '\u2063' no funcionó para mí.
  • $nonce es UUID en minúsculas
  • $timestamp está en milisegundos (es decir time() * 1000 ).

Y debería funcionar a las mil maravillas.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda