Python / Django: какую библиотеку authorize.net мне следует использовать? - PullRequest
17 голосов
/ 28 октября 2009

Мне нужна интеграция authorize.net для оплаты подписки, вероятно, с использованием CIM. Требования просты - регулярные ежемесячные платежи с несколькими различными ценовыми категориями. Информация о кредитной карте клиента будет храниться на authorize.net.

Вокруг довольно много библиотек и фрагментов кода, я ищу рекомендации, какие из них лучше всего работают.

  • Satchmo кажется больше, чем мне нужно, и похоже, что это сложно.
  • Джанго-Бурсар похоже на то, что мне нужно, но оно указано как альфа.
  • Библиотека adroll / authorize также выглядит довольно хорошо.
  • API-интерфейсы CIM XML выглядят не так уж плохо, я могу напрямую к ним подключиться.

И есть еще несколько других фрагментов кода.

Какой лучший выбор сейчас, учитывая мои довольно простые требования?

Ответы [ 6 ]

16 голосов
/ 18 августа 2012

Короче говоря, ни одно из существующих решений не отвечало моим потребностям. Они были либо необслуживаемыми, либо незакомментированными, либо непроверенными, либо не имели сохраненных карточек. Поэтому, конечно, я создал свое собственное решение и открыл его:

AuthorizeSauce: https://github.com/jeffschenck/authorizesauce

Он обрабатывает основные транзакции (API AIM), сохраненные карты (API CIM) и регулярные платежи (API ARB). Он полностью документирован и имеет полный набор тестов.

Я ожидаю, что оригинальный постер уже давно ушел, но если он поможет кому-то еще избежать некоторых трудностей с обработкой платежей, я был бы очень рад.

9 голосов
/ 30 марта 2010

Редактировать: 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's 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.

6 голосов
/ 10 мая 2011

Всегда есть Paython: https://github.com/abunsen/Paython

В настоящее время поддерживает 5+ платежных шлюзов:

  1. Authorize.net
  2. Первые данные / Linkpoint
  3. Инновационный шлюз (от интуита)
  4. PlugnPay
  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='john@localwoodshop.com', 
      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')
3 голосов
/ 13 июня 2013

Я недавно написал этот API для Python и Authorize.net после того, как не смог найти тот, который поддерживал бы все функции Authorize.net.

https://github.com/vcatalano/py-authorize

1 голос
/ 27 июня 2014

Я понимаю, что уже немного поздно, но, надеюсь, это поможет другим.

Недавно я наткнулся на Py-Authorize, в котором есть отличная документация по сравнению с другими доступными пакетами. Вы можете установить его через:

pip install Py-Authorize

Кажется, для установки зависимости (colondar), которая при установке через pip устарела, поэтому вы можете получить последнюю версию (на момент написания этой статьи), выполнив следующее:

pip install git+git://github.com/Pylons/colander.git@1.0b1

Документы здесь: http://vcatalano.github.io/py-authorize/index.html

Прекрасно работает на моем опыте, однако для проекта, в котором я его использую, мне нужен был только AuthCapture, а не ARB или что-нибудь еще ... попробуйте. Лучший пакет, который я нашел до сих пор.

1 голос
/ 31 августа 2011

Для чего мы стоили, мы использовали библиотеку авторизации adroll . И Paython, и django-authorizenet выглядят интересно, проверят их.

...