Python/Django:我应该使用哪个authorize.net库?

17

我需要使用CIM实现authorize.net的订阅支付集成。需求很简单 - 每月循环付款,有几个不同的价格点。客户的信用卡信息将被存储在authorize.net上。

目前有很多库和代码片段可供使用,我正在寻找哪些是最好的选择。

  • Satchmo似乎比我需要的要复杂得多。
  • Django-Bursar 看起来就是我需要的,但它被列为测试版。
  • adroll/authorize library 也看起来不错。
  • CIM XML APIs看起来也不错,我可以直接与它们连接。

还有很多其他的代码片段可供使用。

考虑到我的相当简单的要求,目前哪种选择最佳?


1
你最终定下来用了什么,如果你不介意我问的话?我正在做一个有非常相似需求的项目。 - Brian Luft
目前还没有,但可能会尝试使用CIM XML API。随着我了解更多信息,我会更新问题,如果您也能这样做,我将不胜感激。 - Parand
6个回答

16
长话短说,现有的解决方案都不能满足我的需求。他们要么无人维护、缺少注释、未经测试,要么没有保存卡片信息。所以,我当然建立了自己的解决方案并开源它:
AuthorizeSauce:https://github.com/jeffschenck/authorizesauce 它处理基本交易(AIM API)、保存的卡片信息(CIM API)和定期付款(ARB API)。它已完全记录文档,并有完整的测试套件。
我希望原作者早已离去,但如果它能帮助任何其他人避免支付处理上的部分痛苦,我会感到非常高兴。

谢谢,有这样一些可用的东西真好,它们不是四年前的、未维护的或者一个巨大的问号。 - Jordan
@Jeff Schenck 服务器集成方法是否受支持? - ashim
我喜欢这个库;它是我见过的最简单、最符合Python风格的实现。 - Thane Brimhall
看起来不错。但是它不支持直接提交方法,对吗?据我所知,这比处理合规问题要好得多。 - Sergey Orshanskiy

9

编辑: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]

有更多的选项,请求方式,响应解析的细微差别...我认为因为AAIM中代表高级,所以所有authorize.net的选项都是可用的。

http://developer.authorize.net/guides/AIM/

我知道你的问题是哪个库最好...嗯,也许最容易的方法是针对你的特定需求实现自己的一小部分即兴请求和响应,而不是试图在api之上使用api。


如果有任何错误、建议或评论,我很乐意听取。也许我们可以构建一种漂亮、灵活、功能丰富但仍然轻量级的方式来做更多的事情。 - Skylar Saveland
同意。一个轻量级的实现会很棒。我刚在PyPi中发现了zc authorizedotnet。你有使用过吗? - Noah Watkins
我实际上有一个即将到来的项目,我打算尝试一下这个:http://github.com/zen4ever/django-authorizenet - Skylar Saveland

6

总有 Python: https://github.com/abunsen/Paython

目前支持 5+ 种支付网关:

  1. Authorize.net
  2. First Data/Linkpoint
  3. Innovative Gateway (from intuit)
  4. PlugnPay
  5. Stripe

以下是一个示例:

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

1
我知道现在有点晚了,但希望对其他人有所帮助。
最近我发现了一个名为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

就我个人而言,我们最终使用了adroll授权库。Paython和django-authorizenet看起来都很有趣,我们会去了解一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接