Я создал конечную точку в своем приложении, которая позволяет мне отправлять идентификатор пользователя и квитанцию 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