# `X402.Extensions.PaymentIdentifier.Adapter`
[🔗](https://github.com/cardotrejos/x402/blob/v0.9.0/lib/x402/extensions/payment_identifier/adapter.ex#L1)

`X402.Extension` adapter advertising the `payment-identifier` extension.

    plug X402.Plug.PaymentGate,
      routes: [...],
      payment_identifier_cache: MyApp.PaymentCache,
      extensions: [{X402.Extensions.PaymentIdentifier.Adapter, required: true}]

Every 402 response advertises
`X402.Extensions.PaymentIdentifier.extension(required: ...)`. Validation
of the echoed id, the `required` rule, the request-fingerprint binding,
and the `:x402_payment_id` assign are built into `X402.Plug.PaymentGate`
and apply to the advertisement this adapter produces exactly as they do
to a static `extensions: %{"payment-identifier" => ...}` route entry.

# `advertise`
*since 0.9.0* 

```elixir
@spec advertise(
  keyword(),
  X402.Hooks.RequestContext.t()
) :: map()
```

Advertises the extension with the configured `required` flag.

## Examples

    iex> context = X402.Hooks.RequestContext.new([])
    iex> X402.Extensions.PaymentIdentifier.Adapter.advertise([required: true], context)["info"]
    %{"required" => true}

# `init`
*since 0.9.0* 

```elixir
@spec init(keyword()) :: {:ok, keyword()} | {:error, String.t()}
```

Validates the adapter options.

## Options

* `:required` (`t:boolean/0`) - Whether clients must supply an id (`info.required`). The default value is `false`.

## Examples

    iex> X402.Extensions.PaymentIdentifier.Adapter.init([])
    {:ok, [required: false]}

    iex> {:error, message} = X402.Extensions.PaymentIdentifier.Adapter.init(required: "yes")
    iex> message =~ ":required"
    true

# `key`
*since 0.9.0* 

```elixir
@spec key() :: String.t()
```

Returns `"payment-identifier"`.

## Examples

    iex> X402.Extensions.PaymentIdentifier.Adapter.key()
    "payment-identifier"

---

*Consult [api-reference.md](api-reference.md) for complete listing*
