GenesisGateway / genesis.js

Genesis Node.JS client integration
MIT License
1 stars 2 forks source link

genesis.js

Software License

Node.js client library for Genesis Payment Gateway

Overview

Client Library for processing payments through Genesis Payment Processing Gateway. Its highly recommended to checkout "Genesis Payment Gateway API Documentation" first, in order to get an overview of Genesis's Payment Gateway API and functionality.

Requirements

Installation

npm install genesis.js

Getting Started

In order to process transactions via Genesis, you'll have to acquire the necessary credentials in order to connect to the Gateway.

Configuration

You can override the path to the directory holding your configuration files (by default its config in the root directory of the module) via environmental variable NODE_CONFIG_DIR. The first file to parse configuration from, is <your-config-dir>/default.json and based on the environment variable (NODE_ENV), you can specify your custom file; for example <your-config-dir>/<NODE_ENV_NAME>.json.

Note: Its good practice to prevent web/direct access to your config directory and protect the files inside

You can override the config inside your code:

Sale Transaction

var crypto, failure, genesis, success, transaction;

genesis = require('./lib/genesis.js');

crypto = require('crypto');

transaction = new genesis.transaction();

failure = function(reason) {
  return console.log(reason);
};

success = function(data) {
  return console.log(data);
};

transaction.sale({
    transaction_id: crypto.randomBytes(16).toString('hex'),
    usage: 'Demo Payment Transaction',
    description: 'This is my first payment',
    remote_ip: '127.0.0.1',
    amount: '100',
    currency: 'USD',
    card_holder: 'John Doe',
    card_number: '4200000000000000',
    cvv: '000',
    expiration_month: 12,
    expiration_year: 2020,
    customer_email: 'email@example.com',
    customer_phone: '0123456789',
    billing_address: {
      first_name: 'John',
      last_name: 'Doe',
      address1: '123 Str.',
      zip_code: '10000',
      city: 'New York',
      country: 'US'
    }
  })
  .send()
  .then(success)
  .catch(failure);
genesis = require './lib/genesis.js'
crypto  = require 'crypto'

transaction = new genesis.transaction();

failure = (reason) ->
    console.log reason

success = (data) ->
   console.log data

transaction.sale({
    transaction_id    : crypto.randomBytes(16).toString('hex')
    usage             : 'Demo Payment Transaction'
    description       : 'This is my first payment'
    remote_ip         : '127.0.0.1'
    amount            : '100'
    currency          : 'USD'
    card_holder       : 'John Doe'
    card_number       : '4200000000000000'
    cvv               : '000'
    expiration_month  : 12
    expiration_year   : 2020
    customer_email    : 'email@example.com'
    customer_phone    : '0123456789'
    billing_address   :
        first_name: 'John'
        last_name : 'Doe'
        address1  : '123 Str.'
        zip_code  : '10000'
        city      : 'New York'
        country   : 'US'
    })
    .send()
    .then(success)
    .catch(failure)

The example above is going to create a Sale (Authorize w/ immediate Capture) transaction for the amount of $100.

3DS Transaction

Sample request including all the conditionally required/optional params for initiating a 3DS transaction with the 3DSv2-Method authentication protocol.

Also, an example is provided for the 3DS-Method-continue API call that will have to be submitted after the 3DS-Method is initiated.

