王振

王振的博客

他的个人主页  他的博客

django 支付插件开发 心得总结

王振  2010年05月18日 星期二 13:47 | 4754次浏览 | 1条评论

我自认技术不过关,但是完成之后还是自己有点体会,其间的问题和经验记下来,给以后大家一个参考。主要是支付宝和网银在线。

先说几句废话,以我自己的眼光看下 第三方支付 的业内行情。

支付宝给的接口很多,根据自己需求有不同的方案,大公司惯用的经营策略。很受不了支付宝的贪婪,每笔支付提成,年费,技术支付费。最让我感触颇深的是所谓“银行网关提前”。先前读文档的时候看到有资料,只要提交相应银行代码的参数,就可以将银行网关提前。我自然而然地以为就是一般B2C网站中,在本站选择支付银行,直接跳转到相应银行的订单支付页面。这样对用户掩盖了第三方支付接口。出人意料地,支付页面仍然跳转到了支付宝的结算页面,只是在备选的支付银行中默认选择了用户提交的。

打电话给客服,客服说这就是“银行网关提前”,我问那一些大点的B2C网站实现的这个功能貌似也付宝接口的啊,回答是他们是大公司……再问客服就算是特殊服务那至少也有个报价吧,回答更噎人,小公司就不先要想这些事了,单靠支付宝注册用户的订单就够你们发展了。

呃,总之,心里很不是滋味。

后来才想到去网银在线试试运气,网银很爽快地说虽然网站主页上没有提到,但也有这项服务,前提当然是给他们那么一笔钱,还好不是很多。

 

买了之后就专心做插件。完成支付宝、网银在线和快钱的。这是第一次做支付插件,但实际上原理都很简单。

第三方给你一个专属ID,然后在他们网站上填写个 KEY,双方都用这个KEY作为加密密钥。提交支付请求时,按照不同支付方的开发文档要求,将所需的支付信息,以字符串方式连接,加上KEY并用md5方式加密,然后将所需的支付信息和加密之后的密文,以POST/GET方式提交到支付网关。

查收支付结果一般用两种方式:服务器通知、页面返回。页面返回,就是用户完成支付之后,立即跳转到本站,提交支付结果。服务器通知则是第三方支付用POST方式向本站定时提交支付结果,如果本站完成验证反馈 成功,就结束服务器通知。文档里都有很详细的描述。

django基本上找不到已做好的插件,前段时间”好看簿"代码里面据说有支付宝的支付插件,我没看也不清楚。因为不是很难做,但是中间确实有些小问题,逐一解决后,把自己的心得贴在这里,够大家参考。

1。加密函数推荐用hashlib里的md5对象。

用法是:

import hashlib

text = "somewords"+key

str_md5 = hashlib.md5(text).hexdigest()

2。不知道大家习惯,但是最好至少在支付插件中使用“日志”。

因为中间debug信息很难收集到,尤其是服务器通知模式的情况下。而且,国内这些第三 方支付基本上都没有供测试使用的网关。官方的方案就是提交最小金额,也就是0.01元反 复测试。

自己写个简单的write_log(),可以放在工程目录下的helper.py里。

from django.conf import settings  #将PAY_lOG文件位置记录在settings里面 import datetime

def write_log(x):

""" write log to a file

"""

t = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

txt = '\n'+t+x f = open(settings.PAY_LOG,'a')     # 追加的方式打开文件,不要忘了设置读写权限 f.write(txt)

f.close()

return True

接口每次接受到请求就将Request信息记录在日志里,测试基本上就靠他了。

3。注意下接口文档提到的字符集设置,跟据文档要求字符集编码。

对于Query_Dict对象来说,urlencode()是个非常让人喜欢的方法,它的功能就是将 Query_Dict 字典用"&"字段连接起来,而且进行了url 编码。例如将"@"转化为"%40"使 之可以在浏览器地址中浏览。看起来很不错的功能,但是做支付接口时最好还是不要使 用。就简单的遍历数组,编码,用"&"连接好了。

HttpRequest.encoding属性是可写的。直接赋值'utf-8',之后用HttpRequest.POST就 可以简单实现编码了。

4。有一个很恶心的问题,我想N久才找到原因。

就是如果你发现日志文件里记录的Query_Dict为空的话,就意味着可能支付方反馈来信 息里没数据,然后我就去问客服了……其实,请首先检查下有没有在settings 里面开启了 供能PREPEND_WWW = True。我开了,然后支付请求通知里面写的接口地址是不带 www 的绝对路径……可想而知,第三方方将支付结果POST到example .com/XXXX/, Django为这个请求转向到WWW.example .com/XXXX/,请求方式改成GET并且不包 Query_Dict。

还有一点个人建议,即便网站是在测试阶段,最好还是将DEBUG关掉,然后设置好邮件服务器。在邮件中接收debug信息。这样的话,即便是这种 服务器通知方式的访问,也能看到debug信息。还有raise Http404 也是需要仔细斟酌位置的。

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
Ford Guo

回复 Ford Guo  2010年05月18日 星期二 23:24

多谢,收藏了.

0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号