Full Transaction Lifecycle — Subscriptions
$vault_id = 'SUB-' . $_SESSION['user_id'] . '-' . time();
$post = array(
'security_key' => YOUR_PRIVATE_KEY,
'type' => 'sale',
'amount' => $plan_amount,
'payment_token' => $payment_token,
'customer_vault' => 'add_customer',
'customer_vault_id' => $vault_id,
'recurring' => 'add_subscription',
'plan_payments' => '0',
'plan_amount' => $plan_amount,
'month_frequency' => '1',
'day_of_month' => date('j'),
'start_date' => date('Y-m-d', strtotime('+1 month')),
'email' => $_SESSION['user_email'],
);
$result = gateway_post($post);
if ($result['response'] == '1') {
db_insert('subscriptions', [
'user_id' => $_SESSION['user_id'],
'vault_id' => $vault_id,
'subscription_id' => $result['subscription_id'],
'status' => 'active',
]);
redirect('/account?subscribed=1');
}
Handling Failed Recurring Payments
// In your webhook handler
if ($_POST['response'] == '2' && !empty($_POST['subscription_id'])) {
$sub = db_find('subscriptions', ['subscription_id' => $_POST['subscription_id']]);
send_payment_failed_email($sub['user_email']);
if ($sub['failure_count'] >= 3) cancel_subscription($sub['subscription_id']);
}