JavaScript example ```js var crypto, failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { if (data.status == 'approved') { // Transaction approved no customer action required // Test Case: Synchronous 3DSv2 Request with Frictionless flow } if (data.status == 'declined' || data.status == 'error') { // Transaction declined no customer action required // Synchronous 3DSv2 Request with Frictionless flow } if (data.status == 'pending_async') { if (data.redirect_url) { console.log(data.redirect_url_type) console.log(data.redirect_url) } if (data.threeds_method_url) { transaction.method_continue(data) .send() .then(function (data) { if (data.status == 'approved') { // Transaction APPROVED no customer action required // Test Case: Asynchronous 3DSv2 Request with 3DS-Method and Frictionless flow } if (data.status == 'pending_async') { // Customer action required if (data.redirect_url) { // Test Case: Asynchronous 3DSv2 Request with 3DS-Method Challenge flow // Test Case: Asynchronous 3DSv2 Request with 3DS-Method Fallback flow console.log(redirect_url_type) console.log(redirect_url) } } if (data.status == 'declined' || data.status == 'error') { // Transaction declined no customer action required // Synchronous 3DSv2 Request with Frictionless flow } }) .catch(failure); } } return console.log(data); }; transaction.sale3d({ transaction_id: 'gnss-js-' + crypto.randomBytes(16).toString('hex'), usage: 'Genesis JS Client Automated Request', remote_ip: '118.240.158.6', currency: 'USD', amount: '50', // Return URLS notification_url: 'http://example.com/', return_success_url: 'https://success.ss', return_failure_url: 'https://failure.ff', // Customer Details customer_email: 'email@test.com', customer_phone: '0123456789', // Credit Card Details card_holder: 'Test Tester', card_number: '4012000000060085', // Test Case: Synchronous 3DSv2 Request with Frictionless flow // Test Cases // card_number: '4066330000000004', // Test Case: Asynchronous 3DSv2 Request with 3DS-Method and Frictionless flow // card_number: '4918190000000002', // Test Case: Asynchronous 3DSv2 Request with Challenge flow // card_number: '4938730000000001', // Test Case: Asynchronous 3DSv2 Request with 3DS-Method Challenge flow // card_number: '4901170000000003', // Test Case: Asynchronous 3DSv2 Request with Fallback flow // card_number: '4901164281364345', // Test Case: Asynchronous 3DSv2 Request with 3DS-Method Fallback flow cvv: '123', expiration_month: '01', expiration_year: '2020', // Billing/Invoice Details billing_address: { first_name: 'Kamryn', last_name: 'Strosin', address1: '834 Huels Wells', zip_code: '52036-7047', city: 'Bettyeview', country: 'IQ' }, // 3DSv2 params // 3DSv2 Method Attributes threeds_v2_params: { threeds_method: { callback_url: 'https://www.example.com/threeds/threeds_method/callback' }, control: { device_type: 'browser', challenge_window_size: 'full_screen', challenge_indicator: 'preference' }, purchase: { category: 'service' }, merchant_risk: { shipping_indicator: 'verified_address', delivery_timeframe: 'electronic', reorder_items_indicator: 'reordered', pre_order_purchase_indicator: 'merchandise_available', pre_order_date: '19-08-2024', gift_card: 'true', gift_card_count: 99 }, card_holder_account: { creation_date: '19-07-2021', update_indicator: 'more_than_60days', last_change_date: '19-04-2022', password_change_indicator: 'no_change', password_change_date: '04-07-2022', shipping_address_usage_indicator: 'current_transaction', shipping_address_date_first_used: '14-07-2022', transactions_activity_last_24_hours: 2, transactions_activity_previous_year: 10, provision_attempts_last_24_hours: 1, purchases_count_last_6_months: 5, suspicious_activity_indicator: 'no_suspicious_observed', registration_indicator: '30_to_60_days', registration_date: '19-07-2020' }, browser: { accept_header: '*/*', java_enabled: false, language: 'en-GB', color_depth: 32, screen_height: 900, screen_width: 1440, time_zone_offset: '-120', user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' }, sdk: { interface: 'native', ui_types: { ui_type: 'multi_select' }, application_id: 'fc1650c0-5778-0138-8205-2cbc32a32d65', encrypted_data: 'encrypted-data-here', ephemeral_public_key_pair: 'public-key-pair', max_timeout: 10, reference_number: 'sdk-reference-number-her' } } }) .send() .then(success) .catch(failure); ```
CoffeeScript example ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> if data.status == 'approved' then # Transaction approved no customer action required # Test Case: Synchronous 3DSv2 Request with Frictionless flow if data.status == 'declined' || data.status == 'error' then # Transaction declined no customer action required # Synchronous 3DSv2 Request with Frictionless flow if data.status == 'pending_async' then if data.redirect_url console.log(data.redirect_url_type) console.log(data.redirect_url) if data.threeds_method_url transaction.method_continue(data) .send() .then data -> if data.status == 'approved' then # Transaction APPROVED no customer action required # Test Case: Asynchronous 3DSv2 Request with 3DS-Method and Frictionless flow if data.status == 'pending_async' # Customer action required if data.redirect_url # Test Case: Asynchronous 3DSv2 Request with 3DS-Method Challenge flow # Test Case: Asynchronous 3DSv2 Request with 3DS-Method Fallback flow console.log(data.redirect_url_type) console.log(data.redirect_url) if data.status == 'declined' || data.status == 'error' then # Transaction declined no customer action required # Synchronous 3DSv2 Request with Frictionless flow .catch failure return console.log(data) transaction.sale3d({ transaction_id: 'gnss-js-' + crypto.randomBytes(16).toString('hex') usage : 'Genesis JS Client Automated Request' remote_ip : '118.240.158.6' currency : 'USD' amount : '50' # Return URLS notification_url : 'http://example.com/' return_success_url: 'https://success.ss' return_failure_url: 'https://failure.ff' # Customer Details customer_email: 'email@test.com' customer_phone: '0123456789' # Credit Card Details card_holder: 'Test Tester' card_number: '4012000000060085' # Test Case: Synchronous 3DSv2 Request with Frictionless flow # Test Cases # card_number: '4066330000000004' # Test Case: Asynchronous 3DSv2 Request with 3DS-Method and Frictionless flow # card_number: '4918190000000002' # Test Case: Asynchronous 3DSv2 Request with Challenge flow # card_number: '4938730000000001' # Test Case: Asynchronous 3DSv2 Request with 3DS-Method Challenge flow # card_number: '4901170000000003' # Test Case: Asynchronous 3DSv2 Request with Fallback flow # card_number: '4901164281364345' # Test Case: Asynchronous 3DSv2 Request with 3DS-Method Fallback flow cvv : '123' expiration_month: '01' expiration_year : '2020' # Billing/Invoice Details billing_address : first_name: 'Kamryn' last_name : 'Strosin' address1 : '834 Huels Wells' zip_code : '52036-7047' city : 'Bettyeview' country : 'IQ' # 3DSv2 params # 3DSv2 Method Attributes threeds_v2_params: threeds_method: callback_url: 'https://www.example.com/threeds/threeds_method/callback' control: device_type : 'browser' challenge_window_size: 'full_screen' challenge_indicator : 'preference' purchase: category: 'service' merchant_risk: shipping_indicator : 'verified_address' delivery_timeframe : 'electronic' reorder_items_indicator : 'reordered' pre_order_purchase_indicator: 'merchandise_available' pre_order_date : '19-08-2024' gift_card : 'true' gift_card_count : 99 card_holder_account: creation_date : '19-07-2021' update_indicator : 'more_than_60days' last_change_date : '19-04-2022' password_change_indicator : 'no_change' password_change_date : '04-07-2022' shipping_address_usage_indicator : 'current_transaction' shipping_address_date_first_used : '14-07-2022' transactions_activity_last_24_hours: 2 transactions_activity_previous_year: 10 provision_attempts_last_24_hours : 1 purchases_count_last_6_months : 5 suspicious_activity_indicator : 'no_suspicious_observed' registration_indicator : '30_to_60_days' registration_date : '19-07-2020' browser: accept_header : '*/*' java_enabled : false language : 'en-GB' color_depth : 32 screen_height : 900 screen_width : 1440 time_zone_offset: '-120' user_agent : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36' sdk: interface : 'native' ui_types : ui_type: 'multi_select' application_id : 'fc1650c0-5778-0138-8205-2cbc32a32d65' encrypted_data : 'encrypted-data-here' ephemeral_public_key_pair: 'public-key-pair' max_timeout : 10 reference_number : 'sdk-reference-number-her' }) .send() .then(success) .catch(failure) ```

Standalone ThreedsV2 Method Continue Request.

JavaScript example var failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; transaction.method_continue({ unique_id: 'd6a6aa96292e4856d4a352ce634a4335', amount: '60.00', currency: 'USD', timestamp: '2020-11-10T14:21:37Z' }) .send() .then(success) .catch(failure);
CoffeeScript example genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data transaction.method_continue({ unique_id: 'd6a6aa96292e4856d4a352ce634a4335' amount : '60.00' currency : 'USD' timestamp: '2020-11-10T14:21:37Z' }) .send() .then(success) .catch(failure);

Google Pay Transaction

Processing

JavaScript example ```js var crypto, failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; payment_token = {"protocolVersion":"ECv2","signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d","intermediateSigningKey":{"signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}","signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]}, "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"} transaction.google_pay({ transaction_id: crypto.randomBytes(16).toString('hex'), usage: 'Demo Authorize Transaction', payment_subtype: 'sale', payment_token: payment_token, amount: '100', currency: 'USD', customer_email: 'email@test.com', customer_phone: '0123456789', remote_ip: '245.253.2.12', birth_date: '12-12-2008', billing_address: { first_name: 'John', last_name: 'Doe', address1: '123 Str.', zip_code: '10000', city: 'New York', country: 'US' }, shipping_address: { first_name: 'John', last_name: 'Doe', address1: '123 Str.', zip_code: '10000', city: 'New York', country: 'US' }, notification_url: 'http://my.host.name.tld:1234/notifier', return_success_url: 'http://my.host.name.tld/success', return_failure_url: 'http://my.host.name.tld/failure', }) .send() .then(success) .catch(failure); ```
CoffeeScript example ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data payment_token = {"protocolVersion":"ECv2","signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d","intermediateSigningKey":{"signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}","signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]}, "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"} transaction.google_pay({ transaction_id : crypto.randomBytes(16).toString('hex') usage : 'Demo Authorize Transaction', payment_subtype : 'sale', payment_token : payment_token, amount : '100', currency : 'USD', customer_email : 'email@test.com', customer_phone : '0123456789', remote_ip : '245.253.2.12', birth_date : '12-12-2008', billing_address : first_name: 'John', last_name : 'Doe', address1 : '123 Str.', zip_code : '10000', city : 'New York', country : 'US' shipping_address : first_name: 'John', last_name : 'Doe', address1 : '123 Str.', zip_code : '10000', city : 'New York', country : 'US' notification_url : 'http://my.host.name.tld:1234/notifier', return_success_url: 'http://my.host.name.tld/success', return_failure_url: 'http://my.host.name.tld/failure', }) .send() .then(success) .catch(failure) ```

WPF

JavaScript example ```js var crypto, failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; transaction.wpf_create({ transaction_id: crypto.randomBytes(16).toString('hex'), transaction_types: [ { 'google_pay' : { payment_subtype: 'sale' } } ], usage: 'Genesis JS Client Automated Request', currency: 'EUR', amount: '100', customer_email: 'Clotilde_Hettinger54@hotmail.com', customer_phone: '1-749-394-9321 x93370', notification_url: 'http://my.host.name.tld:1234/notifier', return_success_url: 'http://my.host.name.tld/success', return_failure_url: 'http://my.host.name.tld/failure', return_cancel_url: 'http://my.host.name.tld/cancel' }) .send() .then(success) .catch(failure); ```
CoffeeScript example ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data transaction.wpf_create({ transaction_id : crypto.randomBytes(16).toString('hex'), transaction_types : [ 'google_pay' : payment_subtype: 'sale' ], usage : 'Demo WPF Transaction' description : 'This is my first WPF transaction' amount : '100' currency : 'USD' customer_email : 'email@example.com' customer_phone : '0123456789' notification_url : 'http://my.host.name.tld:1234/notifier' return_success_url: 'http://my.host.name.tld/success' return_failure_url: 'http://my.host.name.tld/failure' return_cancel_url : 'http://my.host.name.tld/cancel' }) .send() .then(success) .catch(failure); ```

Apple Pay Transaction

Processing

JavaScript example ```js var crypto, failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; payment_token = {"paymentData":{"version": "EC_v1","data": "nvV/CyVrVC1jC3nvoYTmw/APqMS3jSdM4/sIoCbnHiqhCWtpVkEWrAkxGqjp1lryX7wtTn07Om7TGyxztYK/KPQM6ajHXDsIpGWUtDAuVFCqzTNWYUukpjkF5cokLPm+0oc1lwDFKLIexW0QmIyKj4WUS3hIyI10zdMAzNCU5BKDto21eVqQaYWyPYDkoAafrIwpYnCUoWFWCQ91Gj0xnIVK9ElaWepAMp6iAXm5DzR+N0A6AwCtxp3AXhP/2A+nTNvemO7eFfkNMaW/yIYPHD+GRDq3gp5yvVNVDzLvAYPoR8iCGuF3YA21sh7Ewoj7M7QO1tSjcPympazC+QUuKl9XQSUXayOrqka6vEbc1ZifotmjKvvmc3nTDaOPoTAPSG+ymBS9EUcd+65/CrdZF4Rdb5vyZEylqB45p3o=","signature": "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","header":{ "ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0Qgk5F6L0FCO1H34M4DLB6yDRHs3k0NeJUgtiQ66ZYBa4RCjlkhFPy63vSCGmeZ9Q19oWDOYSwA9Z3fnYslZCg==","publicKeyHash":"QOmvMaoCNYk5tv+69KC1i2UCFQcOl6LYPIJfYAT+SLQ=","transactionId": "cd9a7d0da9bbca9c87490e5eaeb7d4080c9ab80528248fc3cb70aa3fe47c36cd"}},"paymentMethod":{"displayName":"Visa 0225","network":"Visa","type":"debit"},"transactionIdentifier":"CD9A7D0DA9BBCA9C87490E5EAEB7D4080C9AB80528248FC3CB70AA3FE47C36CD"}; transaction.apple_pay({ transaction_id: crypto.randomBytes(16).toString('hex'), usage: 'Demo Authorize Transaction', payment_subtype: 'sale', payment_token: payment_token, amount: '100', currency: 'USD', customer_email: 'email@test.com', customer_phone: '0123456789', remote_ip: '245.253.2.12', birth_date: '12-12-2008', billing_address: { first_name: 'John', last_name: 'Doe', address1: '123 Str.', zip_code: '10000', city: 'New York', country: 'US' }, shipping_address: { first_name: 'John', last_name: 'Doe', address1: '123 Str.', zip_code: '10000', city: 'New York', country: 'US' } }) .send() .then(success) .catch(failure) ```
CoffeeScript example ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data payment_token = {"paymentData":{"version": "EC_v1","data": "nvV/CyVrVC1jC3nvoYTmw/APqMS3jSdM4/sIoCbnHiqhCWtpVkEWrAkxGqjp1lryX7wtTn07Om7TGyxztYK/KPQM6ajHXDsIpGWUtDAuVFCqzTNWYUukpjkF5cokLPm+0oc1lwDFKLIexW0QmIyKj4WUS3hIyI10zdMAzNCU5BKDto21eVqQaYWyPYDkoAafrIwpYnCUoWFWCQ91Gj0xnIVK9ElaWepAMp6iAXm5DzR+N0A6AwCtxp3AXhP/2A+nTNvemO7eFfkNMaW/yIYPHD+GRDq3gp5yvVNVDzLvAYPoR8iCGuF3YA21sh7Ewoj7M7QO1tSjcPympazC+QUuKl9XQSUXayOrqka6vEbc1ZifotmjKvvmc3nTDaOPoTAPSG+ymBS9EUcd+65/CrdZF4Rdb5vyZEylqB45p3o=","signature": "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","header":{ "ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0Qgk5F6L0FCO1H34M4DLB6yDRHs3k0NeJUgtiQ66ZYBa4RCjlkhFPy63vSCGmeZ9Q19oWDOYSwA9Z3fnYslZCg==","publicKeyHash":"QOmvMaoCNYk5tv+69KC1i2UCFQcOl6LYPIJfYAT+SLQ=","transactionId": "cd9a7d0da9bbca9c87490e5eaeb7d4080c9ab80528248fc3cb70aa3fe47c36cd"}},"paymentMethod":{"displayName":"Visa 0225","network":"Visa","type":"debit"},"transactionIdentifier":"CD9A7D0DA9BBCA9C87490E5EAEB7D4080C9AB80528248FC3CB70AA3FE47C36CD"} transaction.apple_pay({ transaction_id : crypto.randomBytes(16).toString('hex') usage : 'Demo Authorize Transaction' payment_subtype: 'sale' payment_token : payment_token amount : '100' currency : 'USD' customer_email : 'email@test.com' customer_phone : '0123456789' remote_ip : '245.253.2.12' birth_date : '12-12-2008' billing_address: { first_name: 'John' last_name : 'Doe' address1 : '123 Str.' zip_code : '10000' city : 'New York' country : 'US' }, shipping_address: { first_name: 'John' last_name : 'Doe' address1 : '123 Str.' zip_code : '10000' city : 'New Yok' country : 'US' } }) .send() .then(success) .catch(failure) ```

WPF

JavaScript example ```js var crypto, failure, genesis, success, transaction; genesis = require('.lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; transaction.wpf_create({ transaction_id: crypto.randomBytes(16).toString('hex'), transaction_types: [ { 'apple_pay' : { payment_subtype: 'sale' } } ], usage: 'Genesis JS Client Automated Request', currency: 'EUR', amount: '100', customer_email: 'Clotilde_Hettinger54@hotmail.com', customer_phone: '1-749-394-9321 x93370', notification_url: 'http://my.host.name.tld:1234/notifier', return_success_url: 'http://my.host.name.tld/success', return_failure_url: 'http://my.host.name.tld/failure', return_cancel_url: 'http://my.host.name.tld/cancel' }) .send() .then(success) .catch(failure); ```
CoffeeScript example ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data transaction.wpf_create({ transaction_id : crypto.randomBytes(16).toString('hex') transaction_types : [ 'apple_pay' : payment_subtype: 'sale' ], usage : 'Demo WPF Transaction' description : 'This is my first WPF transaction' amount : '100' currency : 'USD' customer_email : 'email@example.com' customer_phone : '0123456789' notification_url : 'http://my.host.name.tld:1234/notifier' return_success_url: 'http://my.host.name.tld/success' return_failure_url: 'http://my.host.name.tld/failure' return_cancel_url : 'http://my.host.name.tld/cancel' }) .send() .then(success) .catch(failure); ```

PayPal Transaction

Processing

JavaScript example ```js var crypto, failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; transaction.pay_pal({ transaction_id : crypto.randomBytes(16).toString('hex'), usage : 'Demo Authorize Transaction', payment_type : 'sale', amount : '100', currency : 'USD', customer_email : 'email@test.com', customer_phone : '0123456789', remote_ip : '245.253.2.12', birth_date : '12-12-2008', billing_address: { first_name: 'John', last_name : 'Doe', address1 : '123 Str.', zip_code : '10000', city : 'New York', country : 'US' }, shipping_address: { first_name: 'John', last_name : 'Doe', address1 : '123 Str.', zip_code : '10000', city : 'New Yok', country : 'US', }, notification_url : 'http://my.host.name.tld/notification', return_success_url : 'http://my.host.name.tld/success', return_failure_url : 'http://my.host.name.tld/failure', return_cancel_url : 'http://my.host.name.tld/cancel', return_pending_url : 'http://my.host.name.tld/pending' }) .send() .then(success) .catch(failure) ```
CoffeeScript example ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data transaction.pay_pal({ transaction_id : crypto.randomBytes(16).toString('hex') usage : 'Demo Authorize Transaction' payment_type : 'sale' amount : '100' currency : 'USD' customer_email : 'email@test.com' customer_phone : '0123456789' remote_ip : '245.253.2.12' birth_date : '12-12-2008' billing_address: first_name: 'John' last_name : 'Doe' address1 : '123 Str.' zip_code : '10000' city : 'New York' country : 'US' shipping_address: first_name: 'John' last_name : 'Doe' address1 : '123 Str.' zip_code : '10000' city : 'New Yok' country : 'US' notification_url : 'http://my.host.name.tld/notification', return_success_url : 'http://my.host.name.tld/success', return_failure_url : 'http://my.host.name.tld/failure', return_cancel_url : 'http://my.host.name.tld/cancel', return_pending_url : 'http://my.host.name.tld/pending' }) .send() .then(success) .catch(failure) ```

Web Payment Form Transaction

var crypto, failure, genesis, success, transaction;

genesis = require('./lib/genesis.js');

crypto = require('crypto');

transaction = new genesis.transaction();

failure = function(reason) {
  return console.log(reason);
};

success = function(data) {
  return console.log(data);
};

transaction.wpf_create({
    locale: 'de',
    transaction_id: crypto.randomBytes(16).toString('hex'),
    usage: 'Demo WPF Transaction',
    description: 'This is my first WPF transaction',
    remote_ip: '127.0.0.1',
    amount: '100',
    currency: 'USD',
    customer_email: 'email@example.com',
    customer_phone: '0123456789',
    notification_url: 'http://my.host.name.tld:1234/notifier',
    return_success_url: 'http://my.host.name.tld/success',
    return_failure_url: 'http://my.host.name.tld/failure',
    return_cancel_url: 'http://my.host.name.tld/cancel',
    billing_address: {
      first_name: 'John',
      last_name: 'Doe',
      address1: '123 Str.',
      zip_code: '10000',
      city: 'New York',
      country: 'US'
    },
    transaction_types: ['authorize3d', 'sale']
  })
  .send()
  .then(success)
  .catch(failure);
genesis = require './lib/genesis.js'
crypto  = require 'crypto'

transaction = new genesis.transaction();

failure = (error, body) ->
    console.log error, body

success = (response, body) ->
   console.log body

transaction.wpf_create({
    locale            : 'de'
    transaction_id    : crypto.randomBytes(16).toString('hex')
    usage             : 'Demo WPF Transaction'
    description       : 'This is my first WPF transaction'
    remote_ip         : '127.0.0.1'
    amount            : '100'
    currency          : 'USD'
    customer_email    : 'email@example.com'
    customer_phone    : '0123456789'
    notification_url  : 'http://my.host.name.tld:1234/notifier'
    return_success_url: 'http://my.host.name.tld/success'
    return_failure_url: 'http://my.host.name.tld/failure'
    return_cancel_url : 'http://my.host.name.tld/cancel'
    billing_address   :
        first_name: 'John'
        last_name : 'Doe'
        address1  : '123 Str.'
        zip_code  : '10000'
        city      : 'New York'
        country   : 'US'
    transaction_types: [
        'authorize3d'
        'sale'
    ]
  })
  .send()
  .then(success)
  .catch(failure)

The example above is going to create a new WPF instance with German (de) locale and allowed transaction types - authorize3d (Authorize w/ 3D-Secure asynchronously) and sale for the amount of $100.

Web Payment Form Transaction with custom attributes in transaction types


transaction.wpf_create({
    locale: 'en',
    transaction_id: crypto.randomBytes(16).toString('hex'),
    usage: 'Demo WPF Transaction',
    description: 'This is my first WPF transaction',
    remote_ip: '127.0.0.1',
    amount: '100',
    currency: 'EUR',
    // Customer Details
    customer_email: 'email@example.com',
    customer_phone: '0123456789',
    notification_url: 'http://my.host.name.tld:1234/notifier',
    return_success_url: 'http://my.host.name.tld/success',
    return_failure_url: 'http://my.host.name.tld/failure',
    return_cancel_url: 'http://my.host.name.tld/cancel',
    // Billing/Invoice Details
    billing_address: {
        first_name: 'John',
        last_name: 'Doe',
        address1: '123 Str.',
        zip_code: '10000',
        city: 'New York',
        country: 'US',
        state: 'California'
    },
    transaction_types: [
        // Authorize
        {
            authorize: {
                // custom attributes bellow aren`t required
                bin: '111111',
                tail: '0000',
                expiration_date: '2020-10'
            }
        },
        // Sale
        {
            sale: {
                // custom attributes bellow aren`t required
                bin: '111',
                tail: '000',
                crypto: 'true',
                fx_rate_id: '123',
            }
        },
        // Trusly Sale
        // Transaction type requires user_id as shown below
        {
            trustly_sale: {
                // return_success_url_target is required for trusly_sale
                return_success_url_target: 'top'
            }
        }
    ],
    user_id: '123456', // Required when trustly_sale transaction type is used
    customer_account_id: 123456,
    payment_method: "eps"
})
    .send()
    .then(success)
    .catch(failure);
genesis = require './lib/genesis.js'
crypto  = require 'crypto'

transaction = new genesis.transaction();

failure = (reason) ->
    console.log reason

success = (data) ->
    console.log data

transaction.wpf_create({
    locale            : 'de'
    transaction_id    : crypto.randomBytes(16).toString('hex')
    usage             : 'Demo WPF Transaction'
    description       : 'This is my first WPF transaction'
    remote_ip         : '127.0.0.1'
    amount            : '100'
    currency          : 'USD'
    customer_email    : 'email@example.com'
    customer_phone    : '0123456789'
    notification_url  : 'http://my.host.name.tld:1234/notifier'
    return_success_url: 'http://my.host.name.tld/success'
    return_failure_url: 'http://my.host.name.tld/failure'
    return_cancel_url : 'http://my.host.name.tld/cancel'
    billing_address   :
        first_name: 'John'
        last_name : 'Doe'
        address1  : '123 Str.'
        zip_code  : '10000'
        city      : 'New York'
        country   : 'US'
        state     : 'California'
    transaction_types: [
        # Authorize
        authorize:
            # custom attributes bellow are not required
            bin: '111111',
            tail: '0000',
            expiration_date: '2020-10'
        # Sale
        sale:
            # custom attributes bellow are not required
            bin: '111',
            tail: '000',
            crypto: 'true',
            fx_rate_id: '123',
        # Trusly Sale
        # Transaction type requires user_id as shown below
        trustly_sale:
            # return_success_url_target is required for trusly_sale
            return_success_url_target: 'top'
    ]
})
.send()
.then(success)
.catch(failure)

Web Payment Form Transaction with business_attributes

var crypto, failure, genesis, success, transaction;

genesis = require('./lib/genesis.js');

crypto = require('crypto');

transaction = new genesis.transaction();

failure = function(reason) {
    return console.log(reason);
};

success = function(data) {
    return console.log(data);
};

transaction.wpf_create({
    locale: 'en',
    transaction_id: crypto.randomBytes(16).toString('hex'),
    usage: 'Demo WPF Transaction',
    description: 'This is my first WPF transaction',
    remote_ip: '127.0.0.1',
    amount: '100',
    currency: 'EUR',
    customer_email: 'email@example.com',
    customer_phone: '0123456789',
    notification_url: 'http://my.host.name.tld:1234/notifier',
    return_success_url: 'http://my.host.name.tld/success',
    return_failure_url: 'http://my.host.name.tld/failure',
    return_cancel_url: 'http://my.host.name.tld/cancel',
    billing_address: {
        first_name: 'John',
        last_name: 'Doe',
        address1: '123 Str.',
        zip_code: '10000',
        city: 'New York',
        country: 'US',
        state: 'California'
    },
    transaction_types: ['authorize', 'sale3d'],
    customer_account_id: 11111,

    // Full list of business attributes
    business_attributes: {
        // Airlines Air Carriers
        flight_arrival_date: '31-12-2021',
        airline_code: '1111',
        flight_ticket_number: '123456789',
        flight_origin_city: 'Sofia',
        flight_destination_city: 'Berlin',
        airline_tour_operator_name: 'Test',

        // Event Management
        event_start_date: '12-10-2021',
        event_end_date: '01-10-2021',
        event_organizer_id: '11111',
        event_id: '321',

        // Furniture
        date_of_order: '12-10-2020',
        delivery_date: '31-12-2020',
        name_of_the_supplier: 'Supplier',

        // Hotels and Real estate rentals
        check_in_date: '12-10-2020',
        check_out_date: '16-10-2020',
        travel_agency_name: 'test',

        // Car, Plane and Boat Rentals
        vehicle_pick_up_date: '11-10-2020',
        vehicle_return_date: '12-10-2020',
        supplier_name: 'Rent a car',

        // Cruise Lines
        cruise_start_date: '12-10-2020',
        cruise_end_date: '12-11-2020',

        // Travel Agencies
        arrival_date: '12-12-2020',
        departure_date: '13-12-2020',
        carrier_code: '333',
        flight_number: '32',
        ticket_number: '111111111111',
        origin_city: 'Berlin',
        destination_city: 'Sofia',
        travel_agency: 'Agency',
        contractor_name: 'Contractor',
        atol_certificate: '123456',
        pick_up_date: '12-10-2020',
        return_date: '13-10-2020',

        // Common
        payment_type: 'deposit' // deposit or balance
    }
})
    .send()
    .then(success)
    .catch(failure);
genesis = require './lib/genesis.js'
crypto  = require 'crypto'

transaction = new genesis.transaction();

failure = (reason) ->
    console.log reason

success = (data) ->
    console.log data

transaction.wpf_create({
    locale            : 'de'
    transaction_id    : crypto.randomBytes(16).toString('hex')
    usage             : 'Demo WPF Transaction'
    description       : 'This is my first WPF transaction'
    remote_ip         : '127.0.0.1'
    amount            : '100'
    currency          : 'USD'
    customer_email    : 'email@example.com'
    customer_phone    : '0123456789'
    notification_url  : 'http://my.host.name.tld:1234/notifier'
    return_success_url: 'http://my.host.name.tld/success'
    return_failure_url: 'http://my.host.name.tld/failure'
    return_cancel_url : 'http://my.host.name.tld/cancel'
    billing_address   :
      first_name: 'John'
      last_name : 'Doe'
      address1  : '123 Str.'
      zip_code  : '10000'
      city      : 'New York'
      country   : 'US'
      state     : 'California'
    transaction_types: ['authorize', 'sale3d']

    # Full list of business attributes
    business_attributes:
      # Airlines Air Carriers
      flight_arrival_date: '31-12-2021',
      airline_code: '1111',
      flight_ticket_number: '123456789',
      flight_origin_city: 'Sofia',
      flight_destination_city: 'Berlin',
      airline_tour_operator_name: 'Test',

      # Event Management
      event_start_date: '12-10-2021',
      event_end_date: '01-10-2021',
      event_organizer_id: '11111',
      event_id: '321',

      # Furniture
      date_of_order: '12-10-2020',
      delivery_date: '31-12-2020',
      name_of_the_supplier: 'Supplier',

      # Hotels and Real estate rentals
      check_in_date: '12-10-2020',
      check_out_date: '16-10-2020',
      travel_agency_name: 'test',

      # Car, Plane and Boat Rentals
      vehicle_pick_up_date: '11-10-2020',
      vehicle_return_date: '12-10-2020',
      supplier_name: 'Rent a car',

      # Cruise Lines
      cruise_start_date: '12-10-2020',
      cruise_end_date: '12-11-2020',

      # Travel Agencies
      arrival_date: '12-12-2020',
      departure_date: '13-12-2020',
      carrier_code: '333',
      flight_number: '32',
      ticket_number: '111111111111',
      origin_city: 'Berlin',
      destination_city: 'Sofia',
      travel_agency: 'Agency',
      contractor_name: 'Contractor',
      atol_certificate: '123456',
      pick_up_date: '12-10-2020',
      return_date: '13-10-2020',

      # Common
      payment_type: 'deposit' # deposit or balance
})
.send()
.then(success)
.catch(failure)

Web Payment Form Transaction with managed_recurring

var crypto, failure, genesis, success, transaction;

genesis = require('./lib/genesis.js');

crypto = require('crypto');

transaction = new genesis.transaction();

failure = function(reason) {
    return console.log(reason);
};

success = function(data) {
    return console.log(data);
};

transaction.wpf_create({
    locale: 'de',
    transaction_id: crypto.randomBytes(16).toString('hex'),
    usage: 'Demo WPF Transaction',
    description: 'This is my first WPF transaction',
    amount: '100',
    currency: 'USD',
    customer_email: 'email@example.com',
    customer_phone: '0123456789',
    notification_url: 'http://my.host.name.tld:1234/notifier',
    return_success_url: 'http://my.host.name.tld/success',
    return_failure_url: 'http://my.host.name.tld/failure',
    return_cancel_url: 'http://my.host.name.tld/cancel',
    billing_address: {
        first_name: 'John',
        last_name: 'Doe',
        address1: '123 Str.',
        zip_code: '10000',
        city: 'New York',
        country: 'US'
    },
    shipping_address: {
        first_name: 'John',
        last_name: 'Doe',
        address1: '123 Str.',
        zip_code: '10000',
        city: 'New York',
        country: 'US'
    },
    transaction_types: [
        {
          init_recurring_sale: {
            managed_recurring: {
              mode: "automatic",
              interval: "days",
              first_date: "2023-12-18",
              time_of_day: 5,
              period: 22,
              amount: 500,
              max_count: 10
            }
          },
        }
    ]
})
genesis = require './lib/genesis.js'
crypto  = require 'crypto'

transaction = new genesis.transaction();

failure = (reason) ->
  console.log reason

success = (data) ->
  console.log data

transaction.wpf_create({
    locale            : 'de'
    transaction_id    : crypto.randomBytes(16).toString('hex')
    usage             : 'Demo WPF Transaction'
    description       : 'This is my first WPF transaction'
    amount            : '100'
    currency          : 'USD'
    customer_email    : 'email@example.com'
    customer_phone    : '0123456789'
    notification_url  : 'http://my.host.name.tld:1234/notifier'
    return_success_url: 'http://my.host.name.tld/success'
    return_failure_url: 'http://my.host.name.tld/failure'
    return_cancel_url : 'http://my.host.name.tld/cancel'
    billing_address   :
      first_name: 'John'
      last_name : 'Doe'
      address1  : '123 Str.'
      zip_code  : '10000'
      city      : 'New York'
      country   : 'US'
      state     : 'CA'
    shipping_address:
      first_name: 'John'
      last_name: 'Doe'
      address1: '123 Str.'
      zip_code: '10000'
      city: 'New York'
      country: 'US'
    transaction_types: [
      init_recurring_sale:
        managed_recurring:
          mode: "automatic"
          interval: "days"
          first_date: "2023-12-18"
          time_of_day: 5
          period: 22
          amount: 500
          max_count: 10
    ],
})
.send()
.then(success)
.catch(failure)

The example above is going to create a new WPF with Init Recurring Sale transaction with managed_recurring attributes.

Travel Data Attributes

Level 3 travel data is supplied as optional data to the standard API request. If the supplied is valid travel data then the transaction will be processed as a travel transaction and will qualify for the travel Incentive rates. Otherwise the transaction will be processed normally as a regular transaction. Note that the travel data will be stored as part of the transaction in all cases.

Travel data is supported for Authorize, Authorize3D, Capture, Sale, Sale3D, InitRecurringSale, InitRecurringSale3D, RecurringSale.

Details ``` travel: { ticket: { ticket_number: '12345', passenger_name: 'John Smith', customer_code: '1', restricted_ticket_indicator: 1, agency_name: 'Agency', agency_code: 'AG001', confirmation_information: 'Confirmation', date_of_issue: '2018-02-01' }, rentals: { car_rental: { purchase_identifier: 12478, class_id: 3, pickup_date: '2018-02-05', renter_name: 'John Smith Example', return_city: 'Varna', return_state: 'VAR', return_country: 'BGR', return_date: '2018-02-06', renter_return_location_id: 12478, customer_code: 1 }, hotel_rental: { purchase_identifier: 12478, arrival_date: 3, departure_date: '2018-02-05', customer_code: 1 } }, charges: { charge: { type: 'MISC' } }, legs: [ { departure_date: '2018-02-01', carrier_code: '2' , service_class: '3', origin_city: 'SOF', destination_city: 'VAR', stopover_code: '1', fare_basis_code: '1', flight_number: 'W6666' }, { departure_date: '2018-02-01', carrier_code: 2, service_class: 3, origin_city: 'VAR', destination_city: 'FRA', stopover_code: 0, fare_basis_code: 1, flight_number: 'W6366' } ], taxes: [ { fee_amount: 1000, fee_type: 'Airport tax' }, { fee_amount: 1000, fee_type: 'Airport tax' } ] } ```

Web Payment Form Transaction with pay_later attributes

The Pay Later functionality in the WPF form provides the ability to choose whether the customer would have the option enabled to delay the payment and complete it later. It also gives the ability to enqueue reminders based on pre-configured values. The reminders include the URL for payment completion as well.

Reminders configuration Up to 3 reminders can be configured for each payment.

Details ```js var crypto, failure, genesis, success, transaction; genesis = require('./lib/genesis.js'); crypto = require('crypto'); transaction = new genesis.transaction(); failure = function(reason) { return console.log(reason); }; success = function(data) { return console.log(data); }; transaction.wpf_create({ locale: 'de', transaction_id: crypto.randomBytes(16).toString('hex'), usage: 'Demo WPF Transaction', description: 'This is my first WPF transaction', amount: '100', currency: 'USD', customer_email: 'email@example.com', customer_phone: '0123456789', notification_url: 'http://my.host.name.tld:1234/notifier', return_success_url: 'http://my.host.name.tld/success', return_failure_url: 'http://my.host.name.tld/failure', return_cancel_url: 'http://my.host.name.tld/cancel', billing_address: { first_name: 'John', last_name: 'Doe', address1: '123 Str.', zip_code: '10000', city: 'New York', country: 'US' }, shipping_address: { first_name: 'John', last_name: 'Doe', address1: '123 Str.', zip_code: '10000', city: 'New York', country: 'US' }, transaction_types: [sale], pay_later: true, reminder_language: 'en', reminders: [ { channel: 'email', after: 40 }, { channel: 'sms', after: 10 } ] }) ```
Details ```coffee genesis = require './lib/genesis.js' crypto = require 'crypto' transaction = new genesis.transaction(); failure = (reason) -> console.log reason success = (data) -> console.log data transaction.wpf_create({ locale : 'de' transaction_id : crypto.randomBytes(16).toString('hex') usage : 'Demo WPF Transaction' description : 'This is my first WPF transaction' amount : '100' currency : 'USD' customer_email : 'email@example.com' customer_phone : '0123456789' notification_url : 'http://my.host.name.tld:1234/notifier' return_success_url: 'http://my.host.name.tld/success' return_failure_url: 'http://my.host.name.tld/failure' return_cancel_url : 'http://my.host.name.tld/cancel' billing_address : first_name: 'John' last_name : 'Doe' address1 : '123 Str.' zip_code : '10000' city : 'New York' country : 'US' state : 'CA' shipping_address: first_name: 'John' last_name: 'Doe' address1: '123 Str.' zip_code: '10000' city: 'New York' country: 'US' transaction_types: ['sale'], pay_later: true, reminder_language: 'en', reminders: [ { channel: 'email', after: 40 }, { channel: 'sms', after: 10 } ] }) .send() .then(success) .catch(failure) ```

Notification Listener

var success, failure, genesis, notification, notification_url;

genesis = require('./lib/genesis.js');

notification = new genesis.notification();

success = function(result) {
  return console.log(result);
};

failure = function(error) {
  return console.log(error);
};

notification.listen(success, failure);

notification_url = notification.getUrl();
genesis = require './lib/genesis.js'

notification = new genesis.notification()

success = (result) =>
  console.log result

failure = (error) =>
  console.log error

notification.listen success, failure

notification_url = notification.getUrl()

The example above would create a notification listener on my.host.name.tld:1234/notifier which you can use as notification handler for async transactions. If a notification is received and its successfully verified against our backend, the callback will be called with details of the transaction you're being notified for.

Handle notifications with separate web server

In case you have already setup web server and do not what to start another. Or you just what to use different one like Express for example.

You can accomplish this by calling handle method in your web server route.

Request and response objects should be enhanced versions of Node’s own request/response objects and support all built-in fields and methods!

genesis = require('./lib/genesis.js');

notification = new genesis.notification();

var bodyParser = require('body-parser'); var urlencodedParser = bodyParser.urlencoded({ extended: true })

router.post('/listen', urlencodedParser, function (request, response) { notification.handle(request, response) .then(console.log) .catch(console.log); });


- CoffeeScript

```coffee
genesis = require './lib/genesis.js'

notification = new genesis.notification()

bodyParser = require 'body-parser'
urlencodedParser = bodyParser.urlencoded({ extended: true })

router.post('/listen', urlencodedParser, (request, response) ->
    notification.handle(request, response)
      .then console.log
      .catch console.log

Response

Success callback

You receive a successful Transaction Execution response in JSON format. The data contains a status.

If the Transaction is Successful the status is one of the following:

If an error occurs during the Transaction Execution the status is one of the following:

Example Transaction Execution with Error ```object { transaction_type: 'authorize3d', status: 'declined', authorization_code: 671842, unique_id: '55b4614e2ffb7677925565431ef83551', transaction_id: '57b1b124e68f69212a40390546e59ca2', response_code: 1, code: 510, technical_message: 'card_number is invalid or missing', message: 'Credit card number is invalid.', mode: 'test', timestamp: '2021-07-29T14:30:53Z', descriptor: 'test', amount: '10.00', currency: 'EUR', sent_to_acquirer: true } ```

Failure callback

Upon received status >= 300 from the Gateway or upon invalid request the following JSON object will be received on the failure callback:

{
  status: "HTTP Status Code"
  message: "Brief explanation about the error"
  response: {
    // Received Response from the server if there is any
  }
}
Example Failure Transaction Execution with Response ```object { status: 401 message: 'Unauthorized', response: { status: 'error', code: 110, technical_message: 'Invalid Authentication', message: '401 Unauthorized: Invalid Authentication!' } } ```
Example Failure Transaction Execution without Response ```object { status: 'ENOTFOUND', message: 'No response received from hostname: examlpe.com', response: undefined } ```

Transaction Types

account_verification
apple_pay
authorize
authorize3d
avs
blacklist
capture
cashu
chargeback
chargeback_by_date
credit
fraud_report
fraud_report_by_date
google_pay
init_recurring
init_recurring_sale3d
online_banking_payin
online_banking_payout
nativa
p24
pay_pal
payout
ppro
poli
reconcile
reconcile_by_date
recurring_sale
refund
retrieval
retrieval_by_date
sale
sale3d
void
wpf_create
wpf_reconcile

Transaction Parameters

wpf_create.transaction_types:

In order to get a full list of required and optional parameters, please consult our API Documentation.

Development

Run mocha tests

npm test

Build the project

npm run cake-build

Watch changed files during development

npm run cake-watch