*****
Epayco
*****

Python wrapper for Epayco API

Description
########

API to interact with Epayco
https://api.epayco.co

Installation
****

If you want clone the repository, point it directly into our GitHub project::

    $ git clone https://github.com/epayco/epayco-python.git

Run the file setup.py

    $ sudo python3 setup.py install

Install from Packages (Linux), Pyhton = 3.7
****
   $ pip install epaycosdk

Install from Packages (Windows)  Pyhton = 3.7
****
   $ pip install epaycosdk-win

   
Usage
####

.. code-block:: python

    import epaycosdk.epayco as epayco

    apiKey = "PUBLIC_KEY"
    privateKey = "PRIVATE_KEY"
    lenguage = "ES"
    test = True
    options={"apiKey":apiKey,"privateKey":privateKey,"test":test,"lenguage":lenguage}

    objepayco=epayco.Epayco(options)

Create Token
####

.. code-block:: python

    credit_info = {
      "card[number]": "4575623182290326",
      "card[exp_year]": "2025",
      "card[exp_month]": "19",
      "card[cvc]": "123",
      "hasCvv": True #// hasCvv: validar codigo de seguridad en la transacción
      }

    token=objepayco.token.create(credit_info)

Customers
####

Create
******
.. code-block:: python

    customer_info = {
      "token_card": "eXj5Wdqgj7xzvC7AR",
      "name": "Joe",
      "last_name": "Doe", #This parameter is optional
      "email": "joe@payco.co",
      "phone": "3005234321",
      "default": True
      }

    customer=objepayco.customer.create(customer_info)

Retrieve
******
.. code-block:: python

    customer=objepayco.customer.get("id_client")

List
******
.. code-block:: python

    customers = objepayco.customer.getlist()

Update
******
.. code-block:: python

    update_customer_info = {
      "name": "Alex"
    }

    customer =objepayco.customer.update("id_client",update_customer_info)

Delete Token
******
.. code-block:: python

    delete_customer_info = {
      "franchise": "visa",
      "mask": "457562******0326",
      "customer_id":"id_client"
    }

    customer =objepayco.customer.delete(delete_customer_info)



Add new token default to card existed
******
.. code-block:: python

    customer_info = {
        "customer_id":"id_client",
        "token": "**********Q2ZLD9",
        "franchise":"visa",
        "mask":"457562******0326"
    }
    customer=objepayco.customer.addDefaultCard(customer_info)


Add new token to customer existed
******
.. code-block:: python

    customer_info = {
        "token_card": "6tWRMjsiDGPds2Krb",
        "customer_id":"id_client"
    }
    customer=objepayco.customer.addNewToken(customer_info)




Plans
####

Create
******

.. code-block:: python

    plan_info = {
      "id_plan": "coursereact",
      "name": "Course react js",
      "description": "Course react and redux",
      "amount": 30000,
      "currency": "cop",
      "interval": "month",
      "interval_count": 1,
      "trial_days": 30
    }

    plan = objepayco.plan.create(plan_info)


Retrieve
******
.. code-block:: python

    plan = objepayco.plan.get("coursereact")

List
******
.. code-block:: python

    planes = objepayco.plan.getlist()

Remove
******
.. code-block:: python

    plan = objepayco.plan.delete("coursereact")

Subscriptions
####

Create
******
.. code-block:: python

    subscription_info = {
    "id_plan": "coursereact2",
    "customer": "9xRxhaJ2YmLTkT5uz",
    "token_card": "eXj5Wdqgj7xzvC7AR",
    "doc_type": "CC",
    "doc_number": "0000000000",
    #Optional parameter: if these parameter it's not send, system get ePayco dashboard's url_confirmation
    "url_confirmation": "https://tudominio.com/confirmacion.php",
    "method_confirmation": "POST"
    }

    sub=objepayco.subscriptions.create(subscription_info)

Retrieve
******
.. code-block:: python

    sub=objepayco.subscriptions.get("efPXtZ5r4nZRoPtjZ")

List
******
.. code-block:: python

    sub=objepayco.subscriptions.getlist()

Cancel
******
.. code-block:: python

    sub=objepayco.subscriptions.cancel("fayE66HxYbxWydaN8")

Pay Subscription
******
.. code-block:: python

    subscription_info = {
      "id_plan": "coursereact",
      "customer": "A6ZGiJ6rgxK5RB2WT",
      "token_card": "eXj5Wdqgj7xzvC7AR",
      "doc_type": "CC",
      "doc_number": "1000000",
      "ip":"190.000.000.000"  #This is the client's IP, it is required

    }

    sub = objepayco.subscriptions.charge(subscription_info)

