Laravel 8集成Paytm支付网关时回调API未携带Authorization header问题求助
问题根因分析
auth:api中间件拦截的核心原因:Paytm回调分两种场景,要么是Paytm官方服务器发起的异步通知请求,要么是用户从Paytm页面跳转回你站点的同步回调,两类请求默认都不会携带你存在localStorage里的access token,自然无法通过Passport的身份校验。- 读取session为null的原因:Laravel默认的
api路由组没有挂载\Illuminate\Session\Middleware\StartSession::class中间件,在api路由下操作session不会持久化;且Paytm服务器发起的回调请求不会携带用户浏览器的session cookie,就算开了session也读不到对应数据。
解决方案
按两类回调场景分别处理:
场景1:Paytm服务端异步回调(必做,用于最终更新订单状态)
- 移除该回调接口的
auth:api中间件,该请求由Paytm官方服务器发起,无需用户登录态。 - 替换身份校验逻辑为Paytm官方签名校验:用后台存储的Paytm商户密钥对回调参数做签名校验,确认请求来源合法、参数未被篡改即可。
- 回调参数中会包含你发起支付时传入的
order_id字段,直接通过order_id关联对应订单和用户,无需登录态即可更新订单状态。
场景2:用户支付完成后跳转回你站点的前端同步回调
该场景用于给用户展示支付结果,可任选以下一种方式处理:
- 方式一:跳转携带临时标识
- 前端发起支付请求时,后端生成一个一次性有效、设置过期时间的临时token,和当前订单、用户绑定后存入数据库。
- 把该临时token作为回调地址的query参数传给Paytm,Paytm跳转回你站点时会自动带回该参数。
- 前端拿到query中的临时token后传给后端校验,校验通过后返回支付结果,同时失效该临时token避免重复使用。
- 方式二:直接读取本地存储的token
用户从Paytm跳转回你的站点时,依然是同域名环境,可以正常读取localStorage中存储的access token,你可以在跳转后的页面初始化时,直接拿本地的token请求支付结果接口即可,该方式实现简单,配合服务端异步回调做状态兜底即可。
原有session方案的修正方式(不推荐)
如果你要继续使用session存储token的方案,需要先给跳转前存session的接口、回调接口都挂载StartSession和EncryptCookies中间件(或直接分配到web路由组),才能正常读写session,该方案仅适用于前端同步回调场景,无法支持Paytm服务端异步回调。
内容的提问来源于stack exchange,提问作者fahad shaikh
相关产品推荐
相关产品推荐

