La librería de ComproPago para Python le proporciona la flexibilidad para utilizar todos los servicios del API de ComproPago de una manera fácil y rapida. A continuación se muestra la forma en como deben de ser implementados cada uno de los metodos de la librería.


Introducción


El paquete de ComproPago Python SDK le permite interactuar con el API de ComproPago en su aplicación. También cuenta con los métodos necesarios para facilitar el desarrollo por medio de los servicios más utilizados (SDK).

Para hacer uso de la librería es necesario que tenga una cuenta previamente creada en compropago.com, la cual le otorgara un set de llaves de acceso para configurar el cliente de la librería


Requerimientos


  • Python >= 3.0
  • Paquete requests >= 2.9.1
  • Paquete six >= 1.10.0

Instalación


Puedes descargar directamente el SDK de compropago desde Pypi con el siguiente comando.

pip3 install compropago

Tambien puedes consultar nuestro listado de versiones directamente en Github, o si lo prefieres puedes clonar directamente el cádigo fuente para incluirlo en tu proyecto.

git clone https://github.com/compropago/sdk-python.git

Configuración


Importación

Para poder hacer uso de la librería es necesario incluir las clases principales de la libreria

from compropago.client import Client
from compropago.factory.factory import Factory

La clase Client corresponde a la clase principal del SDK y es con la cual se tiene acceso a todas las funcionalidades del API. Por su lado la clase Factory es la encargada de la generación de todos los modelos dentro del SDK y es ocupada para la instaciación de clases como PlaceOrderInfo al momento de generar los cargos.

Configurar el cliente

Para hacer uso de la libreria y llamados al API es necesario que primero configures tus Llaves de conexión y crees un instancia de Client. Tus llaves las encontraras en su Panel de ComproPago en el menú Configuración.

# @param string publickey     Llave publica correspondiente al modo de la tienda
# @param string privatekey    Llave privada correspondiente al modo de la tienda
# @param bool   live          Modo de la tienda (false = Test | true = Live)

client = Client(
    'pk_test_5989d8209974e2d62',  # publickey
    'sk_test_6ff4e982253c44c42',  # privatekey
    False                         # live
)

Metodos


list_providers

La función list providers le proporciona un listado con los puntos de cobro disponobles para su tienda con parametros para su facil filtrado, la cual regresa una lista de objetos de tipo Provider con los cuales puede acceder a sus atributos.

Prototipo
# @param [Boolean] auth
# @param [Float]   limit
# @param [string]  currency
# @return [list]
def list_providers(self, auth = False, limit = 0, currency = 'MXN')
Parametros
Parametro Tipo Valor por defecto Descripcion
auth
boolean False Autentifica la peticion para obtener los datos de una tienda, en caso contrario la funcion regresara los valores genericos
limit
float 0 Limite minimo que deben de soportar los proveedores listados
currency
string MXN Divisa en la cual se procesa el campo limit, para poder ocupar este campo es necesario que el campo auth este configurado como True o en su caso siempre se tomara el valor por defecto. los valores soportados son: Pesos mexicanos (MXN), Dolar americano(USD), Euro(EUR), Libra(GBP).
Ejemplo
>>> provs = client.api.list_providers()
>>> for prov in provs:
...     print(prov.name)
Oxxo
7Eleven
Coppel
...
>>> 

place_order

Este método le permite registrar ordenes en las cuales sus clientes podran pagar posteriormente. El método recibe como parametro un objeto de tipo PlaceOrderInfo y como resultado genera un objeto de tipo NewOrderInfo la cual contendra la información resultante de la generacón de la orden.

Prototipo
# @param [PlaceOrderInfo] info
# @return [NewOrderInfo]
def place_order(self, info)
Parametros
Parametro Tipo Valor por defecto Descripcion
info
PlaceOrderInfo Objeto con la información de la orden generado mediente la clase Factory
Ejemplo
# Hash con la información que contendra el objeto
order_info = {
    'order_id': 123,
    'order_name': 'M4 unit python',
    'order_price': 123.45,
    'customer_name': 'Eduardo Aguilar',
    'customer_email': 'eduardo.aguilar@compropago.com',
    'payment_type': 'OXXO'
}

