Я внедряю уведомления Apple In-App Server-Server в Laravel. Я настроил необходимые учетные данные (essuer_id, key_id и p8 Private Key) из App Store Connect и настроил их в моем приложении. Тем не менее, я не могу декодировать подписанную загрузку, полученную из уведомлений Apple. < /P>
Вот моя реализация: < /p>
class ServerNotificationAppleController extends Controller
{
private $storeKitKeysUrl = 'https://appleid.apple.com/auth/keys';
public function handleNotification(Request $request)
{
Log::info('Apple Notification Request:', $request->all());
$signedPayload = $request->input('signedPayload');
if (!$signedPayload) {
return response()->json(['error' => 'signedPayload not provided'], 400);
}
$jwtToken = $this->generateAppleJWT();
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $jwtToken,
])->get($this->storeKitKeysUrl);
Log::info('Apple Keys Status:', ['status' => $response->status()]);
Log::info('Apple Keys Body:', ['body' => $response->body()]);
if ($response->status() !== 200) {
return response()->json(['error' => "Apple public keys couldn't be retrieved"], 401);
}
$keysData = $response->json();
$validatedPayload = $this->validateSignedPayload($signedPayload, $keysData);
if (!$validatedPayload) {
return response()->json(['error' => 'Invalid signedPayload'], 400);
}
Log::info("Apple Purchase Data:", (array)$validatedPayload);
return response()->json(['message' => 'Notification processed successfully'], 200);
}
private function generateAppleJWT()
{
$keyId = config('services.apple.key_id');
$issuerId = config('services.apple.issuer_id');
$privateKey = file_get_contents(storage_path(config('services.apple.private_key')));
$nowUtc = Carbon::now();
$expirationUtc = $nowUtc->copy()->addMinutes(20);
$payload = [
'iss' => $issuerId,
'iat' => $nowUtc->timestamp,
'exp' => $expirationUtc->timestamp,
'aud' => 'appstoreconnect-v1',
];
$header = [
'kid' => $keyId,
'alg' => 'ES256',
'typ' => 'JWT'
];
return JWT::encode($payload, $privateKey, 'ES256', $keyId, $header);
}
private function validateSignedPayload($signedPayload, $keysData)
{
try {
$jwkKeys = JWK::parseKeySet($keysData);
$allowedAlgs = new \stdClass();
$allowedAlgs->algos = ['ES256']; // Using ES256
return JWT::decode($signedPayload, $jwkKeys, $allowedAlgs);
} catch (\Exception $e) {
Log::error("Apple Purchase Validation Error: " . $e->getMessage() . " Trace: " . $e->getTraceAsString());
return null;
}
}
}
< /code>
Проблема: < /p>
Подписано загруженная загрузка. /> Должен ли мне извлечь определенную часть подписанной нагрузки перед декодированием?
может ли вопрос связан с тем, как я анализирую клавиши JWK?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... on-payload
Невозможно декодировать Apple In-App покупки сервера к серверу к серверу. ⇐ IOS
Программируем под IOS
1742058358
Anonymous
Я внедряю уведомления Apple In-App Server-Server в Laravel. Я настроил необходимые учетные данные (essuer_id, key_id и p8 Private Key) из App Store Connect и настроил их в моем приложении. Тем не менее, я не могу декодировать подписанную загрузку, полученную из уведомлений Apple. < /P>
Вот моя реализация: < /p>
class ServerNotificationAppleController extends Controller
{
private $storeKitKeysUrl = 'https://appleid.apple.com/auth/keys';
public function handleNotification(Request $request)
{
Log::info('Apple Notification Request:', $request->all());
$signedPayload = $request->input('signedPayload');
if (!$signedPayload) {
return response()->json(['error' => 'signedPayload not provided'], 400);
}
$jwtToken = $this->generateAppleJWT();
$response = Http::withHeaders([
'Authorization' => 'Bearer ' . $jwtToken,
])->get($this->storeKitKeysUrl);
Log::info('Apple Keys Status:', ['status' => $response->status()]);
Log::info('Apple Keys Body:', ['body' => $response->body()]);
if ($response->status() !== 200) {
return response()->json(['error' => "Apple public keys couldn't be retrieved"], 401);
}
$keysData = $response->json();
$validatedPayload = $this->validateSignedPayload($signedPayload, $keysData);
if (!$validatedPayload) {
return response()->json(['error' => 'Invalid signedPayload'], 400);
}
Log::info("Apple Purchase Data:", (array)$validatedPayload);
return response()->json(['message' => 'Notification processed successfully'], 200);
}
private function generateAppleJWT()
{
$keyId = config('services.apple.key_id');
$issuerId = config('services.apple.issuer_id');
$privateKey = file_get_contents(storage_path(config('services.apple.private_key')));
$nowUtc = Carbon::now();
$expirationUtc = $nowUtc->copy()->addMinutes(20);
$payload = [
'iss' => $issuerId,
'iat' => $nowUtc->timestamp,
'exp' => $expirationUtc->timestamp,
'aud' => 'appstoreconnect-v1',
];
$header = [
'kid' => $keyId,
'alg' => 'ES256',
'typ' => 'JWT'
];
return JWT::encode($payload, $privateKey, 'ES256', $keyId, $header);
}
private function validateSignedPayload($signedPayload, $keysData)
{
try {
$jwkKeys = JWK::parseKeySet($keysData);
$allowedAlgs = new \stdClass();
$allowedAlgs->algos = ['ES256']; // Using ES256
return JWT::decode($signedPayload, $jwkKeys, $allowedAlgs);
} catch (\Exception $e) {
Log::error("Apple Purchase Validation Error: " . $e->getMessage() . " Trace: " . $e->getTraceAsString());
return null;
}
}
}
< /code>
Проблема: < /p>
Подписано загруженная загрузка. /> Должен ли мне извлечь определенную часть подписанной нагрузки перед декодированием?
может ли вопрос связан с тем, как я анализирую клавиши JWK?>
Подробнее здесь: [url]https://stackoverflow.com/questions/79511485/unable-to-decode-apple-in-app-purchase-server-to-server-notification-payload[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия