一次调用支付宝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. A Senior Interview

    1.How many time did they spent to plan the final project? 答:两天左右,两次开会. 4.How many time did they spen ...

  2. JSP页面使用include指令出现 Duplicate local variable basePath

    现有三个页面 " include.jsp " " a.jsp " " b.jsp " 页面代码如下 首先是a.jsp <%@ page ...

  3. 数组,arrayList和List

    数组,arrayList和List (1)数组在C#中是最早出现的.它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单.可以利用偏移地址访问元素,时间复杂度为O(1);可以用折半查 ...

  4. 分布式文件系统 fastdfs搭建

    fastdfs第一步:在home文件夹下建立tar文件夹第二步:cd /home/tar///(Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( e ...

  5. 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)

    传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...

  6. vue学习-自动行合并的table

    测试的效果 测试的html源码截图 v-table在tableGroup.js中定义,以下就render方法,行的所有单元格都在tableGrouper.js中处理 render:function(h ...

  7. 第十一章 DNS服务器管理与配置

    1.如何在WindowsServer 2008 系统中使用IIS进行多站点配置与管理? 1)运行“开始”–“程序”–“管理工具”–“服务器管理器”打开: 选择“WEB服务器(IIS)”,注意:首次安装 ...

  8. memcache启动报错:memcached: error while loading shared libraries: libevent-XXXXX5: cannot 。。。。

    创建连接 ln -s /usr/lib/libevent-2.1.so.6  /usr/lib/libevent-2.1.so.6 如果还不行就下面解决 执行下面语句查看链接地址 LD_DEBUG=l ...

  9. 管道/FIFO

    管道: #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h&g ...

  10. shell 命令 grep -R 查询包含指定内容的文件

    grep -R 举个栗子,在有上百个sql文件的目录下,查找使用 spark引擎 执行的文件. 代码是: grep -R spark ./* 返回的就是包含  spark 的sql文件名.