Python/Django: 我应该使用哪个authorize.net库?
我需要把authorize.net接入到我的订阅支付中,可能会用到CIM。我的需求很简单,就是每月定期收费,价格点也不多。客户的信用卡信息会存储在authorize.net上。
网上有很多库和代码片段,我想找一些推荐,看看哪个最好用。
- Satchmo看起来功能太多了,而且有点复杂,不太适合我。
- Django-Bursar似乎符合我的需求,但它的状态是alpha,可能还不太稳定。
- adroll/authorize库看起来也不错。
- CIM的XML API看起来还行,我可以直接和它们连接。
还有很多其他的代码片段。
考虑到我的需求比较简单,现在哪个选择最好呢?
6 个回答
编辑: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]
还有更多的选项、请求方式,以及解析响应时的一些细节……我猜因为 A
在 AIM
中代表 advanced
,所以所有 authorize.net 的选项都是可用的。
http://developer.authorize.net/guides/AIM/
我知道你问的是哪个库最好……其实,可能最简单的方式就是根据你的具体需求,自己实现一些临时的请求和响应,而不是在一个 API 上再叠加一个 API。
简单来说,现有的解决方案都不符合我的需求。要么没人维护,要么没有注释,或者没有经过测试,甚至还缺少保存卡片的功能。所以我当然就自己做了一个解决方案,并且把它开源了:
AuthorizeSauce: https://github.com/jeffschenck/authorizesauce
这个工具可以处理基本的交易(使用AIM API),保存卡片(使用CIM API),以及定期付款(使用ARB API)。而且它有完整的文档和测试套件。
我想原来的提问者可能早就不再关注这个问题了,但如果这个工具能帮助其他人减少一些支付处理的麻烦,我会非常高兴。
说实话,我们最后选择了使用adroll授权库。Python和django-authorizenet看起来也很不错,我会去了解一下。