# Payment Methods

A Payment Method is what the customer pays with: a card, an e-wallet, online banking, QR Ph, or buy now, pay later, along with their billing details. On its own it charges nothing. [Attach it to a payment intent](/payment-intents.md#attach-a-payment-method) to make the payment.

Every method lives on `Paymongo::paymentMethods()` and returns a [`PaymentMethod`](/data-objects.md#paymentmethod). For every attribute PayMongo accepts, see its [Payment Method reference](https://docs.paymongo.com/reference/create-a-paymentmethod).

## Create a card payment method

`create()` takes the method's `type`, its `details`, and optional `billing`:

```php
use Luigel\Paymongo\Facades\Paymongo;

$method = Paymongo::paymentMethods()->create([
    'type' => 'card',
    'details' => [
        'card_number' => '4343434343434345', // a test card
        'exp_month' => 12,
        'exp_year' => 34,
        'cvc' => '123',
    ],
    'billing' => [
        'name' => 'Juan dela Cruz',
        'email' => 'juan@example.com',
        'phone' => '+639171234567',
        'address' => [
            'line1' => '123 Osmeña Blvd',
            'city' => 'Cebu City',
            'state' => 'Cebu',
            'postal_code' => '6000',
            'country' => 'PH',
        ],
    ],
]);

$method->id; // "pm_...", to attach to a payment intent
```

In production, do not create card payment methods on your server. Create them in the browser with your **public** key, so card numbers never reach your server and you stay out of PCI DSS scope, then send the resulting `pm_...` id to your server to attach. The example above uses a test card, and is how your tests and scripts can create one.

## Create an e-wallet, bank, or QR Ph payment method

Every other type needs only its `type`. The customer authorizes the payment on the provider's page, or by scanning a code, after you attach it:

```php
use Luigel\Paymongo\Enums\PaymentMethodType;
use Luigel\Paymongo\Facades\Paymongo;

$gcash = Paymongo::paymentMethods()->create(['type' => PaymentMethodType::Gcash]);

$qrph = Paymongo::paymentMethods()->create([
    'type' => 'qrph',
    'expiry_seconds' => 900, // the QR code expires 15 minutes after it is attached
]);
```

`type` takes a `Luigel\Paymongo\Enums\PaymentMethodType` case or its string value:

| Case | Value | Pays with |
|:-----|:------|:----------|
| `Card` | `card` | Credit or debit card |
| `Gcash` | `gcash` | GCash |
| `Paymaya` | `paymaya` | Maya |
| `GrabPay` | `grab_pay` | GrabPay |
| `ShopeePay` | `shopee_pay` | ShopeePay |
| `Qrph` | `qrph` | Any bank or e-wallet app that scans QR Ph |
| `Dob` | `dob` | Direct online banking |
| `Brankas` | `brankas` | Online banking through Brankas |
| `Billease` | `billease` | BillEase, buy now, pay later |
| `Atome` | `atome` | Atome, buy now, pay later |

`expiry_seconds` sets how long a `qrph` or `shopee_pay` method can be paid once attached, from 60 to 9000 seconds for QR Ph.

## Retrieve a payment method

`retrieve()` returns the method with typed billing details. `$method->methodType` holds the `type`:

```php
use Luigel\Paymongo\Facades\Paymongo;

$method = Paymongo::paymentMethods()->retrieve('pm_wr98R2gwWroVxfkcNVZBuXg2');

$method->methodType;               // ?PaymentMethodType: Card, Gcash, ...
$method->billing?->name;           // "Juan dela Cruz"
$method->billing?->address?->city; // "Cebu City"
$method->details;                  // ?array, e.g. the card's last4 and exp_month; never the full number
```
