Python/Django: ¿Qué biblioteca authorize.net debo usar?
payment-gateway (6)
Necesito la integración de authorize.net para los pagos de suscripción, probablemente usando CIM. Los requisitos son simples: pagos mensuales recurrentes, con algunos puntos de precio diferentes. La información de la tarjeta de crédito del cliente será almacenada en authorize.net.
Hay bastantes bibliotecas y fragmentos de código, estoy buscando recomendaciones sobre cuál funciona mejor.
- Satchmo parece más de lo que necesito, y parece que es complejo.
- Django-Bursar parece ser lo que necesito, pero aparece como alfa.
- La biblioteca adroll / authorize también se ve bastante bien.
- Las API XML de CIM no se ven tan mal, podría conectarme directamente con ellas.
Y hay bastantes otros fragmentos de código.
¿Cuál es la mejor opción en este momento, dados mis requisitos bastante simples?
Edición: https://github.com/agiliq/merchant/blob/master/billing/gateways/authorize_net_gateway.py ve muy bien, aún no lo he probado.
Edit: [Para el próximo proyecto que tengo que usa authorize.net, voy a echar un vistazo de cerca a: http://github.com/zen4ever/django-authorizenet Se ve muy bien. Sin embargo, no creo que tenga soporte para pagos recurrentes.]
En el pasado he hecho pequeñas implementaciones únicas.
Para una publicación simple en la pasarela de pago AIM, puede usar algo como esto:
URL = ''https://test.authorize.net/gateway/transact.dll''
API = {''x_login'':''XXX'',
''x_tran_key'':''XXX'', ''x_method'':''CC'', ''x_type'':''AUTH_ONLY'',
''x_delim_data'':''TRUE'', ''x_duplicate_window'':''10'', ''x_delim_char'':''|'',
''x_relay_response'':''FALSE'', ''x_version'':''3.1''}
def call_auth(amount, card_num, exp_date, card_code, zip_code, request_ip=None):
''''''Call authorize.net and get a result dict back''''''
import urllib2, urllib
payment_post = API
payment_post[''x_amount''] = amount
payment_post[''x_card_num''] = card_num
payment_post[''x_exp_date''] = exp_date
payment_post[''x_card_code''] = card_code
payment_post[''x_zip''] = zip_code
payment_request = urllib2.Request(URL, urllib.urlencode(payment_post))
r = urllib2.urlopen(payment_request).read()
return r
def call_capture(trans_id): # r.split(''|'')[6] we get back from the first call, trans_id
capture_post = API
capture_post[''x_type''] = ''PRIOR_AUTH_CAPTURE''
capture_post[''x_trans_id''] = trans_id
capture_request = urllib2.Request(URL, urllib.urlencode(capture_post))
r = urllib2.urlopen(capture_request).read()
return r
Para autorizar, haces algo como:
r = authorize.call_auth(
unicode(decimal_total),
request.POST.get(''card_num''),
request.POST.get(''exp_date''),
request.POST.get(''card_code''),
request.POST.get(''zip_code'') if request.POST.get(''zip_code'') else address.zip_code,
)
if r.split(''|'')[0] == ''1'':
# it''s good, we have authorized the card...
else:
error = "%s Please try again." % (r.split(''|'')[3])
entonces, podemos capturar:
r = authorize.call_capture(trans_id) # r.split(''|'')[6] in first response..
if r.split(''|'')[0] == ''1'':
# we captured it.
else:
error = r.split(''|'')[3]
Hay más opciones, formas de solicitar, matices en la respuesta a analizar ... Supongo que b / c A
en AIM
significa advanced
que todas las opciones de authorize.net están disponibles.
http://developer.authorize.net/guides/AIM/
Sé que su pregunta es qué lib es la mejor ... bueno, podría ser más fácil simplemente implementar su propio pedacito de solicitud y respuesta ad-hoc para sus requisitos específicos en lugar de tratar de encontrar una api sobre una api.
En pocas palabras, ninguna de las soluciones existentes satisfacía mis necesidades. Eran no guardadas, sin comentarios, sin probar o carecían de tarjetas guardadas. Así que, por supuesto, construí mi propia solución y la abrí:
AuthorizeSauce: https://github.com/jeffschenck/authorizesauce
Maneja transacciones básicas (la API de AIM), tarjetas guardadas (la API de CIM) y pagos recurrentes (la API de ARB). Está completamente documentado y tiene un conjunto de pruebas completo.
Espero que el cartel original haya pasado hace mucho tiempo, pero si puedo ayudar a alguien más a evitar el dolor del procesamiento de pagos, me alegraría mucho.
Me doy cuenta de que esto es un poco tarde, pero espero que ayude a otros.
Hace poco me encontré con Py-Authorize
que tiene una gran documentación, en comparación con los otros paquetes disponibles. Puedes instalarlo a través de:
pip install Py-Authorize
Parece que se instala una dependencia ( colondar
) que, cuando se instala a través de pip
está desactualizada, por lo que puede obtener la última (en el momento de escribir este documento) haciendo lo siguiente:
pip install git+git://github.com/Pylons/[email protected]
Los documentos están aquí: http://vcatalano.github.io/py-authorize/index.html
Funciona muy bien en mi experiencia, sin embargo, para el proyecto en el que lo estoy usando solo necesitaba AuthCapture y no ARB ni nada ... Pruébelo. El mejor paquete que he encontrado hasta ahora.
Por lo que vale la pena, terminamos usando la biblioteca de autorizaciones de adroll . Tanto Paython como django-authorizenet parecen interesantes, estarán revisándolos.
Recientemente escribí esta API para Python y Authorize.net después de no poder encontrar una que admitiera todas las funciones de Authorize.net.
Siempre hay Paython: https://github.com/abunsen/Paython
Actualmente soporta 5+ pasarelas de pago:
- Authorize.net
- Primeros datos / punto de enlace
- Gateway innovador (desde la intuición)
- PlugnPay
- Raya
Aquí hay un ejemplo:
from paython import CreditCard, AuthorizeNet
configurar una tarjeta primero:
credit_card = CreditCard(
number = ''4111111111111111'',
exp_mo = ''02'',
exp_yr = ''2012'',
first_name = ''John'',
last_name = ''Doe'',
cvv = ''911'',
strict = False
)
compruebe si es válido:
if not credit_card.is_valid(): return ''houston, we have a problem'' # checks card number + expiration date
Configure los datos del cliente a cobrar, no todos los campos son obligatorios:
customer_data = dict(
address=''123 Main St'',
address2=''Apt 1'',
city=''Pleasantville'',
state=''IA'',
zipcode=''54321'',
country=''US'',
phone=''654-369-9589'',
email=''[email protected]'',
ip=''127.0.0.1'')
autorizar contra la puerta de enlace, las opciones incluyen salida de depuración o credenciales de prueba:
api = AuthorizeNet(username=''test'', password=''testpassword'', debug=True, test=True)
gateway_response = api.auth(amount=''0.05'', credit_card=credit_card, billing_info=customer_data, shipping_info=None)
ahora puedes resolver
api = AuthorizeNet(username=''test'', password=''testpassword'', debug=True, test=True)
gateway_response = api.settle(amount=''0.05'', trans_id=''2156729380'')