支付宝PC端单笔支付同步回调session失效问题
一次调用支付宝PC场景下单笔支付之后同步回调遇到的session失效问题记录
问题描述:
调用支付宝接口:alipay.trade.page.pay,该接口请求参数中有两个返回地址需要设置,return_url是同步返回地址,用于支付成功后页面的跳转,notify_url是异步通知地址,用于支付宝服务器主动通知商户服务器里指定的页面。问题出在同步返回的时候,因为业务需要返回的地址需要用户的登陆信息,项目中的用的session会话管理,但是调用支付宝支付接口支付成功后返回该同步页面时,却被拦截器拦截,跳到登陆页面,需要输入用户的登陆信息,这种情况是不能忍的。。。⊙o⊙
问题分析:
1.考虑到这种情况,首先想到的就是session失效,可是session为什么会失效呢?
首先,session是服务器端为了保存状态而创建的一个特殊的对象。浏览器访问服务器时,服务器创建一个特殊对象session(该对象有一个唯一的id,称为sessionId,服务器会将sessionId以cookie形式发给浏览器,当浏览器再次访问服务器时,会将sessionId发送过来,服务器端可以利用这个sessionId找到相应的session对象)。
到此处判断是支付宝同步返回return_url的时候没有将sessionId发给浏览器,那我就把sessionId发给服务器,采用的解决办法是url重写,将sessionId拼接到return_url后面,格式为?SESSION=sessionId,尝试结果失败 >"<||||
为什么会失败呢,代表用这种方式服务器依然无法获得sessionId,服务器如何获取sessionId的呢?后台用的服务器是Tomcat,它在处理http请求时会解析请求消息头,从中获取sessionId,然后获取session对象,这也许是如上方法尝试失败的原因吧。
如上不可行后,又试想能不能继续用这种方式,我在要返回的页面把这个传过来的sessionId给当作请求参数获取,然后通过sessionId获取session,觉得这个想法似乎不错,很快就发现有阻力了(°ο°)Servlet2.1之后不支持SessionContext里面getSession(String id)方法。。。但是可以通过HttpSessionListener监听器和全局静态map自己实现一个SessionContext,到这里开始觉得自己的思路不对,我获取这个session之后呢。。。
接着怎么办呢,请求消息头是没办法改了,如何让请求消息头中带上cookie呢?在思考无效之后请教了身边大神,大神告诉我,你的return_url是用的花生壳的映射地址,类似http://a0167495a2.imtodk.net:11236/buy这种格式的url,而调支付接口之前的访问url都是http://localhost.8080/buy这种格式的url,所以导致session失效,真是一语惊醒梦中人啊,将域名端口改成一样之后,果然解决了。
分析为什么会这样呢,这是个cookie路径问题,浏览器在访问服务器上的某个地址时,会比较cookie的路径与改路径是否匹配,只有匹配的cookie才会发送给服务器,上面那两个路径怎么看都匹配不上,所以请求消息头中当然没有sessionId了,服务器也就获取不到session了。
ps:其实这个问题很傻,可是也废了两天时间,重要的是思考的过程,记录一下。
支付宝PC端单笔支付同步回调session失效问题的更多相关文章
- 支付宝PC端的支付(PHP)
现在的一个项目支付宝PC支付还是用的以前网关:https://mapi.alipay.com/gateway.do (是支付宝 2012年7月13日的3.3版本) 所以现在要做下支付宝PC支付的升级 ...
- 第三方支付过程中session失效问题
第三方支付过程中session失效问题 时间 2015-05-13 12:36:23 IT社区推荐资讯 原文 http://itindex.net/detail/53436-session-问题 ...
- 支付宝pc端支付接入PHP实现
引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...
- 支付宝PC端接入PHP
引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...
- PHP PC端支付宝扫码支付
前面的文章已经描述过在蚂蚁金服开放平台创建应用签约等流程,详见:PHP App端支付宝支付,这里就不多说了,剩下的分两步,第一步是支付前的准备工作,也就是整合支付类文件,我已经整合好可以直接用,代码开 ...
- 前端:微信支付和支付宝支付在pc端和h5页面中的应用
1:h5微信支付 使用的是https://pay.weixin.qq.com/wiki/doc/api/index.html 中的 (1):公司需要首先要配置公众号微信支付地址和测试白名单(支付的时 ...
- ASP.NET Core2.0 环境下MVC模式的支付宝PC网站支付接口-沙箱环境开发测试
1.新建.NET Core web项目 2.Controllers-Models-Views 分三个大部分 3.下载安装最新sdk 官方的SDK以及Demo都还是.NET Framework的,根据官 ...
- ASP.NET Core 2.0 使用支付宝PC网站支付
前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的 ...
- day114:MoFang:基于支付宝沙箱测试环境完成创建充值订单接口&服务端处理支付结果的同步通知和异步通知
目录 1.基于支付宝提供的沙箱测试环境开发支付接口 1.后端提供创建充值订单接口 2.前端调用AlipayPlus发起支付 3.注意:自定义APPLoader完成接下来的开发 4.下载支付宝沙箱钱包A ...
随机推荐
- OvO
OvO 知乎 网易云 图书馆 B站 小众软件 360极速浏览器下载 开源下载工具 下载地址1 下载地址2 下载地址3
- eclipse新建servers时选中tomcat版本后next是灰色的解决
有时在编辑器里删除server后就不能重新new了,因为不能点next. 试了下面的方法,可以用. 1.退出2.到[工程目录下]/.metadata/.plugins/org.eclipse.core ...
- Java中如何创建一个新的对象的/Creating Objects/
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't ...
- Webpack-dev-server的proxy用法
前言: devServer:{ contentBase:'./', proxy:{ // 当你请求是以/api开头的时候,则我帮你代理访问到http://localhost:3000 // 例如: / ...
- 通过GPLOT过程制作图形
通过GPLOT过程制作图形 和数据报表一样,图形也是展现数据的重要方法,图形的直观效果是数据报表无法替代的.SAS/GRAPH是SAS进行数据可视化展现的重 要组成部分,具有强大的作图功能.可以展现的 ...
- 学习Acegi应用到实际项目中(6)
在企业应用中,用户的用户名.密码和角色等信息一般存放在RDBMS(关系数据库)中.前面几节我们采用的是InMemoryDaoImpl,即基于内存的存放方式.这节我们将采用RDBMS存储用户信息. Us ...
- php日志报错child exited with code 0 after seconds from start
因为日志文件老是有这种提示: [27-May-2015 15:13:48] NOTICE: [pool www] child 3998 started [27-May-2015 15:13:59] N ...
- s6 传输层
标题 s6-1 传输层概述(2019-04-06 21:19) s6-2 UDP(2019-04-07 08:39) s6-3 通信模型(2019-04-07 08:47) s6-4 TCP 数据段( ...
- shell脚本学习-文件包含
跟着RUNOOB网站的教程学习的笔记 和其他语言一样,shell也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.shell文件包含的语法有两种形式 . filename # ...
- uboot常用的函数
http://blog.csdn.net/ooonebook/article/details/53206623 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...