PSE
####

Create
*****
.. code-block:: python

    pse_info = {
      "bank": "1007",
      "invoice": "1472050778",
      "description": "pay test",
      "value": "116000",
      "tax": "16000",
      "tax_base": "100000",
      "currency": "COP",
      "type_person": "0",
      "doc_type": "CC",
      "doc_number": "10000000",
      "name": "testing",
      "last_name": "PAYCO",
      "email": "no-responder@payco.co",
      "country": "CO",
      "cell_phone": "3010000001",
      "ip": "190.000.000.000", #This is the client's IP, it is required,
      "url_response": "https://tudominio.com/respuesta.php",
      "url_confirmation": "https://tudominio.com/confirmacion.php",
      "metodoconfirmacion": "GET",      
      #Los parámetros extras deben ser enviados tipo string, si se envía tipo array generara error.
      "extra1": "",      
      "extra2": "",
      "extra3": "",
      "extra4": "",
      "extra5": "",  
      "extra6": "",
      "extra7": ""
    }

    pse = objepayco.bank.create(pse_info)

Retrieve
*****
.. code-block:: python

    pse = objepayco.bank.pseTransaction("ticketId")

Split Payments
*****

Previous requirements: https://docs.epayco.co/tools/split-payment
*****


Split payment
*****

.. code-block:: python

    import json

    pse_info = {
    #Other customary parameters...
      "splitpayment":"true",
       "split_app_id":"P_CUST_ID_CLIENTE APPLICATION",
       "split_merchant_id":"P_CUST_ID_CLIENTE COMMERCE",
       "split_type" : "01",
       "split_primary_receiver" : "P_CUST_ID_CLIENTE APPLICATION",
       "split_primary_receiver_fee":"80000"
       "split_receivers": json.dumps([
                {"id":"P_CUST_ID_CLIENTE 1 RECEIVER","total":"58000","iva":"8000","base_iva":"50000","fee":"10"},
                {"id":"P_CUST_ID_CLIENTE 2 RECEIVER","total":"58000","iva":"8000","base_iva":"50000", "fee":"10"}
        ])
     }

    pse_split = objepayco.bank.create(pse_info)
    

Cash
####

Create
*****
.. code-block:: python

    cash_info = {
        "invoice": "1472050778",
        "description": "pay test",
        "value": "116000",
        "tax": "16000",
        "tax_base": "100000",
        "currency": "COP",
        "type_person": "0",
        "doc_type": "CC",
        "doc_number": "100000",
        "name": "testing",
        "last_name": "PAYCO",
        "email": "test@mailinator.com",
        "cell_phone": "3010000001",
        "end_date": "2020-12-05",
        "ip": "190.000.000.000",  #This is the client's IP, it is required,
        "url_response": "https://tudominio.com/respuesta.php",
        "url_confirmation": "https://tudominio.com/confirmacion.php",
        "metodoconfirmacion": "GET",
        #Los parámetros extras deben ser enviados tipo string, si se envía tipo array generara error.
        "extra1": "",
        "extra2": "",
        "extra3": "",
        "extra4": "",
        "extra5": "",  
        "extra6": "",
        "extra7": ""

    }

    cash = objepayco.cash.create('efecty',cash_info)
    cash = objepayco.cash.create('gana',cash_info)
    cash = objepayco.cash.create('baloto',cash_info) #expiration date can not be longer than 30 days
    cash = objepayco.cash.create('redservi',cash_info) #expiration date can not be longer than 30 days
    cash = objepayco.cash.create('puntored',cash_info) #expiration date can not be longer than 30 days
    cash = objepayco.cash.create('sured',cash_info) #expiration date can not be longer than 30 days

Retrieve
*****
.. code-block:: python

    cash = epayco.cash.get("ref_payco")



Split Payments
*****

Previous requirements: https://docs.epayco.co/tools/split-payment



Split payment:
****

use the following attributes in case you need to do a dispersion with one or multiple providers

.. code-block:: python

    import json 

    payment_info = {
    #Other customary parameters...
        "splitpayment":"true",
        "split_app_id":"P_CUST_ID_CLIENTE APPLICATION",
        "split_merchant_id":"P_CUST_ID_CLIENTE COMMERCE",
        "split_type" : "02",
        "split_primary_receiver" : "P_CUST_ID_CLIENTE APPLICATION",
        "split_primary_receiver_fee":"0",
        "split_rule":'multiple', #si se envía este parámetro el campo split_receivers se vuelve obligatorio
        "split_receivers":json.dumps([
                {"id":"P_CUST_ID_CLIENTE 1 RECEIVER","total":"58000","iva":"8000","base_iva":"50000","fee":"10"},
                {"id":"P_CUST_ID_CLIENTE 2 RECEIVER","total":"58000","iva":"8000","base_iva":"50000", "fee":"10"}
        ]) #campo obligatorio sí se envía split_rule
        }

     cash_info_split = objepayco.cash.create('efecty',cash_info)





