Сбой запроса на подписку в Authorize.net с ошибкой неверной токенаJavascript

Форум по Javascript
Ответить
Anonymous
 Сбой запроса на подписку в Authorize.net с ошибкой неверной токена

Сообщение Anonymous »

Я должен реализовать подписку с Authorize.net. На данный момент я в среде песочницы. Код, казалось, работал 10 раз, создавая успешные подписки, но теперь он выбрасывает ошибку неверной OTS . Может ли кто -нибудь взглянуть на мой код и сообщить мне о любой конкретной причине, что это происходит: < /p>
frontend < /p>
//**the call to get opaque data */
const dataFromDispatch = (secureData) => {
return new Promise((resolve, reject) => {
if (!window.Accept || !window.Accept.dispatchData) {
setError('Payment module not loaded. Please refresh.');
setLoading(false);

return;
}
window.Accept.dispatchData(secureData, function (response) {
if (response.messages.resultCode === 'Error') {
console.log(
'Error in dispatchData:',
response.messages.message[0].text,
response.messages.message[0].code
);
reject(new Error(response.messages.message[0].text));
} else {
resolve(response.opaqueData);
}
});
});
};
const onSubmitOne = async (data) => {
setError(null);
setLoading(true);
if (!scriptLoaded) {
setError('Payment module not loaded. Please refresh.');
setLoading(false);
return;
}

const authData = {
clientKey: process.env.NEXT_PUBLIC_AUTHORIZE_CLIENT_KEY, // Replace with your sandbox key
apiLoginID: process.env.NEXT_PUBLIC_AUTHORIZE_LOGIN_ID,
};
console.log('AUTH DATA:', authData);

const secureData = {
authData,
cardData1,
};

let opaqueData;
try {
opaqueData = await dataFromDispatch({
authData: {
clientKey: process.env.NEXT_PUBLIC_AUTHORIZE_CLIENT_KEY,
apiLoginID: process.env.NEXT_PUBLIC_AUTHORIZE_LOGIN_ID,
},
cardData: {
cardNumber: data.cardNumber,
month: extractMonth(data.expiryDate), // Format MM/YY
year: extractYear(data.expiryDate), // Format MM/YY
cardCode: data.cardCode,
,
},
});
} catch (error) {
console.error('Error in dispatchData:', error);
setError(error.message || 'Failed to get payment data.');
setLoading(false);
return;
}
console.log('OPAQUE DATA:', opaqueData);

try {
const response = await axios.post('/api/subscribe', {
opaqueData: opaqueData,

firstName: data.firstname || 'John',
lastName: data.lastname || 'Doe',
});
console.log('Response:', response);
if (response.status === 200) {
router.push('/subscription-success');
}
} catch (error) {

console.error('Subscription error:', error);
setError(error.response?.data?.error || 'Subscription failed.');
} finally {
setLoading(false);
}
};
< /code>
и для бэкэнд: < /p>
export default async function handler(req, res) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}

const { firstName, lastName, opaqueData } = req.body;

console.log('Extracted opaqueData:', opaqueData);
console.log('Extracted firstName:', firstName);
console.log('Extracted lastName:', lastName);

const dataDescriptor = opaqueData?.dataDescriptor;
const dataValue = opaqueData?.dataValue;

console.log('Data Descriptor:', dataDescriptor);
console.log('Data Value:', dataValue);
// if (!opaqueData?.dataValue || !opaqueData?.dataDescriptor || !email) {
// return res.status(400).json({ error: 'Missing required fields' });
// }
if (!dataValue || !dataDescriptor) {
return res.status(400).json({ error: 'Missing required payment data' });
}
const apiLoginId = process.env.AUTHORIZE_LOGIN_ID;

const transactionKey = process.env.AUTHORIZE_TRANSACTION_KEY;
const apiUrl = process.env.AUTHORIZE_API_URL;
console.log('API Login ID:', apiLoginId);
console.log('API URL:', apiUrl);
console.log('Transaction Key:', transactionKey);

// Create subscription request payload
const subscriptionRequest = {
ARBCreateSubscriptionRequest: {
merchantAuthentication: {
name: apiLoginId,
transactionKey: transactionKey,
},
refId: `SUB-${Date.now()}`, // Generate unique reference ID
subscription: {
name: 'Monthly Subscription',
paymentSchedule: {
interval: {
length: '1',
unit: 'months',
},
startDate: new Date().toISOString().split('T')[0], // Today's date (YYYY-MM-DD)
totalOccurrences: '9999', // 12 for 12 months,9999 for infinite amount
trialOccurrences: '0', // No trial
},
amount: '50.0',
trialAmount: '0.0',
payment: {
opaqueData: {
dataDescriptor: dataDescriptor,
dataValue: dataValue,
},
},
billTo: {
firstName: firstName,
lastName: lastName,
},
},
},
};

try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
body: JSON.stringify(subscriptionRequest),
});

console.log('=== QUICK TEST ===');

console.log('Request size:', JSON.stringify(subscriptionRequest).length);
// ✅ Add this check
if (!response.ok) {
console.error('HTTP Error:', response.status, response.statusText);
const errorText = await response.text();
console.error('Error response:', errorText);
return res.status(500).json({
error: `HTTP ${response.status}: ${response.statusText}`,
});
}

const result = await response.json();
console.log('Authorize.Net API response:', result);
console.log(
'Authorize.Net API response Code:',
result.messages.message?.[0]?.code
);
console.log(
'Authorize.Net API response IN DETAIL:',
result.messages.message?.[0]?.text
);

const arbResponse = result.ARBCreateSubscriptionResponse;

const messages = arbResponse?.messages;
//console.log('Authorize.Net response:', arbResponse);
if (result.messages?.message[0].resultCode === 'Error') {
return res.status(400).json({
error: messages.message?.[0]?.text || 'Authorize.Net error',
});
}
if (result.messages?.message[0].resultCode === 'Ok') {
return res.status(200).json({
success: true,
result: result,
});
}

} catch (err) {
console.error('Authorize.Net API error:', err);
return res.status(500).json({ error: 'Internal server error' });
}
}
< /code>
Я был бы признателен за ваше руководство и обратную связь.
С уважением < /p>

Подробнее здесь: https://stackoverflow.com/questions/797 ... oken-error
Ответить

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

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

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

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

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