# Payment Methods

# Introduction

A payment method controls how a payment is handled from its creation to completion. Each defined payment method has a unique namespace.

Think of cash as a distinct payment method and a payment there of as the simplest. However nowadays payment methods are much more complex. Think of a card payment as another payment method with processing requirements which are completely different.

Payment methods however complex they seem have similarities in how they are handled. For example both cash & card payments must preferably support refunds and cancellations. Accepting payments is just one side of the same sword.

# Base definition

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
    }
}

# Callbacks

# New Transaction

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
        newTransaction: async function(paymentTransaction, paymentInstance) {

            // Do custom changes here

            return paymentTransaction
        }
    }
}

# Charge Transaction

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
        chargeTransaction: async function(paymentTransaction, paymentInstance, details) {

            // Do your payment processing here

            return paymentTransaction
        }
    }
}

# Cancel Transaction

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
        cancelTransaction: async function(paymentTransaction, paymentInstance, details) {

            // Do your payment processing here

            return paymentTransaction
        }
    }
}

# Credit Transaction

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
        creditTransaction: async function(paymentTransaction, paymentInstance, details) {

            // Do your payment processing here

            return paymentTransaction
        }
    }
}

# Resolve Transaction

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
        resolveTransaction: async function(paymentTransaction, paymentInstance) {

            // Do your payment processing here

            return paymentTransaction
        }
    }
}

# Complete Example

const paymentMethod = {
    title: "My Custom Payment Method",
    description: "Log custom payments of Custom Payment Method",
    namespace: "my_custom_payment_method",
    configFields: [],
    uiFields: [],
    callbacks: {
        newTransaction: async function(paymentTransaction, paymentInstance) {
        
                    // Do custom changes here
        
                    return paymentTransaction
        },
        chargeTransaction: async function(paymentTransaction, paymentInstance, details) {

            // Do your payment processing here

            return paymentTransaction
        },
        cancelTransaction: async function(paymentTransaction, paymentInstance, details) {

            // Do your payment processing here

            return paymentTransaction
        },
        creditTransaction: async function(paymentTransaction, paymentInstance, details) {

            // Do your payment processing here

            return paymentTransaction
        },
        resolveTransaction: async function(paymentTransaction, paymentInstance) {

            // Do your payment processing here

            return paymentTransaction
        }
    }
}