Payment
*****

Create
*****
.. code-block:: python

    payment_info = {
      "token_card": "token_card",
      "customer_id": "customer_id",
      "doc_type": "CC",
      "doc_number": "1000000",
      "name": "John",
      "last_name": "Doe",
      "email": "example@email.com",
      "bill": "OR-1234",
      "description": "Test Payment",
      "value": "116000",
      "tax": "16000",
      "tax_base": "100000",
      "currency": "COP",
      "dues": "12",
      "ip":"190.000.000.000",  #This is the client's IP, it is required
      "url_response": "https://tudominio.com/respuesta.php",
      "url_confirmation": "https://tudominio.com/confirmacion.php",
      "method_confirmation": "GET",
      "use_default_card_customer":True, # if the user wants to be charged with the card that the customer currently has as default = true
      #Los parámetros extras deben ser enviados tipo string, si se envía tipo array generara error.
      "extra1": "",
      "extra2": "",
      "extra3": "",
      "extra4": "",
      "extra5": "",  
      "extra6": "",
      "extra7": ""
    }

    pay = objepayco.charge.create(payment_info)

Retrieve
*****

.. code-block:: python

    pay = epayco.charge.get("ref_payco")


Split Payments
*****

Previous requirements https://docs.epayco.co/tools/split-payment


Split payment
****

use the following attributes in case you need to do a dispersion with one or multiple providers

.. code-block:: python

    import json
    
    payment_info = {
    #Other customary parameters...
        "splitpayment":"true",
        "split_app_id":"P_CUST_ID_CLIENTE APPLICATION",
        "split_merchant_id":"P_CUST_ID_CLIENTE COMMERCE",
        "split_type" : "02",
        "split_primary_receiver" : "P_CUST_ID_CLIENTE APPLICATION",
        "split_primary_receiver_fee":"0",
        "split_rule":'multiple', #si se envía este parámetro el campo split_receivers se vuelve obligatorio
        "split_receivers":[
                {"id":"P_CUST_ID_CLIENTE 1 RECEIVER","total":"58000","iva":"8000","base_iva":"50000","fee":"10"},
                {"id":"P_CUST_ID_CLIENTE 2 RECEIVER","total":"58000","iva":"8000","base_iva":"50000", "fee":"10"}
        ] #campo obligatorio sí se envía split_rule
        }

    pay_split = objepayco.charge.create(payment_info)


Daviplata
*****

Create
*****

.. code-block:: python
    payment_info = {
        doc_type: "CC",
        document: "1053814580414720",
        name: "Testing",
        last_name: "PAYCO",
        email: "exmaple@epayco.co",
        ind_country: "CO",
        phone: "314853222200033",
        country: "CO",
        city: "bogota",
        address: "Calle de prueba",
        ip: "189.176.0.1",
        currency: "COP",
        description: "ejemplo de transaccion con daviplata",
        value: "100",
        tax: "0",
        ico: "0"
        tax_base: "0",
        method_confirmation: ""
    }

    daviplata = objepayco.daviplata.create(payment_info)

confirm transaccion
*****

.. code-block:: python
    confirm = {
        ref_payco: "45508846", // It is obtained from the create response
        id_session_token: "45081749", // It is obtained from the create response
        otp: "2580"
    }
   
    daviplata = objepayco.daviplata.confirm(payment_info)

Safetypay
*****

Create
*****

.. code-block:: python
    payment_info = {
        cash: "1",
        expirationDate: "2021-08-05",
        docType: "CC",
        document: "123456789",
        name: "Jhon",
        lastName: "doe",
        email: "jhon.doe@yopmail.com",
        indCountry: "57",
        phone: "3003003434",
        country: "CO",
        invoice: "fac-01", // opcional
        city: "N/A",
        address: "N/A",
        ip: "192.168.100.100",
        currency: "COP",
        description: "Thu Jun 17 2021 11:37:01 GMT-0400 (hora de Venezuela)",
        value: 100000,
        tax: 0,
        ico: 0,
        taxBase: 0,
        urlConfirmation: "",
        methodConfirmation: ""
    }

    daviplata = objepayco.daviplata.create(payment_info)
