From 9f75aaac999d4ed21e7c6cf66f37cbc6c22cad6b Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Mon, 11 Sep 2023 15:10:39 +0200 Subject: [PATCH] bug fixes for payrexx integration (still no good) --- .../payments/payrexx/module.payrexx.js | 6 ++ .../plugins/payments/payrexx/payrexxRoutes.js | 92 ++++++++++--------- 2 files changed, 56 insertions(+), 42 deletions(-) diff --git a/src/server/backend/plugins/payments/payrexx/module.payrexx.js b/src/server/backend/plugins/payments/payrexx/module.payrexx.js index de17744..a5e5e9b 100644 --- a/src/server/backend/plugins/payments/payrexx/module.payrexx.js +++ b/src/server/backend/plugins/payments/payrexx/module.payrexx.js @@ -16,6 +16,10 @@ const hmacSHA256 = require( 'crypto-js/hmac-sha256' ); const payrexxConfig = JSON.parse( fs.readFileSync( path.join( __dirname + '/config.payments.secret.json' ) ) ); const baseUrl = 'https://api.payrexx.com/v1.0/'; + +if ( !payrexxConfig.APISecret || !payrexxConfig.instance ) { + throw new Error( '[ Payrexx ] No API secret or instance name configured!' ); +} const instance = payrexxConfig.instance; const secret = payrexxConfig.APISecret; @@ -32,10 +36,12 @@ exports.init = function () { getGateway: function ( id ) { const baseUrl = buildBaseUrl( 'Gateway/' + id + '/' ); const url = baseUrl + '&ApiSignature=' + buildSignature(); + console.error( url ); return axios.get( url ); }, createGateway: function ( params ) { if ( !params.amount ) { + // TODO: Think if we really have to throw here throw new Error( 'Amount required!' ); } diff --git a/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js b/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js index 0ca3fd9..4918691 100644 --- a/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js +++ b/src/server/backend/plugins/payments/payrexx/payrexxRoutes.js @@ -18,6 +18,7 @@ const TicketGenerator = new ticket(); let sessionReference = {}; let waitingClients = {}; let pendingPayments = {}; +let gatewayReference = {}; let paymentOk = {}; module.exports = ( app, settings ) => { @@ -33,6 +34,7 @@ module.exports = ( app, settings ) => { 'currency': settings.currency, 'basket': [], 'amount': 0, + 'referenceId': req.session.id, }; db.getDataSimple( 'temp', 'user_id', req.session.id ).then( dat => { @@ -55,6 +57,7 @@ module.exports = ( app, settings ) => { const session = response.data.data[ 0 ]; sessionReference[ session.id ] = { 'tok': req.session.id, 'email': req.session.username }; pendingPayments[ req.session.id ] = true; + gatewayReference[ req.session.id ] = session.id; res.send( session.link ); } else { res.status( 500 ).send( 'ERR_PAYMENT' ); @@ -130,54 +133,59 @@ module.exports = ( app, settings ) => { } } ); - app.post( '/payments/webhook', bodyParser.raw( { type: 'application/json' } ), async ( req, res ) => { - console.error( req.body ); - const response = await payrexx.getGateway( req.body.id ); + app.post( '/payments/webhook', bodyParser.json(), async ( req, res ) => { + if ( req.body.transaction.status === 'confirmed' ) { + const response = await payrexx.getGateway( gatewayReference[ req.body.transaction.referenceId ] ); - if ( response.status === 200 ) { - const gateway = response.data.data[ 0 ]; - - res.status( 200 ).end(); - if ( gateway.status === 'confirmed' ) { - setTimeout( () => { - if ( waitingClients[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ] ) { - waitingClients[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ].write( 'data: paymentOk\n\n' ); - } - }, 1000 ); - db.getDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).then( dat => { - db.getDataSimple( 'users', 'email', sessionReference[ response.data.data[ 0 ].id ][ 'email' ] ).then( user => { - if ( user[ 0 ] ) { - const tickets = JSON.parse( dat[ 0 ].data ); - db.writeDataSimple( 'orders', 'account_id', user[ 0 ].account_id, { 'account_id': user[ 0 ].account_id, 'tickets': dat[ 0 ].data, 'order_name': sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] } ).then( () => { - console.log( sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ); - TicketGenerator.generateTickets( sessionReference[ response.data.data[ 0 ].id ] ); - db.getJSONData( 'booked' ).then( ret => { - let booked = ret ?? {}; - for ( let event in tickets ) { - if ( !booked[ String( event ) ] ) { - booked[ String( event ) ] = {}; + if ( response.status === 200 ) { + const gateway = response.data.data[ 0 ]; + + res.status( 200 ).end(); + if ( gateway.status === 'confirmed' ) { + setTimeout( () => { + if ( waitingClients[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ] ) { + waitingClients[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ].write( 'data: paymentOk\n\n' ); + } + }, 1000 ); + db.getDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).then( dat => { + db.getDataSimple( 'users', 'email', sessionReference[ response.data.data[ 0 ].id ][ 'email' ] ).then( user => { + if ( user[ 0 ] ) { + const tickets = JSON.parse( dat[ 0 ].data ); + db.writeDataSimple( 'orders', 'account_id', user[ 0 ].account_id, { 'account_id': user[ 0 ].account_id, 'tickets': dat[ 0 ].data, 'order_name': sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] } ).then( () => { + console.log( sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ); + TicketGenerator.generateTickets( sessionReference[ response.data.data[ 0 ].id ] ); + db.getJSONData( 'booked' ).then( ret => { + let booked = ret ?? {}; + for ( let event in tickets ) { + if ( !booked[ String( event ) ] ) { + booked[ String( event ) ] = {}; + } + for ( let tik in tickets[ event ] ) { + booked[ event ][ tik ] = tickets[ event ][ tik ]; + } } - for ( let tik in tickets[ event ] ) { - booked[ event ][ tik ] = tickets[ event ][ tik ]; - } - } - db.writeJSONData( 'booked', booked ).then( () => { - delete pendingPayments[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ]; - } ); - db.deleteDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).catch( error => { - console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); + db.writeJSONData( 'booked', booked ).then( () => { + delete pendingPayments[ sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ]; + } ); + db.deleteDataSimple( 'temp', 'user_id', sessionReference[ response.data.data[ 0 ].id ][ 'tok' ] ).catch( error => { + console.error( '[ STRIPE ] ERROR whilst deleting data from DB: ' + error ); + } ); } ); } ); - } ); - } else { - console.log( sessionReference[ response.data.data[ 0 ].id ][ 'email' ] ); - console.error( 'user not found' ); - } + } else { + console.log( sessionReference[ response.data.data[ 0 ].id ][ 'email' ] ); + console.error( 'user not found' ); + } + } ); + } ).catch( err => { + console.error( err ); } ); - } ).catch( err => { - console.error( err ); - } ); + } + } else { + res.send( 'ok' ); } + } else { + res.send( 'ok' ); } } ); }; \ No newline at end of file