Я столкнулся с той же проблемой при тестировании новых файлов сервера Node.js примера WWDC2019, которые они предоставили.После чтения файла я смог успешно сгенерировать подпись.
Однако, к моему удивлению, неверная подпись будет выглядеть так же, как действительная, и мне потребовалось некоторое время, чтобы понять, что моя подпись недействительна.
Моя ошибка была следующей: я использовал Alamofire, чтобы сделать запрос GET на мой сервер, например так:
AF.request("myserver:3000/offer", parameters: parameters).responseJSON { response in
var signature: String?
var keyID: String?
var timestamp: NSNumber?
var nonce: UUID?
switch response.result {
case let .success(value):
let json = JSON(value)
// Get required parameters for creating offer
signature = json["signature"].stringValue
keyID = json["keyID"].stringValue
timestamp = json["timestamp"].numberValue
nonce = UUID(uuidString: json["nonce"].stringValue)
case let .failure(error):
print(error)
return
}
// Create offer
let discountOffer = SKPaymentDiscount(identifier: offerIdentifier, keyIdentifier: keyID!, nonce: nonce!, signature: signature!, timestamp: timestamp!)
// Pass offer in completion block
completion(discountOffer) // this completion is a part of the method where this snippet is running
}
}
На файлах, представленных в видео WWDC2019 по подпискеПредлагает , в файле index.js, они загружают параметры, которые я передал по моему запросу, примерно так:
const appBundleID = req.body.appBundleID;
const productIdentifier = req.body.productIdentifier;
const subscriptionOfferID = req.body.offerID;
const applicationUsername = req.body.applicationUsername;
Однако мой запрос alamofire не передал параметры в теле, а скореев качестве параметров запроса.Поэтому сервер генерировал подпись с нулевым appBundleID, а также с другими пустыми полями!Поэтому я изменил вышеупомянутый раздел index.js следующим образом:
const appBundleID = req.query.appBundleID;
const productIdentifier = req.query.productIdentifier;
const subscriptionOfferID = req.query.offerID;
const applicationUsername = req.query.applicationUsername;
Надеюсь, это поможет всем, кто это упустил.Прошу прощения за мой небезопасный быстрый, но я надеюсь, что вы поняли!