提供Paypal API的实用工具
项目描述
使用本包,您可以在基于Python或Zope / Plone的环境中使用PayPal NVP API。它支持PayPal的ExpressCheckout和DirectPayment API。
您需要一个PayPal开发者账户。
请注意,DirectPayment API仅适用于美国或英国的商业账户。
gocept.paypal
基本设置
首先,我们需要导入一些包并设置测试浏览器
>>> import cgi >>> import os >>> import urlparse >>> import zope.component >>> import gocept.paypal.paypal >>> import gocept.paypal.interfaces >>> from zc.testbrowser.browser import Browser >>> browser = Browser() >>> browser.mech_browser.set_handle_robots(False) >>> callback_url = os.environ['pp_api_callback_url'] >>> callback_cancel_url = os.environ['pp_api_callback_cancel_url']
然后,我们需要一个PayPalDataProvider,它为我们的PayPal API提供有关您的PayPal商业账户和API凭证的信息
>>> class PPData(object): ... zope.component.adapts(gocept.paypal.interfaces.IPayPal) ... zope.interface.implements( ... gocept.paypal.interfaces.IPayPalDataProvider) ... ... username = os.environ['pp_api_username'] ... password = os.environ['pp_api_password'] ... signature = os.environ['pp_api_signature'] ... version = os.environ['pp_api_version'] ... api_endpoint = os.environ['pp_api_endpoint'] ... paypal_url = os.environ['pp_api_url'] ... currency = os.environ['pp_currency'] ... ... def __init__(self, context): ... self.context = context
在SiteManager中注册DataProvider
>>> gsm = zope.component.getGlobalSiteManager() >>> gsm.registerAdapter(PPData)
此测试在开发模式下运行,这意味着只有虚拟货币正在转移。为了使事情正常工作,我们必须在Paypal开发者网站上登录。在生产环境中,此步骤不是必需的
>>> browser.open('https://developer.paypal.com/') >>> browser.getControl(name='login_email').value =\ ... os.environ['pp_dev_username'] >>> browser.getControl(name='login_password').value =\ ... os.environ['pp_dev_password'] >>> browser.getControl(name='submit').click() >>> 'Now loading,' in browser.contents True
使用PayPal ExpressCheckout API
设置Paypal API
>>> paypal = gocept.paypal.paypal.PayPal()
我们现在发起一个新的支付请求,金额为1,000美元,并通过API获取一个令牌。callback_cancel_url是URL,如果买家手动取消交易,PayPal将重定向买家。在其他所有情况下,将使用callback_url。
>>> amt = 1 >>> token = paypal.SetExpressCheckout(amt, callback_url, ... callback_cancel_url)
使用令牌作为参数调用PayPal网站,登录并点击继续。在生产环境中,这一步由买家完成。
>>> url = '%s%s' % (os.environ['pp_api_url'], token) >>> browser.open(url) >>> browser.getControl(name='login_email').value =\ ... os.environ['pp_buyer_username'] >>> browser.getControl(name='login_password').value =\ ... os.environ['pp_buyer_password'] >>> browser.getControl(name='login.x').click() >>> browser.mech_browser.set_handle_redirect(False) >>> browser.getControl(name='continue.x', index=0).click() Traceback (most recent call last): ... httperror_seek_wrapper: HTTP Error 302: Found >>> browser.mech_browser.set_handle_redirect(True)
用户现在被重定向到callback_url。令牌作为GET参数提交,我们需要捕获它。
>>> url = browser.mech_browser.response().hdrs['location'] >>> query_string = urlparse.urlparse(url)[4] >>> token = cgi.parse_qs(query_string)['token'][0]
有了令牌,我们现在可以(但不一定必须)调用GetExpressCheckoutDetails,该调用返回有关买家的信息和交易状态。在大多数情况下,此调用是必要的,以获取payerid,这是完成流程所需的。
>>> express_tokens = paypal.GetExpressCheckoutDetails(token, callback_url, ... callback_cancel_url) >>> express_tokens['ACK'] == 'Success' True
为了完成交易,我们必须调用DoExpressCheckoutPayment,并提供有关交易的大量信息。
>>> payerid = express_tokens['PAYERID'] >>> pay_tokens = paypal.DoExpressCheckoutPayment( ... express_tokens['TOKEN'], payerid, amt, callback_url, ... callback_cancel_url)
pay_tokens字典包含关于完成交易的所有必要信息。在测试案例中,我们仅检查一切是否正常。
>>> pay_tokens['ACK'] 'Success'
控制支付流程
有时需要更改默认的支付流程。一个案例可能是向付款人显示的不是登录页面,而是账单页面。如果有一群没有PayPal账户的用户,这可能会很有用。
为了控制流程,我们为SetExpressCheckout使用额外的关键字参数。
>>> amt = 1 >>> token = paypal.SetExpressCheckout(amt, callback_url, ... callback_cancel_url, ... LANDINGPAGE='Billing')
使用令牌作为参数调用PayPal网站,登录并点击继续。在生产环境中,这一步由买家完成。
>>> url = '%s%s' % (os.environ['pp_api_url'], token) >>> browser.open(url) >>> print browser.contents <!DOCTYPE ... ...Create a PayPal Account or Log In... >>> browser.getControl("First Name") <Control name='first_name' type='text'>
使用DirectPayment API
如果您买家没有PayPal账户,或者您想接受基于信用卡的直接支付,您可以使用DoDirectPayment API,该API需要一些额外的信息,如信用卡号码等。请参阅PayPal API文档以获取更多信息。
>>> pay_direct_token = paypal.DoDirectPayment( ... 1.00, ... '192.168.0.1', ... os.environ['pp_buyer_cc_number'], ... '052018', ... '123', ... 'David', ... 'Duchovny', ... 'VISA', ... 'Mainstreet 21', ... 'New York', ... 'NY', ... '12345', ... callback_url, ... callback_cancel_url, ... ) >>> pay_direct_token['ACK'] 'Success'
变更
0.1.10 (2010-03-30)
允许为SetExpressCheckout提供关键字参数以控制支付流程。
0.1.9 (2008-06-26)
错误修复版本
0.1.8 (2008-05-17)
改进了从回调URL获取令牌的方式
修复了DoDirectPayment中的一个错误,导致PayPal始终请求项目金额
0.1.7 (2008-05-16)
开始记录变更日志
修复了PayPal网站上多个继续按钮导致测试崩溃的错误
增加了指定交易货币的支持(之前仅限USD)
将PayPal登录信息移动到buildout.cfg
改进了文档
项目详情
gocept.paypal-0.1.10.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 159ae398c850c717a5992a7ed948d29c409afdbb02c433df9181ab622679929c |
|
MD5 | c74e3d3ed2b6d52ef9e18b7ccbbc75be |
|
BLAKE2b-256 | ebf1c6e7a57b93481b4d6fc7d8480d0d617c58cc52900180448374a0cf4edd88 |