midtrans-payment

Midtrans Payment Gateway library for NodeJS

Usage no npm install needed!

<script type="module">
  import midtransPayment from 'https://cdn.skypack.dev/midtrans-payment';
</script>

README

midtrans-payment

NPM

npm version Build Status Coverage Status Known Vulnerabilities NPM download/month NPM download total
Midtrans Payment Gateway library for NodeJS

Install using NPM

$ npm install midtrans-payment

Usage

This library was created refer to MidTrans technical documentation version 3.48.0.
Please see:

Set Config

var MidTrans = require('midtrans-payment');

var config = {
    client_key: "YOUR_CLIENT_KEY",
    server_key: "YOUR_SERVER_KEY",
    mode: ""    // you can set to sandbox or production. Default is sandbox if empty.
};

SNAP

Example to create Transactions

var mdt = new MidTrans(config);
mdt.type('snap').action('transactions')
    .transaction_details('INV001',2000)
    .item_details('Midtrans Bear',1000,1,'Kid Toys')                //optional
    .item_details('Midtrans Cat',1000,1,'Kid Toys')                 //optional
    .customer_details('John','Doe','john.doe@gmail.com','+62856')   //optional
    .billing_address('John','Doe','john.doe@gmail.com','+62856')    //optional
    .shipping_address('John','Doe','john.doe@gmail.com','+62856')   //optional
    .send(function(response) {
        console.log(response.body);
    });

API

Example to create API Charge Bank Transfer with Bank Permata

var mdt = new MidTrans(config);
mdt.type('api').action('charge')
    .transaction_details('INV002',2000)
    .item_details('Midtrans Bear',1000,1,'Kid Toys')                //optional
    .item_details('Midtrans Cat',1000,1,'Kid Toys')                 //optional
    .customer_details('John','Doe','john.doe@gmail.com','+62856')   //optional
    .billing_address('John','Doe','john.doe@gmail.com','+62856')    //optional
    .shipping_address('John','Doe','john.doe@gmail.com','+62856')   //optional
    .add('payment_type','bank_transfer')
    .add('bank_transfer',{
        bank: "permata",
        va_number: "1234567890"
    })
    .send(function(response) {
        console.log(response.body);
    });

Example Get Credit Card Token

var mdt = new MidTrans(config);

var payload = {
    gross_amount:10000,
    card_number:'4811 1111 1111 1114',
    card_exp_month:12,
    card_exp_year:2019,
    card_cvv:123
};

mdt.type('api').action('token',payload)
    .send(function(response) {
        console.log(response.body);
    });

Example to create API Charge Credit Card

var mdt = new MidTrans(config);
mdt.type('api').action('charge')
    .transaction_details('INV003',2000)
    .item_details('Midtrans Bear',1000,1,'Kid Toys')                //optional
    .item_details('Midtrans Cat',1000,1,'Kid Toys')                 //optional
    .customer_details('John','Doe','john.doe@gmail.com','+62856')   //optional
    .billing_address('John','Doe','john.doe@gmail.com','+62856')    //optional
    .shipping_address('John','Doe','john.doe@gmail.com','+62856')   //optional
    .add('payment_type','credit_card')
    .add('credit_card',{
        token_id: "<you must call API to get credit card token first>"
    })
    .send(function(response) {
        console.log(response.body);
    });

