【问题标题】:Python/Django: Which authorize.net library should I use?Python/Django:我应该使用哪个 authorize.net 库?
【发布时间】:2010-12-10 21:48:28
【问题描述】:

我需要为订阅付款集成 authorize.net,可能使用 CIM。要求很简单 - 每月定期付款,有几个不同的价格点。客户信用卡信息将存储在 authorize.net 中。

周围有很多库和代码 sn-ps,我正在寻找关于哪个最有效的建议。

  • Satchmo 似乎超出了我的需要,而且看起来很复杂。
  • Django-Bursar 似乎是我需要的,但它被列为 alpha。
  • adroll/authorize library 看起来也不错。
  • CIM XML API 看起来还不错,我可以直接与它们连接。

还有很多其他的代码sn-ps。

鉴于我的要求相当简单,现在最好的选择是什么?

【问题讨论】:

  • 如果您不介意我的询问,您最终会选择什么?从事具有非常相似要求的项目。
  • 还没有,但可能会尝试 CIM XML API。当我了解更多信息时会更新问题,如果您也这样做,我将不胜感激。

标签: python django payment-gateway authorize.net


【解决方案1】:

长话短说,现有的解决方案都不能满足我的需求。它们要么未维护、未注释、未测试或缺少保存的卡片。所以我当然构建了自己的解决方案并将其开源:

授权酱:https://github.com/jeffschenck/authorizesauce

它处理基本交易(AIM API)、保存的卡片(CIM API)和定期付款(ARB API)。它有完整的文档,并有一个完整的测试套件。

我希望原始发帖人早就开始了,但如果它可以帮助其他人避免支付处理的一些痛苦,我会非常高兴。

【讨论】:

  • 谢谢,很高兴有可用的东西不是 4 岁、未维护或一个巨大的问号。
  • @Jeff Schenck 是否支持服务器集成方法?
  • 我喜欢这个图书馆;它很容易成为我见过的最简单、最 Python 的实现。
  • 看起来不错。但是,它不支持 Direct Post 方法,是吗?据我所知,这比处理合规问题要好得多。
【解决方案2】:

编辑: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 in AIM 代表 advanced 所有 authorize.net 选项都可用。

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

我知道你的问题是什么 lib 是最好的 .. 好吧,根据你的特定要求实现你自己的一点点临时请求和响应可能是最简单的,而不是试图通过一个 api 在上面一个 API。

【讨论】:

  • 哦,如果有任何发现缺陷,有建议,评论,我很想听听。也许我们可以构建一种灵活且功能强大但仍然轻量级的方式来做更多事情。
  • 同意。轻量级的实现会很棒。我刚刚在 PyPi 中找到了 zc authorizedotnet。你有这方面的经验吗?
  • 我实际上有一个即将进行的项目,我将尝试:github.com/zen4ever/django-authorizenet
【解决方案3】:

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

目前支持5+支付网关:

  1. Authorize.net
  2. 第一个数据/链接点
  3. 创新网关(来自 intuit)
  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')

【讨论】:

    【解决方案4】:

    我最近为 Python 和 Authorize.net 编写了这个 API,但未能找到支持 Authorize.net 全部功能的 API。

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

    【讨论】:

      【解决方案5】:

      不管怎样,我们最终还是使用了adroll authorize library。 Paython 和 django-authorizenet 看起来都很有趣,会去看看。

      【讨论】:

        【解决方案6】:

        我意识到这有点晚了,但希望它可以帮助其他人。

        我最近遇到了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 或任何东西......试一试。迄今为止我发现的最好的包。

        【讨论】:

          猜你喜欢
          • 2011-02-23
          • 2010-11-24
          • 2010-09-19
          • 1970-01-01
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多