Не могу проверить квитанцию ​​Apple из -за размераIOS

Программируем под IOS
Ответить
Anonymous
 Не могу проверить квитанцию ​​Apple из -за размера

Сообщение 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>
Любые советы? Мне просто нужно проверить квитанцию, проанализировать его и получить от него транзакции.


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

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

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

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

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

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