Example to get Transaction Status

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('status','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to get Transaction Status B2B

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('status/b2b','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to get Transaction Status B2B with pagination

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('status/b2b','INV001',{page:0,per_page:10})
    .send(function(response) {
        console.log(response.body);
    });

Example to APPROVE Transaction

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('approve','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to DENY Transaction

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('deny','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to CANCEL Transaction

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('cancel','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to EXPIRE Transaction

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('expire','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to REFUND Transaction

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('refund','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to REFUND DIRECT Transaction

var mdt = new MidTrans(config);
mdt.type('api')    //you can set type with snap or api
    .action('refund/online/direct','INV001')
    .send(function(response) {
        console.log(response.body);
    });

Example to Capture Transactions

var mdt = new MidTrans(config);
mdt.type('api').action('capture')
    .add('transaction_id','be4f3e44-d6ee-4355-8c64-c1d1dc7f4590')
    .add('gross_amount',145000)
    .send(function(response) {
        console.log(response.body);
    });

Example to Card Register

var mdt = new MidTrans(config);

var payload = {
    card_number:'4811222233331114',
    card_exp_month:12,
    card_exp_year:2019,
    card_cvv:123
};

mdt.type('api')    //you can set type with snap or api
    .action('card/register',payload)
    .send(function(response) {
        console.log(response.body);
    });

Example to Point Inquiry

var mdt = new MidTrans(config);
mdt.type('api').action('point_inquiry','123',{gross_amount:1000})
    .send(function(response) {
        console.log(response.body);
    });

Example to BIN API

var mdt = new MidTrans(config);
mdt.type('api').action('bins','455633')
    .send(function(response) {
        console.log(response.body);
    });

Example create body request manually

If our methods doesn't fit in your situation. You're able to build your custom body request.

var mdt = new MidTrans(config);
mdt.type('api').action('charge')
    .add('payment_type','bank_transfer')
    .add('transaction_details',{
        gross_amount: 44000,
        order_id: "order-101c"
    })
    .add('customer_details',{
        email: "noreply@example.com",
        first_name: "budi",
        last_name: "utomo",
        phone: "+6281 1234 1234"
    })
    .add('item_details',[{
            id: "item01",
            price: 21000,
            quantity: 1,
            name: "Ayam Zozozo"
        },
        {
            id: "item02",
            price: 23000,    
            quantity: 1,
            name: "Ayam Xoxoxo"
        }
    ])
    .add('bank_transfer',{
        bank: "bca",
        va_number: "12345678901",
        free_text: {
            inquiry: [{
                id: "Your Custom Text in ID language",
                en: "Your Custom Text in EN language"
            }],
            payment: [{
                id: "Your Custom Text in ID language",
                en: "Your Custom Text in EN language"
            }]
        }
    })
    .send(function(response) {
        console.log(response.body);
    });

RECURRING API

Example to Create Subscriptions

var mdt = new MidTrans(config);
    mdt.type('api')
        .action('subscriptions')
        .subscriptions('SUB1',1000,'IDR','credit_card','yourtoken',1)
        .send(function(response){
            console.log(response.body);
        });

Example to Find Subscriptions

var mdt = new MidTrans(config);
    mdt.type('api')
        .action('subscriptions','SUB1')
        .send(function(response){
            console.log(response.body);
        });

Example to Enable Subscriptions

var mdt = new MidTrans(config);
    mdt.type('api')
        .do('enable').action('subscriptions','SUB1')
        .send(function(response){
            console.log(response.body);
        });

Example to Disable Subscriptions

var mdt = new MidTrans(config);
    mdt.type('api')
        .do('disable').action('subscriptions','SUB1')
        .send(function(response){
            console.log(response.body);
        });

Example to Update Subscriptions

var mdt = new MidTrans(config);
    mdt.type('api')
        .do('update').action('subscriptions','SUB1')
        .subscriptions('SUB1',2000,'IDR','credit_card','yourtoken',1)
        .send(function(response){
            console.log(response.body);
        });

Example create body request for subscriptions manually

var mdt = new MidTrans(config);
    mdt.type('api')
        .action('subscriptions')
        .add('name','SUB1')
        .add('amount','2000')
        .add('currency','IDR')
        .add('payment_type','credit_card')
        .add('token','yourtoken')
        .add('interval',1)
        .send(function(response){
            console.log(response.body);
        });

Response

We use unirest library for handling call API to MidTrans.

Available methods

If you want to know all available methods in this MidTrans Payment library

var mdt = new MidTrans(config);
console.log(mdt.showAllMethods(mdt));

Main methods

  • type(name) this is to set SNAP or API
  • do(name) this is to set update|enable|disable for subscriptions only
  • action(name,data='',additional_payload='') this to set action API feature. Ex: charge|approve|deny|cancel|expiry|point_inquiry|bins|subscriptions|status|status/b2b|refund|refund/online/direct|card/register
  • add(name,data) this is to add new key for body request object
  • send(callback) this is to send request to MidTrans endpoint API

Shortcut methods

We provide a shortcut methods for you to make easier create common body request

  • subscriptions(name,amount,currency,payment_type,token,interval)
  • transaction_details(order_id,amount)
  • item_details(name,price,quantity,brand='',category='',merchant_name='',tenor='',code_plan='',mid='')
  • customer_details(first_name='',last_name='',email='',phone='')
  • billing_address(first_name='',last_name='',email='',phone='',address='',city='',postal_code='',country_code='')
  • shipping_address(first_name='',last_name='',email='',phone='',address='',city='',postal_code='',country_code='')

Helper methods

  • remove(name) this will delete the key in body request object
  • clean() this will cleanup the body request object
  • encode(data) this will encode {string|any) to base64 string
  • decode(data) this will decode base64 string to original string

Additional Feature

For all additional feature like create custom_field, custom_expiry, enabled_payments, etc.
We don't create that because we want this library always lightweight and stable when MidTrans add another new feature again.

But you can still use additional feature with this way:


// if you want to add enabled_payments in snap transaction
.add('enabled_payments',[ "credit_card", "permata_va", "bca_va", "bni_va"])

// if you want to add expiry in snap transactions
.add('expiry',{
    start_time: "2018-12-13 18:11:08 +0700",
    unit: "minutes",
    duration: 1
})

// if you want to add custom_expiry in API charge
.add('custom_expiry',{
    order_time: "2017-04-13 18:11:08 +0700",
    expiry_duration: 180,
    unit: "minute"
})

Unit Test

If you want to play arround with testing

npm test