Ответ 1
Для чего мы стоили, мы использовали библиотеку авторизации прокрутки. Оба Paython и django-authorizenet выглядят интересными, будут проверять их.
Мне нужна авторизационная интеграция для подписных платежей, вероятно, используя CIM. Требования просты - повторяющиеся ежемесячные платежи с несколькими различными ценовыми точками. Информация о кредитной карте клиента будет храниться в authorize.net.
Существует довольно много библиотек и фрагментов кода, я ищу рекомендации относительно наилучшей работы.
И есть еще несколько фрагментов кода.
Какой лучший выбор сейчас, учитывая мои довольно простые требования?
Для чего мы стоили, мы использовали библиотеку авторизации прокрутки. Оба Paython и django-authorizenet выглядят интересными, будут проверять их.
Короче говоря, ни одно из существующих решений не отвечало моим потребностям. Они были либо без изменений, без ранений, непроверенных, либо отсутствовали сохраненные карты. Поэтому, конечно, я построил свое собственное решение и открыл его:
AuthorizeSauce: https://github.com/jeffschenck/authorizesauce
Он обрабатывает основные транзакции (API AIM), сохраненные карты (CIM API) и повторяющиеся платежи (API ARB). Он полностью документирован и имеет полный набор тестов.
Я ожидаю, что оригинальный плакат уже давно перешел, но если он может помочь кому-то еще избежать некоторой части обработки платежей, я был бы вне себя от радости.
Изменить: https://github.com/agiliq/merchant/blob/master/billing/gateways/authorize_net_gateway.py выглядит довольно красиво, еще не пробовал.
Изменить: [Для следующего проекта у меня есть authorize.net, я собираюсь внимательно посмотреть на: http://github.com/zen4ever/django-authorizenet Это выглядит довольно хорошо. Я не думаю, что он поддерживает постоянные платежи, хотя.]
В прошлом я сделал небольшие одноразовые реализации.
Для простого сообщения на шлюз оплаты AIM вы можете использовать что-то вроде этого:
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
Чтобы авторизовать, вы делаете что-то вроде:
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 good, we have authorized the card...
else:
error = "%s Please try again." % (r.split('|')[3])
то мы можем зафиксировать:
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]
Есть больше опций, способов запроса, нюансов в ответе на синтаксический анализ... Предполагаю, что b/c A
в AIM
означает advanced
, что доступны все параметры authorize.net.
http://developer.authorize.net/guides/AIM/
Я знаю, что ваш вопрос в том, что лучше. Лучше всего просто реализовать свой собственный небольшой запрос и ответ на ваши конкретные требования, а не пытаться выполнить api поверх api.
Всегда есть Paython: https://github.com/abunsen/Paython
В настоящее время поддерживается 5 + платежных шлюзов:
Вот пример:
from paython import CreditCard, AuthorizeNet
сначала установите карту:
credit_card = CreditCard(
number = '4111111111111111',
exp_mo = '02',
exp_yr = '2012',
first_name = 'John',
last_name = 'Doe',
cvv = '911',
strict = False
)
проверьте, действительно ли это:
if not credit_card.is_valid(): return 'houston, we have a problem' # checks card number + expiration date
Настройте данные клиента для зарядки, не все поля обязательны:
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')
авторизация в отношении шлюза, параметры включают вывод отладки или тестовые учетные данные:
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)
теперь вы можете решить:
api = AuthorizeNet(username='test', password='testpassword', debug=True, test=True)
gateway_response = api.settle(amount='0.05', trans_id='2156729380')
Недавно я написал этот API для Python и Authorize.net после того, как не смог найти тот, который поддерживал все функции Authorize.net.
Я понимаю, что это немного поздно, но, надеюсь, это помогает другим.
Недавно я столкнулся с Py-Authorize
, который имеет отличную документацию по сравнению с другими доступными пакетами. Вы можете установить его через:
pip install Py-Authorize
Кажется, что установлена зависимость (colondar
), которая при установке через pip
устарела, поэтому вы можете получить последнюю (на момент написания этой статьи), выполнив следующие действия:
pip install git+git://github.com/Pylons/[email protected]
Документы находятся здесь: http://vcatalano.github.io/py-authorize/index.html
Отлично работает в моем опыте, однако для проекта, который я использую, мне нужен только AuthCapture, а не ARB или что-то еще... попробуйте. Лучший пакет, который я нашел до сих пор.