Skip to content
/ pinxs Public

An elixir library for working with Pin Payments


Notifications You must be signed in to change notification settings


Repository files navigation

Build Status

Pin Payments


What could be a more Australian name for an Elixir library when using Pin Payments?

Made with love at HotDoc


Documentation at HexDocs


def deps do
    {:pinxs, "~> 1.1.0"}


API key and the Pin URL are sent as a config object with each request. PINXS.config helpers are provided for convenience.


All requests must provide your API key. The helper PINXS.config("YOUR KEY"). The reason this is done on a per request basis, rather than a global configuration is to allow changes at runtime on a per request basis.

All responses are transformed to return {:ok, item(s)} or {:error, PINXS.Error}

This enables us to leverage pattern matching and the with construct very nicely.

Example charge creation

    order = Order.create(...)

    card = %Card{
      number: "5520000000000000",
      expiry_month: "12",
      expiry_year: "20",
      name: "Rubius Hagrid",
      address_line1: "The Game Keepers Cottage",
      address_city: "Hogwarts",
      address_country: "England",
      cvc: "321"

    charge = %Charge{
      email: "hagrid@hogwarts.wiz",
      description: "Dragon eggs",
      ip_address: "",
      amount: 50_000,
      card: card

    with {:ok, created_order} <- Repo.insert(order),
         {:ok, created_charge} <- Charge.create(charge,"MY API KEY")),
         {:ok, paid_order} <- Order.mark_paid(created_order, created_charge),
         {:ok, _email} <- Mailer.send("receipt", created_charge),
         {:ok, _email} <- Mailer.send("notify_fulfullment_team", order)
    do {:ok, created_order}
      {:error, %Changeset{} = changeset} ->
        #response appropriately to changeset error
      {:error, %PinError{error_code: "insufficient_funds"}} ->
        Mailer.send("order_failed", charge)
      {:error, other} ->
        # handle some other error
      error -> 
        Logger.error("Some unknown error: #{IO.inspect(error)}")


All of the HTTP request / responses have been stored using Nug, this makes it relatively easy to test.

If you need to make changes to the stored responses, then you'll need to set your Pin API key as an environment variable.

export PIN_API_KEY=mykey