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

17 投票
6 回答
10197 浏览
提问于 2025-04-15 15:27

我需要把authorize.net接入到我的订阅支付中,可能会用到CIM。我的需求很简单,就是每月定期收费,价格点也不多。客户的信用卡信息会存储在authorize.net上。

网上有很多库和代码片段,我想找一些推荐,看看哪个最好用。

  • Satchmo看起来功能太多了,而且有点复杂,不太适合我。
  • Django-Bursar似乎符合我的需求,但它的状态是alpha,可能还不太稳定。
  • adroll/authorize库看起来也不错。
  • CIM的XML API看起来还行,我可以直接和它们连接。

还有很多其他的代码片段。

考虑到我的需求比较简单,现在哪个选择最好呢?

6 个回答

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 中代表 advanced,所以所有 authorize.net 的选项都是可用的。

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

我知道你问的是哪个库最好……其实,可能最简单的方式就是根据你的具体需求,自己实现一些临时的请求和响应,而不是在一个 API 上再叠加一个 API。

16

简单来说,现有的解决方案都不符合我的需求。要么没人维护,要么没有注释,或者没有经过测试,甚至还缺少保存卡片的功能。所以我当然就自己做了一个解决方案,并且把它开源了:

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

这个工具可以处理基本的交易(使用AIM API),保存卡片(使用CIM API),以及定期付款(使用ARB API)。而且它有完整的文档和测试套件。

我想原来的提问者可能早就不再关注这个问题了,但如果这个工具能帮助其他人减少一些支付处理的麻烦,我会非常高兴。

1

说实话,我们最后选择了使用adroll授权库。Python和django-authorizenet看起来也很不错,我会去了解一下。

撰写回答