# Creación del objeto PlaceOrderInfo
order = Factory.get_instance_of('PlaceOrderInfo', order_info)

# Llamada al método 'place_order' del API para generar la órden
new_order = client.api.place_order(order)

verify_order

Para verificar el estatus de una órden generada es necesario llamar al método verify_order que provee el atributo api del objeto Client y el cual regresa una instancia CpOrderInfo. Este método recibe como parámetro el ID generado por ComproPago para cada orden. Tambien puede obtener este ID desde un objeto NewOrderInfo accediendo al atributo id.

Prototipo
# @param [String] id
# @return [CpOrderInfo]
def verify_order(self, id)
Parametros
Parametro Tipo Valor por defecto Descripcion
id
string Id generado al registrar una orden en ComproPago
Ejemplo
# Guardar el ID de la orden
order_id = "ch_xxxx_xxx_xxx_xxxx";

# U obtenerlo de un objetdo NewOrderInfo
order_id = new_order.id

# Se manda llamar al metodo del API para recuperar la informacion de la orden
info = client.api.verify_order(order_id)

send_sms_instructions

Para realizar el el envío de las instrucciones de compra vía SMS es necesario llamar al método send_sms_instructions que se encuentra alojado en el atributo api del objeto Client y el cual regresa una instancia de tipo SmsInfo.

Prototipo
# @param [String] number
# @param [String] id
# @return [SmsInfo]
def send_sms_instructions(self, number, id)
Parametros
Parametro Tipo Valor por defecto Descripcion
number
string Numero telefónico del cliente al cual se enviara el mensaje de taxto
id
string ID de la orden de compropago la cual fue generada previamente.
Ejemplo
# Número al cual se enviaran las instrucciones
phone_number = "55xxxxxxxx";

# Id de la órden de compra de cual se enviaran las instrucciones
order_id = "ch_xxxxx-xxxxx-xxxxx-xxxxx";

# Llamada al método del API para envío de las instrucciones
smsinfo = client.api.send_sms_instructions(phone_number , order_id)

list_webhooks

Para obtener la lista de webhooks registrados en una cuenta, se debe de llamar al método list_webhook que se encuentra alojado en el atributo api del objeto Client y el cual regresa una instancia de tipo list la cual contiene objetos de tipo Webhook.

Prototipo
# @return [list]
def list_webhooks(self)
Ejemplo
>>> webhooks = client.api.list_webhooks()
>>> for webhook in webhooks:
...     print(webhook.url)
https://misitio.com/webhook
https://misitio.com/webhook/dos
...
>>> 

create_webhook

Para crear un nuevo Webhook en la cuenta, se debe de llamar al método create_webhook que se encuentra alojado en el atributo api del objeto Client y el cual regresa una instancia de tipo Webhook.

Prototipo
# @param [String] url
# @return [Webhook]
def create_webhook(self, url)
Parametros
Parametro Tipo Valor por defecto Descripcion
url
string Url que sera registrada como EndPoint del webhook.
Ejemplo
# Se pasa como paramtro la URL al webhook
webhook = client.api.create_webhook('http://sitio.com/webhook')

update_webhook

Para actualizar la url de un webhook, se debe de llamar al método update_webhook que se encuentra alojado en el atributo api del objeto Client y el cual regresa una instancia de tipo Webhook.

Prototipo
# @param [String] url
# @param [String] id
# @return [Webhook]
def update_webhook(self, id, url)
Parametros
Parametro Tipo Valor por defecto Descripcion
id
string Id de un webhook previamente registrado. Puede ser obteido de una instancia Webhook accediendo al atributo id.
url
string Nueva url del webhook
Ejemplo
updated_webhook = client.api.update_webhook(webhook.id, 'http://sitio.com/nuevo_webhook')

