王振 2010年05月18日 星期二 13:47 | 4838次浏览 | 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 © 2024
京ICP备05028076号
回复 Ford Guo 2010年05月18日 星期二 23:24