跳转到主要内容

提供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 (8.7 kB 查看哈希值)

上传时间

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面