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);
//
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
Мобильная версия