delete_webhook

Para eliminar un webhook, se debe de llamar al método delete_webhook que se encuentra alojado en el atributo api del objeto Client y el cual regresa una instancia de tipo Webhook.

Prototipo
# @param [String] id
# @return [Webhook]
def delete_webhook(self, id)
Parametros
Parametro Tipo Valor por defecto Descripcion
id
string Id de un webhook previamente registrado. Puede ser obteido de una instancia Webhook accediendo al atributo id.
Ejemplo
deleted_webhook = client.api.delete_webhook(webhook.id)

Recibos de pago


Para facilitar el despliegue de instrucciones de pago, puedes incluir un Iframe en tu sitio apuntando alos recibos de ComproPago de la siguiente manera.

<div class="compropagoDivFrame" id="compropagodContainer" style="width: 100%;">
    <iframe style="width: 100%;"
        id="compropagodFrame"
        src="https://www.compropago.com/comprobante/?confirmation_id=ch_xxxxx_xxxx_xxx_xxxxx"
        frameborder="0"
        scrolling="yes"> </iframe>
</div>
<script type="text/javascript">
    function resizeIframe() {
        var container=document.getElementById("compropagodContainer");
        var iframe=document.getElementById("compropagodFrame");
        if(iframe && container){
            var ratio=585/811;
            var width=container.offsetWidth;
            var height=(width/ratio);
            if(height>937){ height=937;}
            iframe.style.width=width + 'px';
            iframe.style.height=height + 'px';
        }
    }
    window.onload = function(event) {
        resizeIframe();
    };
    window.onresize = function(event) {
        resizeIframe();
    };
</script>

Dentro del parametro src del Iframe, se especifica la ruta del recibo, la cual contiene un parametro confirmation_id el cual debera contener el Id de la ordene generada, el cual se puede obtener del atributo id de los objetos NewOrderInfo o CpOrderInfo.

Webhook EndPoint


Los Webhook EndPoints, son rutas a las cuales ComproPago envia las notificaciones de cambio de estatus con las cuales podra generar la lógica necesaria para sus procesos internos en su sitio. A continuación se muestra un ejemplo de la estructura y control de flujo de un Webhook EndPoint con el framework web CherryPy.

Ejemplo
import cherrypy
from compropago.client import Client
from compropago.factory.factory import Factory


class HelloWorld(object):
    @cherrypy.expose
    def webhook(self):
        if 'Content-Length' in cherrypy.request.headers:
            cl = cherrypy.request.headers['Content-Length']
            rawbody = cherrypy.request.body.read(int(cl)).decode("iso-8859-1")
        else:
            return 'No request'

        resp_webhook = Factory.get_instance_of('CpOrderInfo', rawbody)

        if len(resp_webhook.id) == 0:
            return 'Invalid Request'

        if resp_webhook.id == 'ch_00000-000-0000-000000':
            return 'Probando el Webhook? Ruta correcta'

        publickey = 'pk_test_638e8b14112423a086'
        privatekey = 'sk_test_9c95e149614142822f'
        mode = False

        try:
            client = Client(publickey, privatekey, mode)

            verified = client.api.verify_order(resp_webhook.id)

            if verified.type == 'charge.success':
                # TODO: Actions for success payments
                return 'Success payment'
            elif verified.type == 'charge.pending':
                # TODO: Actions for pending payments
                return 'Pending payment'
            elif verified.type == 'charge.declined':
                # TODO: Actions for declined payments
                return 'Declined payment'
            elif verified.type == 'charge.expired':
                # TODO: Actions for expired payments
                return 'Expired payment'
            elif verified.type == 'charge.deleted':
                # TODO: Actions for deleted payments
                return 'Deleted payment'
            elif verified.type == 'charge.canceled':
                # TODO: Actions for canceled payments
                return 'Canceled payment'
            else:
                return 'Invalid request'
        except Exception as e:
            print(e.args)
            return 'Internal Process error'


cherrypy.quickstart(HelloWorld())