一次调用支付宝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失效问题的更多相关文章

  1. 支付宝PC端的支付(PHP)

    现在的一个项目支付宝PC支付还是用的以前网关:https://mapi.alipay.com/gateway.do  (是支付宝 2012年7月13日的3.3版本) 所以现在要做下支付宝PC支付的升级 ...

  2. 第三方支付过程中session失效问题

    第三方支付过程中session失效问题 时间 2015-05-13 12:36:23  IT社区推荐资讯 原文  http://itindex.net/detail/53436-session-问题 ...

  3. 支付宝pc端支付接入PHP实现

    引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...

  4. 支付宝PC端接入PHP

    引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...

  5. PHP PC端支付宝扫码支付

    前面的文章已经描述过在蚂蚁金服开放平台创建应用签约等流程,详见:PHP App端支付宝支付,这里就不多说了,剩下的分两步,第一步是支付前的准备工作,也就是整合支付类文件,我已经整合好可以直接用,代码开 ...

  6. 前端:微信支付和支付宝支付在pc端和h5页面中的应用

    1:h5微信支付 使用的是https://pay.weixin.qq.com/wiki/doc/api/index.html  中的 (1):公司需要首先要配置公众号微信支付地址和测试白名单(支付的时 ...

  7. ASP.NET Core2.0 环境下MVC模式的支付宝PC网站支付接口-沙箱环境开发测试

    1.新建.NET Core web项目 2.Controllers-Models-Views 分三个大部分 3.下载安装最新sdk 官方的SDK以及Demo都还是.NET Framework的,根据官 ...

  8. ASP.NET Core 2.0 使用支付宝PC网站支付

    前言 最近在使用ASP.NET Core来进行开发,刚好有个接入支付宝支付的需求,百度了一下没找到相关的资料,看了官方的SDK以及Demo都还是.NET Framework的,所以就先根据官方SDK的 ...

  9. day114:MoFang:基于支付宝沙箱测试环境完成创建充值订单接口&服务端处理支付结果的同步通知和异步通知

    目录 1.基于支付宝提供的沙箱测试环境开发支付接口 1.后端提供创建充值订单接口 2.前端调用AlipayPlus发起支付 3.注意:自定义APPLoader完成接下来的开发 4.下载支付宝沙箱钱包A ...

随机推荐

  1. C++二分图匹配基础:zoj1002 FireNet 火力网

    直接给出题目吧... 问题 D(1988): [高级算法]火力网 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给出一个N*N的网格,用'.'表示空地,用'X'表示墙.在网格上放碉堡,可 ...

  2. PS扣签名

    1.用PS打开签名: 2.在图层界面切换到[通道],选择一个黑白分明或者明暗明显的签名图通道.按着“Ctrl”键就会显示出手指和方块的图标,按键的同时左击一下选择的通道: 3.切换到第一项的[图层]界 ...

  3. MySQL数据库(三)索引总结

    一.什么是索引?  索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存. 如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录 ...

  4. 整理CSS中display flex(布局利器)

    关于display:flex布局,有人了解颇深,我也是看着别人的东西学习的. display:flex的布局是什么.基本概念之类的我根本就不了解,只会用.每次看到概念之类的东西,我都是扫一眼就过去. ...

  5. pm2模块编写入门

    PM2 模块 PM2模块是通过PM2来安装和管理,代码可以托管在NPM中.任何人都可以创建和发布一个PM2模块,可以是日志模块.http代理模块.负载均衡模块.DNS服务器模块或任何类型的实用程序. ...

  6. linux 性能优化

    linux的性能优化: 1.CPU,MEM 2.DISK--RAID 3.网络相关的外设,网卡 linux系统性能分析: top:linux系统的负载,CPU,MEM,SWAP,占用CPU和内存比较的 ...

  7. 河北大学python选修课00次作业

    学习python认为挺好玩的一件事.看到很多关于python的东西在网上,看到有这个课,认为只是选修课,别人也可以选,自己想不能被别人落下,别人都会,我不会可不行. 而且认为python是一个很强大的 ...

  8. JVM指令集

    指令集,其实就是一系列指令的集合.例如我们需要给一个局部变量赋予1这个值,即这个动作:int a = 1; 在我们看来,这很简单,但对于机器来说需要很多个动作.所以Java虚拟机指令集就是将这些常用的 ...

  9. nginx安装配置并布置网站

    之前做的网站都是用的apache,关于apache和Nginx的区别也不说了,百度上也都有,而且apche和nginx可以共存,这个之后再说. 首先安装nginx,我用的云主机,直接用yum安装 #y ...

  10. 第69节:Java中数据库的多表操作

    第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...