Я создал конечную точку в своем приложении, которая позволяет мне отправлять идентификатор пользователя и квитанцию 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
Я не могу проверить подписку Apple в NESTJS ⇐ IOS
Программируем под IOS
-
Anonymous
1744479779
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79570768/i-cant-validate-the-apple-subscription-in-nestjs[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия