Daimyo: Samurai payment gateway integration library
v0.1.5
Created at Herd Hound
Copyright (c)2011, by Branko Vukelic branko@herdhound.com.
Some rights reserved.
Licensed under MIT license (see
LICENSE)
Overview
Daimyo (pronounced as dah-e-myoh) is a client library for the
Samurai payment gateway from
Fee Fighters. By the time 1.0 release is made,
Daimyo will support all of Samurai's API, but the current immediate goal is to
support the sale transactions and provide robust error reporting facilities.
Status
For now, Daimyo is used in production at
Herd Hound. It is still being polished for prime
time, but the core functionality should work as documented/expected since
v0.0.7. Keep track of changes on Github, and keep an eye on the issue tracker
there.
0.1.5 (latest)
- Transactions will now return AVS results as info messages. The actual
messages returend by Daimyo will have the AVS result code prepended.
0.1.4
- Fixed bad API URL in transaction module
0.1.3
- Changed API URL for Ashigaru
0.1.2
- Prevent Daimyo from crashing when Samurai responds with HTTP 500.
0.1.1
- Payment token (card object) is no longer required for processing
transactions that do not use them (credit, void).
0.1.0
- Fixed issue where
_check
token verification would fail for credit and
void transaction because Samurai does not honor custom data for those
transaction types.
0.0.9
- samurai/developers/api_reference#processing-payments-complex
0.0.8
0.0.7
- Resolved issue with
success
flag in transaction responses.
- Ashigaru now supports
sandbox
parameter for creating sandbox payment
methods.
- Fixed failing tests which weren't updated to reflect the changes in 0.0.6
API. The 0.0.6 version of tests are expected to fail (see issue #15), but
that doesn't affect correct behavior of documented API.
0.0.6
- Fixed
daimyo.Card
constructor not handling custom data.
- Removed
card.method.custom
which was returned after loading a payment
method, and which always contained unused, empty object.
- Fixed previously broken
checkamd
makefile target.
- Fixed Ashigaru not properly handling custom field.
- Made Ashigaru's timeout checking more robust.
- Fixed Daimyo crashing looking for messages in wrong places.
0.0.5
- Prevents crash when invalid token is passed to daimyo.Card constructor.
- If a token is provided, but it's invalid, an error will be thrown. Previous
behavior was that it is completely ignored if invalid.
daimyo.Card
constructor will throw a proper DaimyoError
on errors,
instead of generic Error
object as in previous versions.
0.0.4
allowedCurrencies
setting which limits the currencies that can be used
transaciton.Transaction.process()
will check allowed currencies and block
transactions that use disallowed currency.
transaction.Transaction.process()
no longer throws exceptions. All errors
are passed to the callback instead.
- Ashigaru now supports the
custom
field.
checkamd
make target now generates file with version number.
0.0.3
- Tamper-proofed all properties set with accessors in
daimyo.Card
and
transaction.Transaction
objects.
- Made
data
and path
properties on transaction.Transaction
objects
set-once properties similar to configuration locking.
- Custom fields are implemented in both
daimyo.Card
and
transaction.Transaction
objects. They can store any JSON-serializable
object, and that will be stored in Samurai gateway, and restored later with
methods like card.load()
or when transaction is completed.
- All transaction requests embed a SHA1 hexdigest of 100-character random
string, which is checked when the response is received. All transactions
will fail the integrity check if this hash doesn't match.
- If methods like
daimyo.Card.load()
are missing a token, the error will
now not be thrown, but passed to the callback instead, like all other
methods.
0.0.2
daimyo
no longer has settings
property. You should use
daimyo.option()
to access options instead.
- After calling
daimyo.configure()
successfully for the first time,
configuration will now be permanently locked until you restart the app.
This is a feature not a bug. It prevents malicious code from tricking your
app into resetting some of the critical Daimyo options.
- Returns a proper 'Declined' error message when the card is declined.
0.0.1
The first release is a public preview release and it's not meant to be
production-ready. There are still quite a few things to implement, and error
handling is not very robust. Note that API might change as well. For starters,
you should not rely on any method that has the @private tag in the inline
comments (that do not appear in API documentation, that is), but the public
methods may change as well, as well as method signatures.
Although there are unit tests, and Daimyo's development is test-driven, the
tests do not currently provide complete coverage, and it is expected that some
functionality may break in production. Target for first production-ready Daimyo
is v0.1.
Installation
Easiest way to install Daimyo is by using npm:
npm install daimyo
That will install the latest release that we have made. Not that releases prior
to 0.1 are not considered production-ready. See the Status section of this
file to find out more about the current progress.
Since Daimyo is currently still very beta, if you wish to get a newer version
with more features (please don't do this in production, though), you can add it
as a dependency to your packages.json like this:
dependencies: {
....
,"daimyo": "https://github.com/HerdHound/Daimyo/tarball/master"
....
}
Using the above method, it is also possible to address individual commits. Go
to GitHub, switch to a commit you want to depend on, click the download link,
and right-click the tarball button, copy URL, and paste it into your dependency
list like above.
Finally, you can clone the Daimyo repository using git and install from the
cloned repository:
git clone https://github.com/HerdHound/Daimyo.git
cd /your/project/dir
npm install /path/to/daimyo/clone
Basic usage
var daimyo = require('daimyo');
// Configure Daimyo
daimyo.configure({
merchantKey: 'xxxxxxxxxxxxxxxxxxxxxxxx',
processorId: 'xxxxxxxxxxxxxxxxxxxxxxxx',
apiPassword: 'xxxxxxxxxxxxxxxxxxxxxxxx',
currency: 'USD', // default
debug: false, // default, should stay off in production at all costs
enabled: true, // default
sandbox: false // default
});
// Using transparent redirect with Express
app.get('/redirect_target', function(req, res, next) {
var token = req.param('payment_method_token');
var card = daimyo.Card({token: token});
// Create a new transaction
var transactionData = {
amount: 100,
billingReference: 'my billing ref #',
customerReference: "user's customer ref #',
type: 'purchase'
}
// Process the transaction using the card object
transaction.process(card, function(err) {
if (err) {
// Handle error and return error page
res.render('sorry', {});
return;
}
if (!transaction.messages.info ||
transaction.messages.info[0] === 'success') {
// The transaction was not successful
res.render('sorry, {messages: transaction.messages});
return;
}
// Ah, finally! All ur moneys are belong to us!
res.render('kthxbye', {});
// Don't forget to Email receipt!
emailReceipt({
issuer: card.issuer,
cardNo: '****-****-****-' + card.last4,
date: transaction.receipt.createdAt,
amount: transaction.receipt.amount
});
});
});
Using the check
as AMD module in browsers
The `lib/check.js`` module contains generic functions for performing various
checks on credit cards. It performs Luhn Mod-10 check to ensure that the card
number is valid (although the card itself may not be valid), get the name of
the issuer, or make sure that the CSC (also called CVV, CVC, or CCV) has the
right number of digits, etc. It is always a good idea to perform this check
browser-side to ensure that obviously invalid cards do not make it to the
system, or that any typing errors are caught early on.
This module can be used in browsers with minimal modifications. For
convenience, the checkamd
target is provided in the makefile, which builds
an AMD module compatible with loaders like RequireJS.
To build the AMD version of check, simply type:
make checkamd
This will result in creation of a new file called check.js
in the project
directory. The file is not minified. If you want to minify it, you can use
tools such as UglifyJS.
To use it, simply require it from your module as usual:
// mymodule.js
define(['jquery', 'check'], function($, check) {
var cardNumber = $('input[name=card]).val();
var csc = $('input[name=csc]').val();
var isVaild = check.mod10check(cardNumber) ? true : false;
var isValid = isValid && check.cscCheck(cardNumber, csc) ? true : false
var issuer = check.getIssuer(cardNumber);
alert('Your card was issued by ' + issuer);
});
You can find more details on this module in the
API documentation.
API documentation
The dox-generated API documentation can be found at
herdhound.github.com/Daimyo/. You can
also generate the documentation for offline use using the provided makefile.
See Offline documentaiton section for instructions.
Offline documentation
You can generate offline documentation for Daimyo using the
dox utility from Visionmedia. Install
dox by typing:
sudo npm install dox -g
Now you can simpy type make docs
in the project directory. The
documentation will be generated in a newly created docs
directory. To
remove the documentation, just type make clean
.
Running unit tests
To run unit tests you need Expresso,
and should.js. You also need to
create a file called test/config.js
, and add your keys there:
exports.merchantKey = 'xxxxxxxxxxxxxxxxxxxxxxxx';
exports.apiPassword = 'xxxxxxxxxxxxxxxxxxxxxxxx';
exports.processorId = 'xxxxxxxxxxxxxxxxxxxxxxxx';
The tests are run simply by simply typing make
in the project directory.
Alternatively, you can type:
expresso /test/*.tests.js
Do not run tests with your live processor. Make sure you are running in a
sandbox.
Reporting bugs
You may use the issue tracker to
report Daimyo bugs you find. Alternatively, you may contact the author directly
at branko@herdhound.com. Of course, feature
requests are also welcome, but currently, the basic functionality is top
priority.