现在不像前一段那么忙了,对去年作一个回顾系列吧。就在不久以前,发现忽然间从某个时段开始,网站预订的订单居然全部支付失败了。来麻烦了,客户投诉领导黑脸,搞得人很头大。
我们网站系统采用的是支付宝平台。用户要支付订单时,系统会提交含金额等订单信息、支付结果接收地址、签名等参数的请求到支付宝网关,支付宝网关处理请求后,将结果返回给请求参数中指定的接收地址,然后系统再处理支付结果,做设置订单状态输出提示信息等工作。方式和其它在线支付平台差不多。
开始怎么也没想到是支付宝那边的问题,白忙活了一天,才联系了支付宝客服,马上搞清了真相。本来支付成功后,支付宝会将消息发送到我们网站指定的地址上,我按照他们的接口说明文档,先验证签名再向支付宝网关验证消息ID有效性,再做处理。但大概从12月9号凌晨,支付宝做了次更新,支付消息中签名参数本来是在QueryString中,现在却改成以Post方式在Form中发送。我写的代码在Request.QueryString集合中没有找到sign参数,认为这是个非法请求,直接转到错误页面,自然也不会处理订单了。
问题是找到了,且不管支付宝做这个改动有无道理,也不论是不是以后该用Request代替Request.QueryString或Request.Form。还是有一些值得总结的经验的。
一、不能绝对相信任何公司、任何客服、任何文档。
二、为项目创建完善的日志模块,关键的网站请求的参数、数据库操作的Sql语句,为记日志损失一点性能是值得的。
三、系统必须可以随时迅速构建集成,保证测试性。第三点最让自己不爽。
总之,固然系统问题冰冻三尺、支付宝偶然忽悠了一下、主管项目的不管项目集成,由于自己经验也有限,黑锅不你一个人背还谁背。呵呵,百十块的绩效没了就没了,引以为训吧。
(PS: 已所不欲,勿施于人。要记得自己若开发或维护接口的话,可千万不能给别人制造这种麻烦)