PythonTip >> 博文 >> 杂项其他

支付宝即时到帐接口的python实现

zihua 2013-09-26 01:09:37 点击: 3845 | 收藏


支付宝即时到帐接口的python实现,网上早已经有人给出。Google了一圈,看了些牛人写的代码,说实话,都没入我的法眼。不是封装性不好,就是依赖某个框架或平台,不具有通用性。本想直接拿来用的,这样看来只好自己动手写了。

在支付宝官网上下载了相应的文档与示例代码。文档很长,很规范,通篇看下来不知所云,代码很乱,很臭,看得人头晕眼花,都没法看啊。即使这样,官 方示例中没有python的例子。关于支付宝的文档及代码的质量问题网上有批的,最早看到这些时,还不以为然,人家是大公司,岂能做出让我辈随便议论的代 码?

不过,话说回来了,看代码,比看那个文档要轻松点。被逼无奈,我只好挑Java/JSP的例子来看,主要是自认熟悉Java。我现在给出的这个 python代码,事实上是原官方Java实现的重新调整、重新组织,再转成python语言实现。主要是考虑封装与通用,力求做到在重用时不需要改动其 中任何代码,另外,做到与框架无关,封装成python模块,不依赖特定框架,使用时引入简单该模块即可。

简单说下,这个支付宝接口的原理:

1、在商家页面产生一个包含付款细节表单,该表单将提交到支付宝指定的URL(即表单的Action为支付宝指定的URL,可以是POST方法,也可以是GET方法)。

2、异步回调,用户在支付宝付款成功后,支付宝回调商家指定的URL,并回传支付相信的信息(使用POST方法)。

3、跳转回调,用户在支付宝付款成功后,支付宝页面会将用户带回到商家指定的URL,并回传支付成功的相关信息(使用GET方法)。

实际运行中,异步回调要早于跳转回调。

在这三步通信过程当中,都要对GET、POST数据进行MD5摘要,摘要时,必须包含支付宝为商家生成的key。在产生表单时,需要对数据和 key一起进行MD5摘要,并将结果附加在提交的数据中。支付接口实现在收到数据时,即上面提到的第2点及第3点,同样要对数据进行MD5接要,以此来验 证数据是否正确、是否来自支付宝。除了通过MD5加KEY来确保数据的真实有效,支付宝还提供有另外一个URL,允许商家网站在收到回调后,通过此URL 验证收到的数据是否真实有效。

要想成功与支付宝集成,有两点至关重要:1、提供必要的数据项;2、做MD5摘要时,数据项必须排序(升序)后进行,支付宝在处理时也按照此顺序处理,这样才能获得同样的MD5摘要。

具体实现见附件。

以下代码由实际项目中剪出(使用webpy),用以说明该模块的使用方法。

1、在处理支付的模块中,引入alipay模块,并创建alipay类的实例:

import alipay  
...  
#替换其中相关内容即可。  
alipayTool=alipay.alipay(  
                partner="支付宝身份ID",  
                key="支付宝生成的key",  
                sellermail="商家支付宝帐号(邮箱)",  
                notifyurl="异步回调的URL",  
                returnurl="跳转回的URL",  
                showurl="显示网站商品的URL"  
                )

2、在支付页面(即用户点击支付按钮即转到支付宝付款的页面),我们需要在这个页面产生一个隐藏的表单,用来提交订单信息:

#支付信息,订单号必须唯一。  
#以下包含的内容替换为实际的内容。  
params={  
      'out_trade_no':<订单号>,  
      'subject'     :<订单subject>,  
      'body'        :<订单说明>,  
      'total_fee'   :<订单总额>  
}  
payhtml=alipayTool.createPayForm(params)  
#将payhtml写到页面,这是个包含有提交按钮的表单 

3、异步回调处理:

# f 为包含POST过来的数据python字典,即名-值对。  
# verify 是否回调支付宝确认数据是否真实有效  
# rlt为处理的结果,为success或fail  
 
rlt=alipayTool.notifiyCall(f,verify=True)  
 
#依据支付宝的要求,此URL返回的值为success或fail  
#因此,当rlt为success时(即支付成功),做相应的处理  
#然后,直接将rlt写到输出流。  
 
if rlt=='success':  
     paySuccess(f['out_trade_no'])  
 
return rlt 

4、跳转回调处理:

#注意,与异步回处理相同,在跳转回调的处理上,仍是调用notifiyCall函数  
#并且参数与返回完全一样。  
 
rlt=alipayTool.notifiyCall(f,verify=True)  
 
#只是验证后的处理不同,这里需要给用户显示一个页面。  
if rlt=='success':  
   paySuccess(f['out_trade_no'])  
   #显示支付成功的页面  
   .....  
else:  
   #显示未能成功支付的页面  
  ..... 

通过上面的4个步骤,我们就可以成功的与支付宝集成,并且实现了回调验证。

实际运行的例子,在这里:http://www.532vpn.com/ ,做个广告,欢迎支持。

alipay模块依赖的两个外部模块为hashlib与urllib2,另外,使用的字符编码UTF-8。其他字符编码要做些改动,但我未做测试。

原文

原文链接:http://www.simple-is-better.com/news/161

作者:zihua | 分类: 杂项其他 | 标签: api 支付宝 | 阅读: 3845 | 发布于: 2013-09-26 01时 |