<p align="center">
  <a href="" target='_blank'>
    <img alt="Gringotts Logo" title="Gringotts Logo" src="" width="200">

<p align="center">
  Gringotts is a payment processing library in Elixir integrating various payment gateways, drawing motivation for Shopify's <a href=""><code>activemerchant</code></a> gem. Checkout the <a href="" target="_">Demo</a> here.
<p align="center">
 <a href=""><img src=""  alt='Build Status' /></a>  <a href=''><img src='' alt='Coverage Status' /></a> <a href=""><img src=""/></a> <a href=""><img src="" alt="Docs coverage"></img></a> <a href=""><img src=""/></a>
 <a href=""><img src="" alt='Help Contribute to Open Source' /></a>

Gringotts offers a **simple and unified API** to access dozens of different payment
gateways with very different APIs, response schemas, documentation and jargon.

## Installation

### From [``][hexpm]

Add `gringotts` to the list of dependencies of your application.
# your mix.exs

def deps do
    {:gringotts, "~> 1.0"},
    # ex_money provides an excellent Money library, and integrates
    # out-of-the-box with Gringotts
    {:ex_money, "~> 1.1.0"}

## Usage

This simple example demonstrates how a `purchase` can be made using a sample
credit card using the [MONEI][monei] gateway.

One must "register" their account with `gringotts` ie, put all the
authentication details in the Application config. Usually via

# config/config.exs

config :gringotts, Gringotts.Gateways.Monei,
    userId: "your_secret_user_id",
    password: "your_secret_password",
    entityId: "your_secret_channel_id"

Copy and paste this code in a module or an `IEx` session

alias Gringotts.Gateways.Monei
alias Gringotts.{CreditCard}

# a fake sample card that will work now because the Gateway is by default
# in "test" mode.

card = %CreditCard{
  first_name: "Harry",
  last_name: "Potter",
  number: "4200000000000000",
  year: 2099, month: 12,
  verification_code:  "123",
  brand: "VISA"

# a sum of $42
amount =, :USD)

case Gringotts.purchase(Monei, amount, card) do
  {:ok,    %{id: id}} ->
    IO.puts("Payment authorized, reference token: '#{id}'")

  {:error, %{status_code: error, raw: raw_response}} ->
    IO.puts("Error: #{error}\nRaw:\n#{raw_response}")


## Supported Gateways

| Gateway               | Supported countries                                                                                                                                                                                                                                                        |
| ------                | -----                                                                                                                                                                                                                                                                      |
| [Authorize.Net][anet] | AD, AT, AU, BE, BG, CA, CH, CY, CZ, DE, DK, ES, FI, FR, GB, GB, GI, GR, HU, IE, IT, LI, LU, MC, MT, NL, NO, PL, PT, RO, SE, SI, SK, SM, TR, US, VA                                                                                                                         |
| [CAMS][cams]          | AU, US                                                                                                                                                                                                                                                                     |
| [MONEI][monei]         | DE, EE, ES, FR, IT, US                                                                                                                                                                                                                                                     |
| [PAYMILL][paymill]    | AD, AT, BE, BG, CH, CY, CZ, DE, DK, EE, ES, FI, FO, FR, GB, GI, GR, HU, IE, IL, IS, IT, LI, LT, LU, LV, MT, NL, NO, PL, PT, RO, SE, SI, SK, TR, VA                                                                                                                         |
| [Stripe][stripe]      | AT, AU, BE, CA, CH, DE, DK, ES, FI, FR, GB, IE, IN, IT, LU, NL, NO, SE, SG, US                                                                                                                                                                                             |
| [TREXLE][trexle]      | AD, AE, AT, AU, BD, BE, BG, BN, CA, CH, CY, CZ, DE, DK, EE, EG, ES, FI, FR, GB, GI, GR, HK, HU, ID, IE, IL, IM, IN, IS, IT, JO, KW, LB, LI, LK, LT, LU, LV, MC, MT, MU, MV, MX, MY, NL, NO, NZ, OM, PH, PL, PT, QA, RO, SA, SE, SG, SI, SK, SM, TR, TT, UM, US, VA, VN, ZA |
| [Wirecard][wirecard]  | AD, AT, BE, BG, CH, CY, CZ, DE, DK, EE, ES, FI, FR, GB, GI, GR, HU, IE, IL, IM, IS, IT, LI, LT, LU, LV, MC, MT, NL, NO, PL, PT, RO, SE, SI, SK, SM, TR, VA                                                                                                                 |


## Road Map

Apart from supporting more and more gateways, we also keep a somewhat detailed
plan for the future on our [wiki][roadmap].

## FAQ

#### 1. What's with the name? "Gringotts"?

Gringotts has a nice ring to it. Also [this][reason].

#### 2. What is the worker doing in the middle?

We wanted to "supervise" our payments, and power utilities to process recurring
payments, subscriptions with it. But yes, as of now, it is a bottle neck and

It's slated to be removed in [`v2.0.0`][milestone-2_0_0_alpha] and any supervised / async /
parallel work can be explicitly managed via native elixir constructs.


## License