Я пытаюсь настроить обработку платежей для моего приложения для iOS. После того, как квитанция о платеже сгенерирована в iOS - мы отправляем его в Node.js Backend Buck_subscription конечную точку, которая проверяет квитанцию с использованием функции VerifyApplerEceipt, генерирует данные заказа, которые будут вставлены в DB с использованием функции GenerateRoderData. Однако, когда я пытаюсь приобрести свою автоматическую подписку-я постоянно получаю ошибку бэкэнд: < /p>
PayloadTooLargeError: request entity too large
at readStream
at getRawBody
at read
at jsonParser
at Layer.handle [as handle_request]
at trim_prefix
at
at Function.process_params
at next
at expressInit
< /code>
В какой -то момент в прошлом я смог правильно обработать покупку и записать сгенерированные данные в дБ. Поскольку я использую учетную запись Apple Sandbox для тестирования - каждая покупка песочницы генерирует 6 покупок в последнем_Рециппе_инфо квитанции Apple (5 минут * 6 обновления = 1 месяц Sandox). Так что в настоящее время моя плохая квитанция имеет 254 операции. < /P>
const verifyAppleReceipt = async (receiptData) => {
addLog(`[verifyAppleReceipt] Starting verification`);
addLog(`[verifyAppleReceipt] Receipt preview: ${receiptData.substring(0, 20)}...`);
const requestPayload = {
'receipt-data': receiptData,
'password': 'exampleData',
'exclude-old-transactions': true
};
addLog(`[verifyAppleReceipt] Payload keys: ${Object.keys(requestPayload).join(',')}`);
try {
addLog(`[verifyAppleReceipt] Requesting production endpoint...`);
let response = await axios.post('https://buy.itunes.apple.com/verifyReceipt', requestPayload);
addLog(`[verifyAppleReceipt] Production response status: ${response.data.status}`);
if (response.data.status === 21007) {
addLog(`[verifyAppleReceipt] 21007 = Sandbox receipt, switching to sandbox endpoint...`);
response = await axios.post('https://sandbox.itunes.apple.com/verifyReceipt', requestPayload);
addLog(`[verifyAppleReceipt] Sandbox response status: ${response.data.status}`);
}
return response.data;
} catch (error) {
addLog(`[verifyAppleReceipt] Error: ${error.message}`);
throw error;
}
};
async function generateOrderData({ parsedReceipt, uid, receiptData, productId, amount, isAutoRenewable }) {
try {
const transaction = parsedReceipt.latest_receipt_info?.slice(-1)[0] || parsedReceipt.receipt?.in_app?.slice(-1)[0];
if (!transaction) throw new Error('No valid transaction found in receipt');
const order_id = `APPLE${transaction.transaction_id}`;
const transactionDate = new Date(parseInt(transaction.purchase_date_ms));
console.log("[GENERATE ORDER] Getting member info for:", uid);
const memResult = await executeQuery(`SELECT idx FROM MemberInfo WHERE id = N'${uid}'`);
if (!Array.isArray(memResult) || memResult.length === 0) throw new Error('User not found');
const mem_idx = memResult[0].idx;
const item_settle_choice = isAutoRenewable ? 1 : (amount === 1 ? 1 : amount === 6 ? 2 : amount === 12 ? 3 : 0);
console.log("[GENERATE ORDER] Getting existing product info for:", mem_idx);
const existingProResult = await executeQuery(`SELECT pro_date_start FROM tv_myitem_tb WHERE mem_idx = ${mem_idx}`);
const existingProStart = existingProResult?.[0]?.pro_date_start;
const pro_date_start = existingProStart || transactionDate;
const daysToAdd = isAutoRenewable ? 3 : (typeof amount === 'number' ? 30 * amount : 0);
let pro_date_end = DateTime.fromJSDate(transactionDate).plus({ days: daysToAdd }).toJSDate();
const price = isAutoRenewable ? 13000 : (amount === 1 ? 13000 : amount === 6 ? 70000 : amount === 12 ? 120000 : 0);
return {
order_id,
regdate: transactionDate,
item_settle_choice,
mem_idx,
mem_id: uid,
pro_date_start,
pro_date_end,
receiptData,
productId,
price
};
} catch (error) {
console.error("[GENERATE ORDER] Error:", error);
throw error;
}
}
function toUTCFromLocal(date) {
return DateTime.fromJSDate(date).toUTC(); // Converts a JavaScript Date object to a Luxon DateTime object and returns UTC
}
router.post("/buy_subscription", async function (req, res) {
try {
const { uid, receiptData, productId } = req.body;
console.log("[BUY MEMBERSHIP] Starting purchase for:", uid);
const existingOrder = await executeQuery(`SELECT order_idxx FROM web_pay_apple_log WHERE productId = N'${productId}' AND receiptData = N'${receiptData}'`);
if (Array.isArray(existingOrder) && existingOrder.length > 0) {
return res.end('{"rtnCd":"fail","rtnMsg":["Duplicate receipt detected"]}');
}
const appleResponse = await verifyAppleReceipt(receiptData);
if (appleResponse.status !== 0) throw new Error("Verification failed");
const orderData = await generateOrderData({ parsedReceipt: appleResponse, uid, receiptData, productId, isAutoRenewable: true });
const checkQuery = `SELECT pro_date_count FROM tv_myitem_tb WHERE pro_code = '915' AND mem_idx = ${orderData.mem_idx}`;
console.log("[BUY MEMBERSHIP] Checking existing membership:", checkQuery);
const checkResult = await executeQuery(checkQuery);
const proDateCount = checkResult?.[0]?.pro_date_count || 0;
if (proDateCount === 0) {
const insertQuery = `
INSERT INTO tv_myitem_tb(mem_idx, mem_id, pro_cate, pro_code, pro_name, pro_gubun, pro_date_count, dnis, pro_date_start, pro_date_end)
SELECT idx, id, 1, '915', N'정회원 자동결제', 2, 1, '15', GETDATE(), DATEADD(dd, 3, GETDATE())
FROM MemberInfo WHERE idx = ${orderData.mem_idx}
`;
console.log("[BUY MEMBERSHIP] Inserting new membership:", insertQuery);
await executeQuery(insertQuery);
} else {
const updateQuery = `
UPDATE tv_myitem_tb
SET pro_date_end = DATEADD(dd, 3, GETDATE())
WHERE mem_idx = ${orderData.mem_idx} AND pro_code = '915'
`;
console.log("[BUY MEMBERSHIP] Updating existing membership:", updateQuery);
await executeQuery(updateQuery);
}
const logQuery = `
INSERT INTO web_pay_apple_log(order_idxx, id, cd_value, item_settle_choice, item_code_idx, item_name, cd_info, site, productId, receiptData, mem_idx)
VALUES (N'${orderData.order_id}', N'${orderData.mem_id}', ${orderData.price}, ${orderData.item_settle_choice}, '915', N'정회원 자동결제', '1', 'land', N'${orderData.productId}', N'${orderData.receiptData}', ${orderData.mem_idx})
`;
console.log("[BUY MEMBERSHIP] Logging transaction:", logQuery);
await executeQuery(logQuery);
res.end('{"rtnCd":"success","rtnMsg":[""]}');
} catch (error) {
console.error("[BUY MEMBERSHIP] Error:", error);
res.end('{"rtnCd":"fail","rtnMsg":["Error processing payment"]}');
}
});
< /code>
Поскольку я не вижу никакого ведения журнала отладки - я подозреваю, что какой бы то ни было, что не удается, прежде чем что -либо будет выполнено, и я не могу понять. < /p>
Любые советы? Мне просто нужно проверить квитанцию, проанализировать его и получить от него транзакции.
Подробнее здесь: https://stackoverflow.com/questions/795 ... o-the-size
Не могу проверить квитанцию Apple из -за размера ⇐ IOS
Программируем под IOS
-
Anonymous
1745253059
Anonymous
Я пытаюсь настроить обработку платежей для моего приложения для iOS. После того, как квитанция о платеже сгенерирована в iOS - мы отправляем его в Node.js Backend Buck_subscription конечную точку, которая проверяет квитанцию с использованием функции VerifyApplerEceipt, генерирует данные заказа, которые будут вставлены в DB с использованием функции GenerateRoderData. Однако, когда я пытаюсь приобрести свою автоматическую подписку-я постоянно получаю ошибку бэкэнд: < /p>
PayloadTooLargeError: request entity too large
at readStream
at getRawBody
at read
at jsonParser
at Layer.handle [as handle_request]
at trim_prefix
at
at Function.process_params
at next
at expressInit
< /code>
В какой -то момент в прошлом я смог правильно обработать покупку и записать сгенерированные данные в дБ. Поскольку я использую учетную запись Apple Sandbox для тестирования - каждая покупка песочницы генерирует 6 покупок в последнем_Рециппе_инфо квитанции Apple (5 минут * 6 обновления = 1 месяц Sandox). Так что в настоящее время моя плохая квитанция имеет 254 операции. < /P>
const verifyAppleReceipt = async (receiptData) => {
addLog(`[verifyAppleReceipt] Starting verification`);
addLog(`[verifyAppleReceipt] Receipt preview: ${receiptData.substring(0, 20)}...`);
const requestPayload = {
'receipt-data': receiptData,
'password': 'exampleData',
'exclude-old-transactions': true
};
addLog(`[verifyAppleReceipt] Payload keys: ${Object.keys(requestPayload).join(',')}`);
try {
addLog(`[verifyAppleReceipt] Requesting production endpoint...`);
let response = await axios.post('https://buy.itunes.apple.com/verifyReceipt', requestPayload);
addLog(`[verifyAppleReceipt] Production response status: ${response.data.status}`);
if (response.data.status === 21007) {
addLog(`[verifyAppleReceipt] 21007 = Sandbox receipt, switching to sandbox endpoint...`);
response = await axios.post('https://sandbox.itunes.apple.com/verifyReceipt', requestPayload);
addLog(`[verifyAppleReceipt] Sandbox response status: ${response.data.status}`);
}
return response.data;
} catch (error) {
addLog(`[verifyAppleReceipt] Error: ${error.message}`);
throw error;
}
};
async function generateOrderData({ parsedReceipt, uid, receiptData, productId, amount, isAutoRenewable }) {
try {
const transaction = parsedReceipt.latest_receipt_info?.slice(-1)[0] || parsedReceipt.receipt?.in_app?.slice(-1)[0];
if (!transaction) throw new Error('No valid transaction found in receipt');
const order_id = `APPLE${transaction.transaction_id}`;
const transactionDate = new Date(parseInt(transaction.purchase_date_ms));
console.log("[GENERATE ORDER] Getting member info for:", uid);
const memResult = await executeQuery(`SELECT idx FROM MemberInfo WHERE id = N'${uid}'`);
if (!Array.isArray(memResult) || memResult.length === 0) throw new Error('User not found');
const mem_idx = memResult[0].idx;
const item_settle_choice = isAutoRenewable ? 1 : (amount === 1 ? 1 : amount === 6 ? 2 : amount === 12 ? 3 : 0);
console.log("[GENERATE ORDER] Getting existing product info for:", mem_idx);
const existingProResult = await executeQuery(`SELECT pro_date_start FROM tv_myitem_tb WHERE mem_idx = ${mem_idx}`);
const existingProStart = existingProResult?.[0]?.pro_date_start;
const pro_date_start = existingProStart || transactionDate;
const daysToAdd = isAutoRenewable ? 3 : (typeof amount === 'number' ? 30 * amount : 0);
let pro_date_end = DateTime.fromJSDate(transactionDate).plus({ days: daysToAdd }).toJSDate();
const price = isAutoRenewable ? 13000 : (amount === 1 ? 13000 : amount === 6 ? 70000 : amount === 12 ? 120000 : 0);
return {
order_id,
regdate: transactionDate,
item_settle_choice,
mem_idx,
mem_id: uid,
pro_date_start,
pro_date_end,
receiptData,
productId,
price
};
} catch (error) {
console.error("[GENERATE ORDER] Error:", error);
throw error;
}
}
function toUTCFromLocal(date) {
return DateTime.fromJSDate(date).toUTC(); // Converts a JavaScript Date object to a Luxon DateTime object and returns UTC
}
router.post("/buy_subscription", async function (req, res) {
try {
const { uid, receiptData, productId } = req.body;
console.log("[BUY MEMBERSHIP] Starting purchase for:", uid);
const existingOrder = await executeQuery(`SELECT order_idxx FROM web_pay_apple_log WHERE productId = N'${productId}' AND receiptData = N'${receiptData}'`);
if (Array.isArray(existingOrder) && existingOrder.length > 0) {
return res.end('{"rtnCd":"fail","rtnMsg":["Duplicate receipt detected"]}');
}
const appleResponse = await verifyAppleReceipt(receiptData);
if (appleResponse.status !== 0) throw new Error("Verification failed");
const orderData = await generateOrderData({ parsedReceipt: appleResponse, uid, receiptData, productId, isAutoRenewable: true });
const checkQuery = `SELECT pro_date_count FROM tv_myitem_tb WHERE pro_code = '915' AND mem_idx = ${orderData.mem_idx}`;
console.log("[BUY MEMBERSHIP] Checking existing membership:", checkQuery);
const checkResult = await executeQuery(checkQuery);
const proDateCount = checkResult?.[0]?.pro_date_count || 0;
if (proDateCount === 0) {
const insertQuery = `
INSERT INTO tv_myitem_tb(mem_idx, mem_id, pro_cate, pro_code, pro_name, pro_gubun, pro_date_count, dnis, pro_date_start, pro_date_end)
SELECT idx, id, 1, '915', N'정회원 자동결제', 2, 1, '15', GETDATE(), DATEADD(dd, 3, GETDATE())
FROM MemberInfo WHERE idx = ${orderData.mem_idx}
`;
console.log("[BUY MEMBERSHIP] Inserting new membership:", insertQuery);
await executeQuery(insertQuery);
} else {
const updateQuery = `
UPDATE tv_myitem_tb
SET pro_date_end = DATEADD(dd, 3, GETDATE())
WHERE mem_idx = ${orderData.mem_idx} AND pro_code = '915'
`;
console.log("[BUY MEMBERSHIP] Updating existing membership:", updateQuery);
await executeQuery(updateQuery);
}
const logQuery = `
INSERT INTO web_pay_apple_log(order_idxx, id, cd_value, item_settle_choice, item_code_idx, item_name, cd_info, site, productId, receiptData, mem_idx)
VALUES (N'${orderData.order_id}', N'${orderData.mem_id}', ${orderData.price}, ${orderData.item_settle_choice}, '915', N'정회원 자동결제', '1', 'land', N'${orderData.productId}', N'${orderData.receiptData}', ${orderData.mem_idx})
`;
console.log("[BUY MEMBERSHIP] Logging transaction:", logQuery);
await executeQuery(logQuery);
res.end('{"rtnCd":"success","rtnMsg":[""]}');
} catch (error) {
console.error("[BUY MEMBERSHIP] Error:", error);
res.end('{"rtnCd":"fail","rtnMsg":["Error processing payment"]}');
}
});
< /code>
Поскольку я не вижу никакого ведения журнала отладки - я подозреваю, что какой бы то ни было, что не удается, прежде чем что -либо будет выполнено, и я не могу понять. < /p>
Любые советы? Мне просто нужно проверить квитанцию, проанализировать его и получить от него транзакции.
Подробнее здесь: [url]https://stackoverflow.com/questions/79584825/cant-verify-apple-receipt-due-to-the-size[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия