npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

maksunappi

v2.0.1

Published

A Node.js library for online payments in Finland.

Downloads

6

Readme

maksunappi

Build Status

A Node.js library for online payments in Finland. Includes test configurations for Nordea, DanskeBank, Handelsbanken, OP, Aktia, Ålandsbanken, S-Pankki, Säästöpankki and POP Pankki.

Currently requires Express.

About

Reaktor

From Reaktor with love.

Apply for juicy positions at reaktor.com/careers and prepare for The Culling.

Install

npm install maksunappi

Testing

Run tests with grunt.

Usage and configuration

Basic usage (using default configurations)

var generalOptions = {
  appHandler: app, // an Express application
  hostUrl: 'http://domain.here.com:port', // required for return URLs
  logger : logger //optional winston logger instance
};

var maksunappi = require('maksunappi').create(generalOptions);

Bank configuration

Changing configurations (code example)

var bankOptions = [
  {
    id : 'nordea',
    imgPath : '/path/to/my/image.png',
    vendorId : 'production id',
    checksumKey : 'production key'
  },
  {
    id : 'op',
    name: 'Osuuspankki',
    algorithmType: 'sha256'
  }
];

var maksunappi = require('maksunappi').create(generalOptions, bankOptions);

The following options can only be configured in this initial configuration phase (see "Bank configuration options" below for other options that can be configured either here on on a per-request basis):

  • id - identifier for the bank (this identifies the bank you are about to configure, see below for options)
  • paymentUrl - url for the online payments service
  • imgPath - path for the image used for the HTML form (or "button")
  • checksumKey - vendor specific key used in computing the MAC

Possible values for id are:

| Bank | ID | | ------------- | ------------- | | Aktia | aktia | | Danskebank | danskebank | | Handelsbanken | handelsbanken | | Nordea | nordea | | Osuuspankki | op | | POP Pankki | poppankki | | S-Pankki | spankki | | Säästöpankki | saastopankki | | Ålandsbanken | alandsbanken |

Configuration options with an unrecognized id are ignored.

Bank configuration options

The following table describes the different options you can use to configure banks. These options are then mapped to bank specific form fields. E.g paymentVersion is mapped to 'NET_VERSION' in Aktia's case and to 'VERSIO' in DanskeBank's.

Any of these options may be either set as general options for a bank in the initial configuration or overridden in button options on a per-request basis.

The library performs minimal checks on inputs. Required fields are checked but reference numbers and input lengths are generally not. Depending on the field and bank, not observing the length limits specified in bank specific interface specification documents may or may not have an effect on the success of the request. Failure to provide an input for a required field results in an exception.

M = mandatory, O = optional, - = not in use

| Field | Aktia | Ålandsbanken | Danskebank | Handelsbanken | Nordea | Osuuspankki | POP Pankki | S-Pankki | Säästöpankki | | ------------- | ------------- | ------------- | ---------- | ------------- | ------ | ----------- | ----------- | -------- | ------------ | | paymentVersion| M | M | M | M | M | M | M | M | M | | requestId | M | M | - | M | M | M | M | M | M | | vendorId | M | M | M | M | M | M | M | M | M | | vendorAccount | - | M | - | - | O | - | - | M | - | | vendorName | - | M | - | - | O | - | - | M | - | | language | - | M | O | - | O | - | - | M | - | | amount | M | M | M | M | M | M | M | M | M | | currency | M | M | M | M | M | M | M | M | M | | reference | M | M | M | M | O | M | M | M | M | | dueDate | M | M | M | M | M | O | M | M | M | | messageForBankStatement | - | - | - | - | O | O | - | - | - | | confirm | M | M | - | M | O | O | M | M | M | | keyVersion | - | M | - | - | M | M | - | M | - | | cookie | - | M | - | - | - | - | - | - | - | | algorithmType | - | - | M | - | - | - | - | - | - | | mobile | - | - | - | - | O | - | - | - | - | | messageForWebForm | O | O | - | O | - | O | O | O | O |

Notice that Aktia and Handelsbanken share the same mandatory and optional fields.

Do remember to configure vendorName and vendorAccount for all banks which require them when not using the test credentials (vendorId, checksumKey)!

Input formatting

Option values should be in the following formats:

| Field | Format | Example | Notes | | ------------- | ------------------------ | ----------------- | --------------------------------------------------------------- | | paymentVersion| (convertible to) integer | 3 / "3" / "003" | Is automatically formatted to comply with bank specifications. | | requestId | string of numbers | "201401301400391" | Integer values are fine too (watch out for floating point precision problems). | | vendorId | string | "TAPESHOPID" / "12345678"| | | vendorAccount | string | "448710-126" | | | vendorName | string | "TESTIKAUPPA" | | | language | ISO 693-1 (string) | "FI" / "SV" / "EN"| Note that some banks only support a subset of these languages ("FI"/"SV"). | | amount | floating point / integer | 25 / 50.5 | | | currency | string | "EUR" | | | reference | string | "2014013014003919"| See "Generating reference numbers" below. | | dueDate | string / JavaScript Date | "EXPRESS" / new Date()| See "Additional notes" below | | messageForBankStatement | string | | Is automatically split into rows according to bank specifications. The message may be clipped if too long. Message is shown in the bank statement | | confirm | boolean | true / false | | | keyVersion | (convertible to) integer | | Similar to paymentVersion. | | cookie | boolean | | | | algorithmType | string | 'md5' / 'sha256' | 'md5' is the default for most banks. | | mobile | boolean | | | | messageForWebForm | string | | message is only shown to the buyer in the webform |

Additional notes concerning due dates:

Always use either "EXPRESS" or a JavaScript Date object, not e.g. date strings. "EXPRESS" works with all banks (for DanskeBank, the library converts it into a date). Dates in the past are automatically converted into today's date.

Note that some banks (namely Ålandsbanken and S-Pankki) only allow EXPRESS payments.

Mapping to form fields

The following table describes the mapping from options to bank specific form fields, if you need to refer to the original specifications for help with parameters.

| Field | Aktia | Ålandsbanken | Danskebank | Handelsbanken | Nordea | Osuuspankki | POP Pankki | S-Pankki | Säästöpankki | | ------------- | ------------- | --------------- | ---------- | ------------- | ------------------- | --------------- | ------------- | --------------- | ------------- | | paymentVersion| NET_VERSION | AAB_VERSION | VERSIO | NET_VERSION | SOLOPMT_VERSION | VERSIO | NET_VERSION | AAB_VERSION | NET_VERSION | | requestId | NET_STAMP | AAB_STAMP | - | NET_STAMP | SOLOPMT_STAMP | MAKSUTUNNUS | NET_STAMP | AAB_STAMP | NET_STAMP | | vendorId | NET_SELLER_ID | AAB_RCV_ID | KNRO | NET_SELLER_ID | SOLOPMT_RCV_ID | MYYJA | NET_SELLER_ID | AAB_RCV_ID | NET_SELLER_ID | | vendorAccount | - | AAB_RCV_ACCOUNT | - | - | SOLOPMT_RCV_ACCOUNT | - | - | AAB_RCV_ACCOUNT | - | | vendorName | - | AAB_RCV_NAME | - | - | SOLOPMT_RCV_NAME | - | - | AAB_RCV_NAME | - | | language | - | AAB_LANGUAGE | lng | - | SOLOPMT_LANGUAGE | - | - | AAB_LANGUAGE | - | | amount | NET_AMOUNT | AAB_AMOUNT | SUMMA | NET_AMOUNT | SOLOPMT_AMOUNT | SUMMA | NET_AMOUNT | AAB_AMOUNT | NET_AMOUNT | | currency | NET_CUR | AAB_CUR | VALUUTTA | NET_CUR | SOLOPMT_CUR | VALUUTTALAJI | NET_CUR | AAB_CUR | NET_CUR | | reference | NET_REF | AAB_REF | VIITE | NET_REF | SOLOPMT_REF | VIITE | NET_REF | AAB_REF | NET_REF | | dueDate | NET_DATE | AAB_DATE | ERAPAIVA | NET_DATE | SOLOPMT_DATE | ERAPVM | NET_DATE | AAB_DATE | NET_DATE | | messageForBankStatement | - | - | - | - | SOLOPMT_MSG | VIEST1 / VIEST2 | - | - | - | | confirm | NET_CONFIRM | AAB_CONFIRM | - | NET_CONFIRM | SOLOPMT_CONFIRM | VAHVISTUS | NET_CONFIRM | AAB_CONFIRM | NET_CONFIRM | | keyVersion | - | AAB_KEYVERS | - | - | SOLOPMT_KEYVERS | TARKISTE-VERSIO | - | AAB_KEYVERS | - | | cookie | - | BC_UseBVCookie | - | - | - | - | - | - | - | | algorithmType | - | - | ALG | - | - | - | - | - | - | | mobile | - | - | - | - | SOLOPMT_PMTTYPE | - | - | - | - | | messageForWebForm |NET_MSG | AAB_MSG | - | NET_MSG | - | VIESTI | NET_MSG | AAB_MSG | NET_MSG |

