支付宝即时到账接口使用历险记

来源:互联网 发布:海关数据怎么查 编辑:程序博客网 时间:2024/05/17 08:47

闲来无事,找来支付宝即时到账接口用了下。遇到一些事情,现在想回放下,看遍电影。

                       

如上图所示,支付宝官方给的使用流程,前3步客户做好自不必说,在第4、5步遇到一些问题:

1.支付宝跳转页面同步通知(return_url),这一块,支付宝给的示例中是使用表单get提交的方式,辗转跳向支付宝的,它是形如"<form>...</form><script>document.forms['alipaysubmit'].submit();</script>"的,这一段html直接使用out返回给客户浏览器,然后自动跳转向支付宝。注意,这里一开始我没有设置响应头信息response.setContentType("text/html"),导致测试谷歌、搜狗、百度、UC浏览器时,不能跳转,而是整个html被解析为字符串显示在页面上,而火狐、IE浏览器是可以跳转的。猜测,可能火狐、IE浏览器默认解析为"text/html"的,而谷歌、搜狗、百度、UC浏览器不是,致此问题;

2.在支付宝跳转页面同步通知(return_url)回来之后,不管是通过bean还是通过request.getParameter方式来获取参数,应该对参数进行new String(xxx.getBytes("ISO-8859-1"),"UTF-8")处理;

3.维持用户登录状态。有如下流程:

         用户登录商户系统 -> 跳转到支付宝支付 -> 在支付宝XXX操作 -> 支付宝返回return_url -> 页面显示用户充值后获得的积分

关键点在"支付宝返回return_url"这一步,请求回来时它请求头里是不带原先用户登录的jsessionid的,这样就导致它进入不了我这个使用spring security框架的商户系统,页面会跳转到用户登录界面,那么最后我的处理方案是,在去支付宝之前把用户登录的jsessionid写进cookie,然后同步通知回来之后先跳转到登录状态外的一个.do,在这个.do里面把请求头装载好cookie里的jsessionid,再次翻进登录状态,显示那个用户充值后的积分;

4.return_url翻进登录状态自后,不应该傻乎乎的给用户充积分,应该再一次判断通知是不是支付宝发回来的,判断这一个订单有没有处理过,防止重复处理订单,为此要数据库单独创建个存储订单的表了;

5.业务流程。在用户去支付宝之前,我把订单创建好并且存入数据库,置装态为"WAIT_BUYER_PAY",等到用户支付完毕,从支付宝回来,我对订单做好判断后,给用户充积分,然后更新订单状态为"TRADE_CLOSED";

6.发现有时候支付宝支付成功之后,页面就停止了,不跳转回我的商户网页,所以只使用支付宝跳转页面同步通知(return_url)是有风险的,所以我还加上支付宝服务器异步通知(notify_url),确保用户充完值积分就充上,维护消费者利益;

7.一点疑虑,对于支付宝跳转页面同步通知(return_url)不放心,虽然notifyid的生命期只有1分钟,虽然有sign校验,但只要攻击者对请求模拟的足够,速度足够,那么我的积分岂不是白白送人了?那我的钱呢?

8.在调试支付宝的过程中遇到一个 错误代码 CALL_LIMITED ,在支付宝及时到账接口开发文档里没找到该错误代码,不知是神吗错误。

电影,完了。

0 0