Я не могу проверить подписку Apple в NESTJSIOS

Программируем под IOS
Ответить
Anonymous
 Я не могу проверить подписку Apple в NESTJS

Сообщение Anonymous »

Я создал конечную точку в своем приложении, которая позволяет мне отправлять идентификатор пользователя и квитанцию ​​Apple для проверки подписки непосредственно в моем приложении.0|app-backend | Apple validation response: [
0|app-backend | {
0|app-backend | transactionId: '123456789012345',
0|app-backend | originalTransactionId: '123456789012340',
0|app-backend | bundleId: 'com.example.app',
0|app-backend | productId: 'com.example.app.subscription.monthly',
0|app-backend | purchaseDate: 1744461821000,
0|app-backend | expirationDate: 1747053821000,
0|app-backend | quantity: 1,
0|app-backend | web_order_line_item_id: '123456789000000',
0|app-backend | webOrderLineItemId: '123456789000000'
0|app-backend | }
0|app-backend | ]
0|app-backend | Invalid receipt received: [
0|app-backend | {
0|app-backend | transactionId: '123456789012345',
0|app-backend | originalTransactionId: '123456789012340',
0|app-backend | bundleId: 'com.example.app',
0|app-backend | productId: 'com.example.app.subscription.monthly',
0|app-backend | purchaseDate: 1744461821000,
0|app-backend | expirationDate: 1747053821000,
0|app-backend | quantity: 1,
0|app-backend | web_order_line_item_id: '123456789000000',
0|app-backend | webOrderLineItemId: '123456789000000'
0|app-backend | }
0|app-backend | ]
0|app-backend | Error during Apple receipt verification: Error: Invalid receipt
0|app-backend | at SubscriptionService.verifyAppleSubscription (src/subscription/subscription.service.ts:69:15)
0|app-backend | at node_modules/@nestjs/core/router/router-execution-context.js:46:28
0|app-backend | at node_modules/@nestjs/core/router/router-proxy.js:9:17
< /code>
Вот различные коды, которые я использую: < /p>
@Post('verify')
async verifySubscription(
@Body('userId') userId: number,
@Body('receipt') receipt: string,
@Body('platform') platform: string,
) {
if (!userId || !receipt || !platform) {
throw new BadRequestException('Missing parameters');
}

if (platform !== 'ios') {
throw new BadRequestException('Only iOS receipts are supported');
}

return this.subscriptionService.verifyAppleSubscription(userId, receipt);
}

async onModuleInit() {
if (!process.env.APPLE_WEBHOOK_SECRET) {
throw new Error(
'APPLE_WEBHOOK_SECRET is not defined in environment variables',
);
}

verifyAppleReceipt.config({
secret: process.env.APPLE_WEBHOOK_SECRET,
environment: 'production',
});

console.log('Apple receipt verification configured successfully');
}

async verifyAppleSubscription(
userId: number,
receipt: string,
): Promise {
userId = Number(userId);

const user = await this.userService.findOne(userId);

const userEmail = user.userEmail;
console.log('[User Email]', userEmail);

console.log('[START] verifyAppleSubscription called with:', {
userId,
receipt,
});

console.log('Type de userId:', typeof userId, 'Valeur:', userId);
if (isNaN(userId)) {
console.log('userId est NaN ! ');
}

if (!userId || !receipt) {
console.log('Missing parameters:', { userId, receipt });
throw new BadRequestException('Missing userId or receipt');
}

try {
console.log('Sending receipt for validation...');

const trimmedReceipt = receipt.trim();
const validationResponse = await verifyAppleReceipt.validate({
receipt: trimmedReceipt,
});

console.log('Apple validation response:', validationResponse);

if (!validationResponse || !validationResponse.receipt) {
console.log('Invalid receipt received:', validationResponse);
throw new Error('Invalid receipt');
}

const latestReceiptInfo = validationResponse.latest_receipt_info;
console.log('Latest receipt info:', latestReceiptInfo);

const isActive = latestReceiptInfo?.some((sub) => {
const productId = sub.product_id?.trim();
console.log('Produit analysé:', productId);

console.log('Checking subscription expiration:', {
expires_date_ms: sub.expires_date_ms,
expires_date: new Date(Number(sub.expires_date_ms)),
now: new Date(),
});

return new Date(Number(sub.expires_date_ms)) > new Date();
});

console.log('Is subscription active?', isActive);

if (isActive) {
console.log('Subscription is active. Updating user in DB...');

await this.userRepository.update(userId, { isSubscribed: true });

console.log('User subscription updated successfully.');
return { success: true, message: 'Subscription verified and updated' };
} else {
console.log('Subscription is expired or invalid.');
return { success: false, message: 'Subscription expired or invalid' };
}
} catch (error) {
console.log('Error during Apple receipt verification:', error);

throw new BadRequestException(
`Apple receipt verification failed: ${error.message}`,
);
}
}
}
< /code>
Вы знаете, как решить эту проблему?
Большое спасибо заранее. < /p>

Подробнее здесь: https://stackoverflow.com/questions/795 ... -in-nestjs
Ответить

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

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

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

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

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