Create payment HTML forms for configured banks

var requestId = "123456789876543";
var referenceNum = <generate reference here>; // see "Generating reference numbers" below
var options = {
                requestId: requestId,
                amount: 25,
                messageForBankStatement: "Lorem ipsum dolor sit amet...",
                reference: referenceNum,
                language: 'FI'
              };

var buttonHtml = maksunappi.paymentButton('nordea', options);

...or if you just want the request parameters without generating any HTML:

var params = maksunappi.buildRequestParams('nordea', options);

Generating reference numbers / check numbers

Finnish reference number:

var numericIdentifier = '1234556789'; // e.g. a timestamp + an id
var referenceNumber = maksunappi.referenceNumbers.toFinnishPaymentReference(numericIdentifier);

International RF reference number (might not be supported by all banks):

var referenceNumber = maksunappi.referenceNumbers.toRFReference(finnishReferenceNumber);

Usually if the bank requires both a requestId and a reference, you should use the requestId as the basis (numericIdentifier) for the reference number.

Get a listing of all configured banks (IDs)

var banks = maksunappi.banks
// => ['danskebank', 'handelsbanken', 'nordea',
//     'op', 'aktia', 'alandsbanken', 'spankki']

Response handling

The module binds paths /epayments/ok/<bank id> (GET and POST, for all bank ids), /epayments/cancel (only GET) and /epayments/reject (only GET) to the given Express app for use as return urls.

Response handling is event based.

maksunappi.on('success', function (request, response, data) {
  // Payment was successful and the customer returned to the site.
  // Normalized query data can be accessed in the data parameter.
  // Note: for many banks, the query string is empty unless the "confirm"
  // parameter is set to true.
});

maksunappi.on('mac-check-failed', function (request, response, data) {
  // Same as above but MAC check failed, so the data was faulty.
});

maksunappi.on('cancel', function (request, response) {
  // User cancelled the payment.
});

maksunappi.on('reject', function (request, response) {
  // The payment was rejected by the bank.
});

Normalized response data

The normalized query string data contains the following fields:

X = present, - = not present

| Field | Aktia | Ålandsbanken | Danskebank | Handelsbanken | Nordea | Osuuspankki | POP Pankki | S-Pankki | Säästöpankki | | ------------- | ------------- | ------------- | ---------- | ------------- | ------ | ----------- | ------------- | -------- | ------------- | | version | X | X | X | X | X | X | X | X | X | | requestId | X | X | - | X | X | X | X | X | X | | reference | X | X | X | X | X | X | X | X | X | | archivedId | X | X | - | X | X | X | X | X | X | | mac | X | X | X | X | X | X | X | X | X | | algorithm | X | - | - | X | - | - | X | - | X | | macVersion | - | - | - | - | - | X | - | - | - | | currency | - | - | X | - | - | - | - | - | - | | vendorId | - | - | X | - | - | - | - | - | - | | dueDate | - | - | X | - | - | - | - | - | - | | paymentStatus | - | - | X | - | - | - | - | - | - | | paymentSum | - | - | X | - | - | - | - | - | - | | paymentMethod | - | - | X | - | - | - | - | - | - |

Version numbers (version, macVersion) are converted to integers in the normalized data.

Sample application

See sample/app.js for a simple usage example. Run the sample app locally with node sample/start-sample.js.