lib/payping.ex

defmodule PayPing do
  @moduledoc """
  PayPing API client for the Elixir language
  """
  @moduledoc since: "0.1.0"

  alias PayPing.HTTP

  @type http_error :: {:error, integer, term}

  @doc """
  Get configuration
  """
  @doc since: "0.1.0"
  @spec config() :: %{base_url: String.t(), token: String.t()}
  def config() do
    token = Application.get_env(:payping, :token, "")
    base_url = Application.get_env(:payping, :base_url, "https://api.payping.ir")

    %{
      token: token,
      base_url: base_url
    }
  end

  @doc """
  Create a Payment code
  """
  @doc since: "0.1.0"
  @type pay_params :: %{
    required(:amount) => integer,
    optional(:payerIdentity) => String.t(),
    optional(:payerName) => String.t(),
    optional(:description) => String.t(),
    required(:returnUrl) => String.t(),
    optional(:clientRefId) => String.t()
  }
  @spec pay(params :: pay_params) :: {:ok, integer(), map()} | http_error
  def pay(
        %{
          amount: _,
          returnUrl: _
        } = params
      ) do
    HTTP.async_handler(fn -> HTTP.post("/v2/pay", Jason.encode!(params)) end)
  end

  @doc """
  Verify a Payment
  """
  @doc since: "0.1.0"
  @type verify_params :: %{
    required(:refId) => String.t(),
    required(:amount) => integer
  }
  @type verify_ok :: {:ok, integer(), map()}
  @spec verify(params :: verify_params) :: verify_ok | http_error
  def verify(
        %{
          refId: _,
          amount: _
        } = params
      ) do
    HTTP.async_handler(fn -> HTTP.post("/v2/pay/verify", Jason.encode!(params)) end)
  end
end