Проблема, создавая подпись для предложений по подписке - Код ошибки 18IOS

Программируем под IOS
Ответить
Anonymous
 Проблема, создавая подпись для предложений по подписке - Код ошибки 18

Сообщение Anonymous »

Я успешно использую подписки Apple в своем приложении, но я сталкиваюсь с ошибкой skerrorcodedomain 18 < /strong> при попытке применять предложение подписки. проверить. /> < /ul>
предложение Шаги создания кода: < /h3>
  • Подключение к хранилищам приложения → Приложение → Подписка → Select Подписк. /> Я следую над документацией Apple, чтобы сгенерировать подпись:

    https://developer.apple.com/documentati ... onal-fters
    Я построил полезную нагрузку в соответствии с указанием:

    Код: Выделить всё

    appBundleId + '\u2063' + keyIdentifier + '\u2063' + productIdentifier + '\u2063' + offerIdentifier + '\u2063' + appAccountToken + '\u2063' + nonce + '\u2063' + timestamp
    < /code>
     клавиши и идентификаторы < /h2>
    
    keyIdentifier< /code>, Esusuerid < /code> и .p8 < /code> файл получены из:
    
     Приложение Store Connect → «Пользователи и доступ» → Integration → учетные записи тестовых счетов [b] секунд [/b] и [b] Milliseconds [/b] для TimeStamp (согласно документации, она должна быть в [b] Milliseconds [/b])
    [*] Пробое настройка Appaccounttoken 


    />
  • Не настраивая его вообще
[*] Используемый примерный код Apple для генерации подписи: https://developer.apple.com/documentati ... on-sherver> wirenatied локально , и он успешно подтвержден: https://developer.apple.com/documentati ... -signature Signature < /h2>
Загружено из < /p>
const express = require('express');
const router = express.Router();

const crypto = require('crypto');
const ECKey = require('ec-key');
const secp256k1 = require('secp256k1');
const uuidv4 = require('uuid/v4');

const KeyEncoder = require('key-encoder');
const keyEncoder = new KeyEncoder('secp256k1');

const fs = require('fs');

function getKeyID() {
return "KEYIDXXXXX";
}

router.post('/offer', function(req, res) {
const appBundleID = req.body.appBundleID;
const productIdentifier = req.body.productIdentifier;
const subscriptionOfferID = req.body.offerID;
const applicationUsername = req.body.applicationUsername;

const nonce = uuidv4();
const currentDate = new Date();
const timestamp = currentDate.getTime();
const keyID = getKeyID();

const payload = appBundleID + '\u2063' +
keyID + '\u2063' +
productIdentifier + '\u2063' +
subscriptionOfferID + '\u2063' +
applicationUsername + '\u2063'+
nonce + '\u2063' +
timestamp;

// Get the PEM-formatted private key string associated with the Key ID.
// const keyString = getKeyStringForID(keyID);
// Read the .p8 file
const keyString = fs.readFileSync('./SubscriptionKey_KEYIDXXXXX.p8', 'utf8');

// Create an Elliptic Curve Digital Signature Algorithm (ECDSA) object using the private key.
const key = new ECKey(keyString, 'pem');

// Set up the cryptographic format used to sign the key with the SHA-256 hashing algorithm.
const cryptoSign = key.createSign('SHA256');

// Add the payload string to sign.
cryptoSign.update(payload);

/*
The Node.js crypto library creates a DER-formatted binary value signature,
and then base-64 encodes it to create the string that you will use in StoreKit.
*/
const signature = cryptoSign.sign('base64');

/*
Check that the signature passes verification by using the ec-key library.
The verification process is similar to creating the signature, except it uses 'createVerify'
instead of 'createSign', and after updating it with the payload, it uses `verify` to pass in
the signature and encoding, instead of `sign` to get the signature.

This step is not required, but it's useful to check when implementing your signature code.
This helps debug issues with signing before sending transactions to Apple.
If verification succeeds, the next recommended testing step is attempting a purchase
in the Sandbox environment.
*/
const verificationResult = key.createVerify('SHA256').update(payload).verify(signature, 'base64');
console.log("Verification result: " + verificationResult)

// Send the response.
res.setHeader('Content-Type', 'application/json');
res.json({ 'keyID': keyID, 'nonce': nonce, 'timestamp': timestamp, 'signature': signature });

});

module.exports = router;
< /code>
Запрос и ответа почтальона < /h2>
Request URL: http://192.168.1.141:3004/offer
Request JSON: {
"appBundleID":"com.app.bundleid",
"productIdentifier":"subscription.product.id",
"offerID":"OFFERCODE1",
"applicationUsername":"01234b43791ea309a1c3003412bcdaaa09d39a615c379cc246f5f479760629a1"
}
Response JSON: {
"keyID": "KEYIDXXXXX",
"nonce": "f98f2cda-c7a6-492f-9f92-e24a6122c0c9",
"timestamp": 1753510571664,
"signature": "MEYCIQCnA8UGWhTiCF+F6S55Zl6hpjnm7SC3aAgvmTBmQDnsAgIhAP6xIeRuREyxxx69Ve/qjnONq7pF1cK8TDn82fyePcqz"
}
< /code>
xcode Code < /h2>
func buy(_ product: SKProduct) {
let discountOffer = SKPaymentDiscount(
identifier: "OFFERCODE1",
keyIdentifier: "KEYIDXXXXX",
nonce: UUID(uuidString: "f98f2cda-c7a6-492f-9f92-e24a6122c0c9")!,
signature: "MEYCIQCnA8UGWhTiCF+F6S55Zl6hpjnm7SC3aAgvmTBmQDnsAgIhAP6xIeRuREyxxx69Ve/qjnONq7pF1cK8TDn82fyePcqz",
timestamp: 1753510571664)

let payment = SKMutablePayment(product: product)
payment.applicationUsername = "01234b43791ea309a1c3003412bcdaaa09d39a615c379cc246f5f479760629a1"
payment.paymentDiscount = discountOffer
SKPaymentQueue.default().add(payment)
}
< /code>

выпуск < /h2>
Даже следуя инструкциям документации и попытке различных комбинаций, это предложение продолжает терпеть неудачу с skerrorcodomain ошибка 18 < /strong>. Любые предложения относительно того, что может быть не так или как это можно исправить?

Подробнее здесь: https://stackoverflow.com/questions/797 ... or-code-18
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»