tl;dr
Es gab keine Informationen zu Werbeangeboten für Apples Abonnementangebote. ** Dies ist Japans erstes Dokument. ** ** **
https://developer.apple.com/videos/play/wwdc2019/305
https://developer.apple.com/jp/app-store/subscriptions/#subscription-offers
Dies gilt für Kunden, die das Abonnement derzeit nutzen oder in der Vergangenheit genutzt haben. Mit diesen Angeboten können Sie die Anzahl der Benutzer erhöhen und aufrechterhalten Sie haben die Flexibilität, Ihre eigenen Werbeaktionen durchzuführen. Durch die Kampagne können Benutzer, die ihr Abonnement gekündigt haben, aufgefordert werden, sich erneut anzumelden. Sie können ein Upgrade auf ein anderes Abonnement zum Sonderpreis anbieten.
Ein Abonnementangebot einrichten
https://developer.apple.com/jp/documentation/storekit/in-app_purchase/setting_up_subscription_offers/
** * Dieses Mal beschreiben wir nur die Signaturerstellung auf der Serverseite **
Generieren von Unterschriften für Werbeangebote https://developer.apple.com/jp/documentation/storekit/in-app_purchase/generating_a_signature_for_subscription_offers/
■appBundleID Haben in Umgebungsvariablen ■keyIdentifier Haben in Umgebungsvariablen ■productIdentifier Holen Sie sich Parameter von der App-Seite ■offerIdentifier Holen Sie sich Parameter von der App-Seite ■applicationUsername Holen Sie sich Parameter von der App-Seite ■nonce Generieren Sie auf der Serverseite ■timestamp Generieren Sie auf der Serverseite
Beispielcode Ursprünglich nach Methoden unterteilt, betont aber die Klarheit
require 'openssl'
require 'base64'
require 'securerandom'
require 'json'
#Lesen Sie als Umgebungsvariable, aber wagen Sie es, sie zu beschreiben
private_key = '-----BEGIN PRIVATE KEY-----xxxxxxxxxxxxxxxxxxx-----END PRIVATE KEY-----'
#Verhindert, dass der Zeilenvorschubcode des aus der Umgebungsvariablen gelesenen privaten Schlüssels maskiert wird
private_key = OpenSSL::PKey::EC.new(private_key.gsub(/\\n/, "\n")))
app_bundle_id = 'xxxx'
key_identifier = 'xxxx'
product_identifier = 'xxxx'
offer_identifier = 'xxxx'
application_username = 'xxxx'
nonce = SecureRandom.uuid
timestamp = (Time.current.to_f * 1000).to_i.to_s
#Unsichtbarer Separator ('\u2063') Zwischen den Parametern und kombinieren
payload = app_bundle_id + "\u{2063}" +
key_identifier + "\u{2063}" +
product_identifier + "\u{2063}" +
offer_identifier + "\u{2063}" +
application_username + "\u{2063}" +
nonce + "\u{2063}" +
timestamp
#Unterschrift
# Ruby2.4.Wenn es 0 oder höher ist
# signature = private_key.sign(digest, data)
# SHA-Signiert mit 256 Hashes
signature = private_key.dsa_sign_asn1(OpenSSL::Digest::SHA256.digest(payload))
#In base64 codieren
# strict_Verwenden Sie encode64, um den Zeilenvorschubcode zu löschen
signature_base64 = Base64.strict_encode64(signature)
#Überprüfung
# OpenSSL::PKey::EC-Objekt generieren
ec = OpenSSL::PKey::EC.new(private_key.group)
ec.public_key = private_key.public_key
# SHA-Validieren Sie mit 256 Hashes
digest = OpenSSL::Digest::SHA256.new
#Stellen Sie sicher, dass die Signaturzeichenfolge, die die Nutzdaten mit dem privaten Schlüssel signiert hat, eine Signatur mit dem öffentlichen Schlüssel ist
ec.verify(digest, signature, payload)
result = { key_identifier: key_identifier, nonce: nonce, timestamp: timestamp, signature: signature_base64 }.to_json
Zuerst dachte ich darüber nach, einen Edelstein namens ruby_ecdsa zu verwenden https://github.com/DavidEGrayson/ruby_ecdsa
require 'ecdsa'
require 'securerandom'
require 'digest/sha2'
group = ECDSA::Group::Secp256k1
private_key = 1 + SecureRandom.random_number(group.order - 1)
public_key = group.generator.multiply_by_scalar(private_key)
message = 'ECDSA is cool.'
digest = Digest::SHA2.digest(message)
temp_key = 1 + SecureRandom.random_number(group.order - 1)
signature = ECDSA.sign(group, private_key, digest, temp_key)
valid = ECDSA.valid_signature?(public_key, digest, signature)
puts "valid: #{valid}"
Da der private Schlüssel jedoch unter der Annahme eines numerischen Werts entworfen wurde, habe ich vergessen, ihn zu verwenden.
Beispiel mit JavaScript und Node.js.
https://developer.apple.com/documentation/storekit/in-app_purchase/subscriptions_and_offers/generating_a_subscription_offer_signature_on_the_server
Starten Sie den Server und erhalten Sie eine Antwort, wenn Sie darauf zugreifen
Recommended Posts