Django中使用PayPal Express Checkout

近在做网站和PayPal的整合工作,图个省事,就用了 django-paypal 这么个app。使用起来也挺是简单,Website Payment Standard的文档写得非常清楚(其实应该说例子代码复用性相当高……)。由于PayPal的IPN和PDT需要直接POST信息到服务器,所以除了测试需要公网环境必须在服务器上进行外,其他没啥难度就搞通了。

就这么悠闲了几天,准备把代码部署到产品环境了。这时候一个PayPal的工程师跑了出来,发了一封巨长的邮件列举了各种要求,然后再看了当前的demo后说,你用的的WPS啊,这样分数不高哦,你得用Express Checkout。我#%!#¥,我们能收钱就行,管你们分数如何,不过老板下令修改,咱也只好遵命。

于是再翻开django-paypal的文档,相当可喜的是,据称其是支持Express Checkout的,相当可气的是,这文档说和没说没啥区别,于是只能看源码了……

使用Express Checkout,首先需要搞清其付费流程。PayPal的文档说的是挺玄乎,但其实说白了就是OAuth。用户点击付费后首先将用户带向PayPal,用户在PayPal上登录后将返回一个付费授权给网站,之后网站在走完一些必要流程后真正需要付费时,再将刚才获得的授权和付费请求发送给PayPal,完成付费动作。和WPS不同的地方就是付费动作是在商家网站而不是PayPal,就我感觉其实对用户来说区别不大……

OK,理解了ECP之后,要使用ECP,需要在Paypal网站上申请API认证,成功后可以获得API用户名密码,以及一个认证签名。

在获得了API资格后,我们就可以开始Django部分了。首先是修改 settings.py ,除了按照文档要求启用 paypal.pro 外,还需要加入以下设定:

PAYPAL_WPP_USER      = 'API用户名'
PAYPAL_WPP_PASSWORD  = 'API密码'
PAYPAL_WPP_SIGNATURE = 'API认证签名'

完事后可以继续按照django-paypal的文档定制付费的view,PayPalPro的参数还支持传入context来渲染模板。不过需要注意的是, 在HTTP GET中如果没有express这么个参数的话,django-paypal默认会使用直接信用卡支付的方式。由于没有这个需求,直接使用嫁接改了这个行为:

from paypal.pro.views import PayPalPro

def ppp_call(self, request):
    self.request = request
    if request.method == "GET":
        if self.should_render_confirm_form():
            return self.render_confirm_form()
    else:
        if self.should_validate_confirm_form():
            return self.validate_confirm_form()
    return self.redirect_to_express()
PayPalPro.__call__ = ppp_call

另外由于 validate_confirm_form() 这个方法在验证失败时又会调用信用卡支付,为了改动最少代码,我是直接将 payment_template 的模板改成了提示付款失败的形式,这在用户使用伪造的PayPal授权进行付款时会用到。

基本就是这样的吧,做Express Checkout的整合有个优点是不再需要在公网环境下进行调试,因为每次API调用后PayPal的返回信息是使用的重定向,除非网站仍然使用IPN外来获取支付完成信息,127.0.0.1这样的地址照样可行。

对“Django中使用PayPal Express Checkout”的2条评论

  1. Avatar

    朋友,能给个EC整合的DEMO吗?急需帮助!谢谢!QQ:30635695

  2. Avatar

    Hello Jay, I also have some problems in using your recommended django-paypal, (express checkout). Have you successfully implement it? I need some suggestion and instructions from you. My email is "leeegg@live.com" you could contact me directly.

    Thanks.

发表评论

评论备注:

  1. 留言时的头像是Gravatar提供的服务。
  2. By submitting a comment here you grant this site a perpetual license to reproduce your words and name/web site in attribution. So, you don't fully own your words, so to speak.