# Create Payment API ```javascript= router.post('/', verifyAuthToken, async(req, res, next) => { try { var uid = req.uid // var uid = req.body.uid var transactionId = 'TR-' + nanoid(); var transactionItem = { transactionId: transactionId, uid: uid, donationId: req.body.donationId, nominal: req.body.nominal, description: req.body.description } var customer = await getUserProfileByUid(uid) let parameter = { "transaction_details": { "order_id": transactionItem.transactionId, "gross_amount": transactionItem.nominal }, "credit_card": { "secure": true }, "customer_details": { "first_name": customer.first_name, "last_name": customer.last_name, "email": customer.email, "phone": customer.phone_number }, "enabled_payments": ["credit_card", "cimb_clicks", "bca_klikbca", "bca_klikpay", "bri_epay", "echannel", "permata_va", "bca_va", "bni_va", "bri_va", "other_va", "gopay", "indomaret", "danamon_online", "akulaku", "shopeepay" ], }; var paymentInfo = await snap.createTransaction(parameter) var transaction = await createTransaction(transactionItem) transaction.payment_data = paymentInfo res.status(200).send(transaction) } catch (error) { res.status(400).send(error) } }) // Only for local testing not for production router.post('/update', (req, res, next) => { updateTransactionStatus(req.query.id, 'Success') .then((data) => res.status(200).send(data)) .catch((error) => res.status(400).send(error)) }) router.post('/notification', async(req, res, next) => { try { var receivedJson = req.body var transactionStatusObject = await core.transaction.notification(receivedJson) let transactionId = transactionStatusObject.order_id; let transactionStatus = transactionStatusObject.transaction_status; let fraudStatus = transactionStatusObject.fraud_status; let summary = `Transaction notification received. Order ID: ${transactionId}. Transaction status: ${transactionStatus}. Fraud status: ${fraudStatus}.<br>Raw notification object:<pre>${JSON.stringify(transactionStatusObject, null, 2)}</pre>`; if (transactionStatus == 'capture') { if (fraudStatus == 'challenge') { var transaction = await updateTransactionStatus(transactionId, 'Challenge') } else if (fraudStatus == 'accept') { // TODO set transaction status on your databaase to 'success' var transaction = await updateTransactionStatus(transactionId, 'Success') } } else if (transactionStatus == 'settlement') { // TODO set transaction status on your databaase to 'success' var transaction = await updateTransactionStatus(transactionId, 'Success') } else if (transactionStatus == 'cancel' || transactionStatus == 'deny' || transactionStatus == 'expire') { // TODO set transaction status on your databaase to 'failure' var transaction = await updateTransactionStatus(transactionId, 'Failed') } else if (transactionStatus == 'pending') { // TODO set transaction status on your databaase to 'pending' / waiting payment var transaction = await updateTransactionStatus(transactionId, 'Pending') } else if (transactionStatus == 'refund') { // TODO set transaction status on your databaase to 'refund' var transaction = await updateTransactionStatus(transactionId, 'Refund') } console.log(summary) res.status(200).send(summary) } catch (error) { res.send(error) } }) export const getTransactionsByDonationId = (donationId) => { return new Promise((resolve, reject) => { db.manyOrNone(getTransactionsByDonationIdSql, [donationId]) .then((data) => resolve(data)) .catch((error) => reject(error)) }) } export const getTransactionsByUserUid = (uid) => { return new Promise((resolve, reject) => { db.manyOrNone(getTransactionsByUserUidSql, [uid]) .then((data) => resolve(data)) .catch((error) => reject(error)) }) } export const createTransaction = (transaction) => { return new Promise((resolve, reject) => { // console.log(transaction.transactionId) // resolve(transaction) db.oneOrNone(createTransactionSql, [ transaction.transactionId, transaction.uid, transaction.donationId, transaction.nominal, transaction.description ]) .then((data) => resolve(data)) .catch((error) => reject(error)) }) } export const updateTransactionStatus = (transactionId, status) => { return new Promise((resolve, reject) => { db.oneOrNone(updateTransactionStatusSql, [status, transactionId]) .then((data) => resolve(data)) .catch((error) => reject(error)) }) } ```