{"id":28936166,"url":"https://github.com/aalfiann/midtrans-payment","last_synced_at":"2025-08-16T19:07:31.418Z","repository":{"id":57296909,"uuid":"200001766","full_name":"aalfiann/midtrans-payment","owner":"aalfiann","description":"Midtrans Payment Gateway library for NodeJS","archived":false,"fork":false,"pushed_at":"2024-12-03T14:31:46.000Z","size":103,"stargazers_count":10,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-23T09:51:36.875Z","etag":null,"topics":["midtrans","midtrans-nodejs","payment","payment-gateway"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aalfiann.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-08-01T07:37:44.000Z","updated_at":"2024-12-03T14:39:26.000Z","dependencies_parsed_at":"2022-09-01T08:40:51.039Z","dependency_job_id":null,"html_url":"https://github.com/aalfiann/midtrans-payment","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/aalfiann/midtrans-payment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalfiann%2Fmidtrans-payment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalfiann%2Fmidtrans-payment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalfiann%2Fmidtrans-payment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalfiann%2Fmidtrans-payment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aalfiann","download_url":"https://codeload.github.com/aalfiann/midtrans-payment/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aalfiann%2Fmidtrans-payment/sbom","scorecard":{"id":158786,"data":{"date":"2025-08-11","repo":{"name":"github.com/aalfiann/midtrans-payment","commit":"44cc8b97de069f04768cecec1bae7b70921b69e2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-16T12:44:33.902Z","repository_id":57296909,"created_at":"2025-08-16T12:44:33.902Z","updated_at":"2025-08-16T12:44:33.902Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270757489,"owners_count":24640090,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-16T02:00:11.002Z","response_time":91,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["midtrans","midtrans-nodejs","payment","payment-gateway"],"created_at":"2025-06-22T20:07:49.441Z","updated_at":"2025-08-16T19:07:31.410Z","avatar_url":"https://github.com/aalfiann.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# midtrans-payment  \r\n![Types](https://img.shields.io/npm/types/midtrans-payment)\r\n[![npm version](https://img.shields.io/npm/v/midtrans-payment.svg?style=flat-square)](https://www.npmjs.org/package/midtrans-payment)\r\n[![CircleCI](https://dl.circleci.com/status-badge/img/gh/aalfiann/midtrans-payment/tree/master.svg?style=svg)](https://dl.circleci.com/status-badge/redirect/gh/aalfiann/midtrans-payment/tree/master)\r\n[![Known Vulnerabilities](https://snyk.io//test/github/aalfiann/midtrans-payment/badge.svg?targetFile=package.json)](https://snyk.io//test/github/aalfiann/midtrans-payment?targetFile=package.json)\r\n![NPM download/month](https://img.shields.io/npm/dm/midtrans-payment.svg)\r\n![NPM download total](https://img.shields.io/npm/dt/midtrans-payment.svg)  \r\nMidtrans Payment Gateway library for NodeJS\r\n\r\n## Features\r\n- Async/Await and Promise Support\r\n- Typescript Support\r\n- Built-in method\r\n- Easy to Customize\r\n\r\n## Install using NPM\r\n```bash\r\n$ npm install midtrans-payment\r\n```\r\n\r\n## Usage\r\nThis library was created refer to MidTrans technical documentation version 3.48.0.  \r\nPlease see:  \r\n- [SNAP Docs](https://snap-docs.midtrans.com/)\r\n- [API Docs](http://api-docs.midtrans.com/)\r\n\r\n### Set Config\r\n```javascript\r\nvar MidTrans = require('midtrans-payment');\r\n\r\nvar config = {\r\n  client_key: \"YOUR_CLIENT_KEY\",\r\n  server_key: \"YOUR_SERVER_KEY\",\r\n  mode: \"\"    // you can set to sandbox or production. Default is sandbox if empty.\r\n};\r\n```\r\n\r\n### SNAP\r\n#### Example to create Transactions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('snap').action('transactions')\r\n  .transaction_details('INV001',2000)\r\n  .item_details('Midtrans Bear',1000,1,'Kid Toys')                //optional\r\n  .item_details('Midtrans Cat',1000,1,'Kid Toys')                 //optional\r\n  .customer_details('John','Doe','john.doe@gmail.com','+62856')   //optional\r\n  .billing_address('John','Doe','john.doe@gmail.com','+62856')    //optional\r\n  .shipping_address('John','Doe','john.doe@gmail.com','+62856')   //optional\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n### API\r\n#### Example to create API Charge Bank Transfer with Bank Permata\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api').action('charge')\r\n  .transaction_details('INV002',2000)\r\n  .item_details('Midtrans Bear',1000,1,'Kid Toys')                //optional\r\n  .item_details('Midtrans Cat',1000,1,'Kid Toys')                 //optional\r\n  .customer_details('John','Doe','john.doe@gmail.com','+62856')   //optional\r\n  .billing_address('John','Doe','john.doe@gmail.com','+62856')    //optional\r\n  .shipping_address('John','Doe','john.doe@gmail.com','+62856')   //optional\r\n  .add('payment_type','bank_transfer')\r\n  .add('bank_transfer',{\r\n    bank: \"permata\",\r\n    va_number: \"1234567890\",\r\n    permata: {\r\n      recipient_name: \"SUDARSONO\"\r\n    }\r\n  })\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\nPromise\r\n```javascript\r\nmdt.sendAsync().then(res =\u003e {\r\n  console.log(res.body);\r\n}).catch(err =\u003e {\r\n  console.log(err);\r\n});\r\n```\r\n\r\nAsync Await\r\n```javascript\r\nconst res = await mdt.sendAsync();\r\nif(res) {\r\n  console.log(res.body);\r\n} else {\r\n  console.log(res);\r\n}\r\n```\r\n\r\n\r\n#### Example Get Credit Card Token\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\n\r\nvar payload = {\r\n  gross_amount: 10000,\r\n  card_number: '4811 1111 1111 1114',\r\n  card_exp_month: 12,\r\n  card_exp_year: 2019,\r\n  card_cvv: 123\r\n};\r\n\r\nmdt.type('api').action('token',payload)\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to create API Charge Credit Card\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api').action('charge')\r\n  .transaction_details('INV003',2000)\r\n  .item_details('Midtrans Bear',1000,1,'Kid Toys')                //optional\r\n  .item_details('Midtrans Cat',1000,1,'Kid Toys')                 //optional\r\n  .customer_details('John','Doe','john.doe@gmail.com','+62856')   //optional\r\n  .billing_address('John','Doe','john.doe@gmail.com','+62856')    //optional\r\n  .shipping_address('John','Doe','john.doe@gmail.com','+62856')   //optional\r\n  .add('payment_type','credit_card')\r\n  .add('credit_card',{\r\n    token_id: \"\u003cyou must call API to get credit card token first\u003e\"\r\n  })\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to get Transaction Status\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('status','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to get Transaction Status B2B\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('status/b2b','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to get Transaction Status B2B with pagination\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('status/b2b','INV001',{page:0,per_page:10})\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to APPROVE Transaction\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('approve','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to DENY Transaction\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('deny','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to CANCEL Transaction\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('cancel','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to EXPIRE Transaction\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('expire','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to REFUND Transaction\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('refund','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to REFUND DIRECT Transaction\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('refund/online/direct','INV001')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Capture Transactions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api').action('capture')\r\n  .add('transaction_id','be4f3e44-d6ee-4355-8c64-c1d1dc7f4590')\r\n  .add('gross_amount',145000)\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Card Register\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\n\r\nvar payload = {\r\n  card_number: '4811222233331114',\r\n  card_exp_month: 12,\r\n  card_exp_year: 2019,\r\n  card_cvv: 123\r\n};\r\n\r\nmdt.type('api')    //you can set type with snap or api\r\n  .action('card/register',payload)\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Point Inquiry\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api').action('point_inquiry','123',{gross_amount:1000})\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to BIN API\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api').action('bins','455633')\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example create body request manually\r\nIf our methods doesn't fit in your situation. You're able to build your custom body request.\r\n\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api').action('charge')\r\n  .add('payment_type','bank_transfer')\r\n  .add('transaction_details',{\r\n    gross_amount: 44000,\r\n    order_id: \"order-101c\"\r\n  })\r\n  .add('customer_details',{\r\n    email: \"noreply@example.com\",\r\n    first_name: \"budi\",\r\n    last_name: \"utomo\",\r\n    phone: \"+6281 1234 1234\"\r\n  })\r\n  .add('item_details',[{\r\n      id: \"item01\",\r\n      price: 21000,\r\n      quantity: 1,\r\n      name: \"Ayam Zozozo\"\r\n    },\r\n    {\r\n      id: \"item02\",\r\n      price: 23000,    \r\n      quantity: 1,\r\n      name: \"Ayam Xoxoxo\"\r\n    }\r\n  ])\r\n  .add('bank_transfer',{\r\n    bank: \"bca\",\r\n    va_number: \"12345678901\",\r\n    free_text: {\r\n      inquiry: [{\r\n        id: \"Your Custom Text in ID language\",\r\n        en: \"Your Custom Text in EN language\"\r\n      }],\r\n      payment: [{\r\n        id: \"Your Custom Text in ID language\",\r\n        en: \"Your Custom Text in EN language\"\r\n      }]\r\n    }\r\n  })\r\n  .send(function(response) {\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n### RECURRING API\r\n#### Example to Create Subscriptions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')\r\n  .action('subscriptions')\r\n  .subscriptions('SUB1',1000,'IDR','credit_card','yourtoken',1)\r\n  .send(function(response){\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Find Subscriptions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')\r\n  .action('subscriptions','SUB1')\r\n  .send(function(response){\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Enable Subscriptions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')\r\n  .do('enable').action('subscriptions','SUB1')\r\n  .send(function(response){\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Disable Subscriptions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')\r\n  .do('disable').action('subscriptions','SUB1')\r\n  .send(function(response){\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example to Update Subscriptions\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')\r\n  .do('update').action('subscriptions','SUB1')\r\n  .subscriptions('SUB1',2000,'IDR','credit_card','yourtoken',1)\r\n  .send(function(response){\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n#### Example create body request for subscriptions manually\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nmdt.type('api')\r\n  .action('subscriptions')\r\n  .add('name','SUB1')\r\n  .add('amount','2000')\r\n  .add('currency','IDR')\r\n  .add('payment_type','credit_card')\r\n  .add('token','yourtoken')\r\n  .add('interval',1)\r\n  .send(function(response){\r\n    console.log(response.body);\r\n  });\r\n```\r\n\r\n### Response\r\nWe use [unirest](http://unirest.io/nodejs.html) library for handling call API to MidTrans.\r\n\r\n### Available methods\r\nIf you want to know all available methods in this MidTrans Payment library\r\n```javascript\r\nvar mdt = new MidTrans(config);\r\nconsole.log(mdt.showAllMethods(mdt));\r\n```\r\n\r\n#### Main methods\r\n- `type(name)`                                  this is to set SNAP or API  \r\n- `do(name)`                                    this is to set update|enable|disable for subscriptions only  \r\n- `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`  \r\n- `add(name,data)`                              this is to add new key for body request object  \r\n- `send(callback)`                              this is to send request to MidTrans endpoint API (Callback based)  \r\n- `sendAsync()`                                 this is to send request to MidTrans endpoint API (Promise based)  \r\n\r\n#### Shortcut methods\r\nWe provide a shortcut methods for you to make easier create common body request\r\n- `subscriptions(name,amount,currency,payment_type,token,interval)`  \r\n- `transaction_details(order_id,amount)`  \r\n- `item_details(name,price,quantity,brand='',category='',merchant_name='',tenor='',code_plan='',mid='')`  \r\n- `customer_details(first_name='',last_name='',email='',phone='')`  \r\n- `billing_address(first_name='',last_name='',email='',phone='',address='',city='',postal_code='',country_code='')`\r\n- `shipping_address(first_name='',last_name='',email='',phone='',address='',city='',postal_code='',country_code='')`\r\n\r\n#### Helper methods  \r\n- `remove(name)`      this will delete the key in body request object  \r\n- `clean()`           this will cleanup the body request object  \r\n- `encode(data)`      this will encode {string|any) to base64 string  \r\n- `decode(data)`      this will decode base64 string to original string  \r\n\r\n\r\n### Additional Feature\r\nFor all additional feature like create `custom_field`, `custom_expiry`, `enabled_payments`, etc.  \r\nWe don't create that because we want this library always lightweight and stable when MidTrans add another new feature again.  \r\n\r\nBut you can still use additional feature with this way:\r\n```javascript\r\n\r\n// if you want to add enabled_payments in snap transaction\r\n.add('enabled_payments',[ \"credit_card\", \"permata_va\", \"bca_va\", \"bni_va\"])\r\n\r\n// if you want to add expiry in snap transactions\r\n.add('expiry',{\r\n  start_time: \"2018-12-13 18:11:08 +0700\",\r\n  unit: \"minutes\",\r\n  duration: 1\r\n})\r\n\r\n// if you want to add custom_expiry in API charge\r\n.add('custom_expiry',{\r\n  order_time: \"2017-04-13 18:11:08 +0700\",\r\n  expiry_duration: 180,\r\n  unit: \"minute\"\r\n})\r\n```\r\n\r\n### Unit Test\r\nIf you want to play arround with testing\r\n```\r\nnpm test\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faalfiann%2Fmidtrans-payment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faalfiann%2Fmidtrans-payment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faalfiann%2Fmidtrans-payment/lists"}