[RUBY] [Apple-Abonnementangebot] So erstellen Sie eine Signatur für ein Werbeangebot

tl;dr

Es gab keine Informationen zu Werbeangeboten für Apples Abonnementangebote. ** Dies ist Japans erstes Dokument. ** ** **

Was ist ein Werbeangebot?

WWDC 2019 Video

https://developer.apple.com/videos/play/wwdc2019/305

Offizielle Dokumentation von Apple

https://developer.apple.com/jp/app-store/subscriptions/#subscription-offers

7ec9cdbd-1f10-4e9a-a5a5-c76e2c99f9ee.png

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.

Vorbereitung

Offizielle Dokumentation von Apple

Ein Abonnementangebot einrichten

https://developer.apple.com/jp/documentation/storekit/in-app_purchase/setting_up_subscription_offers/

Implementierung

** * Dieses Mal beschreiben wir nur die Signaturerstellung auf der Serverseite **

Offizielle Dokumentation von Apple

Generieren von Unterschriften für Werbeangebote https://developer.apple.com/jp/documentation/storekit/in-app_purchase/generating_a_signature_for_subscription_offers/

Was Sie brauchen, um eine Signatur zu generieren

スクリーンショット 2020-09-10 12.16.24.png

■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

Unterschrift

スクリーンショット 2020-09-10 12.45.19.png

Signaturerstellung

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

Informationen zum digitalen Signaturalgorithmus für elliptische Kurven (ECDSA)

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 für die offizielle Signaturerstellung von Apple

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

[Apple-Abonnementangebot] So erstellen Sie eine Signatur für ein Werbeangebot
So erstellen Sie eine Methode
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
So erstellen Sie überall eine H2-Datenbank
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So erstellen Sie Pagenationen für das "Kaminari" -Array
So erstellen Sie eine Klasse, die Klasseninformationen erbt
So erstellen Sie ein Thema in Liferay 7 / DXP
[1.] So erstellen Sie ein Spring-MVC-Framework-Projekt
So erstellen Sie einfach ein Pulldown mit Rails
[Rails] So erstellen Sie eine Twitter-Freigabeschaltfläche
So erstellen Sie Docker-Compose
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
So erstellen Sie eine JDBC-URL (Oracle Database, Thin)
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
So erstellen Sie einen Daten-URI (base64) in Java
Wie hinterlasse ich einen Kommentar?
So fügen Sie ein Video ein
So erstellen Sie ein leichtes Container-Image für Java-Apps
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
So erstellen und starten Sie eine Docker-Datei für Payara Micro
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
Vorbereiten der Erstellung einer Rails-Anwendung
So erstellen Sie einen Java-Container
[Rails 6] So erstellen Sie mit cocoon einen dynamischen Formular-Eingabebildschirm
Wie unterschreibe ich Minecraft MOD?
So erstellen Sie einen JDBC-Treiber
So erstellen Sie ein neues Gradle + Java + Jar-Projekt in Intellij 2016.03
[Swift] So senden Sie eine Benachrichtigung
So erstellen Sie einen Begrüßungsbildschirm
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
Versuchen Sie, eine Server-Client-App zu erstellen
So erstellen Sie einen Webserver auf einer EC2-Instanz von AWS
So erstellen Sie ein Java-Array
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
[Docker] So erstellen Sie eine virtuelle Umgebung für Rails- und Nuxt.js-Apps
So erstellen Sie einen Validator, der nur die Eingabe in ein Feld zulässt
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
[Schienen] So erstellen Sie eine Tabelle, fügen eine Spalte hinzu und ändern den Spaltentyp
So erstellen Sie eine bequeme Methode, die Generika und eine funktionale Schnittstelle verwendet
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
So erstellen Sie eine Java-Kalenderzusammenfassung
Ein Memorandum zur Verwendung von Eclipse
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie ein Video in Rails ein
So fügen Sie einen neuen Hash / Array hinzu
[Einführung in Java] So schreiben Sie ein Java-Programm
Wie erstelle ich einen Discord Bot (Java)