You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无需Messenger Extensions在浏览器获取Facebook PSID的技术求助

解决桌面端重定向后无法获取PSID的问题

我之前也碰到过类似的场景,桌面端Messenger的跳转逻辑确实和移动端不一样——桌面端打开外部链接会直接跳转到系统浏览器的新标签页,彻底脱离了Messenger的webview环境,这就是你调用Messenger Extensions报错的核心原因,毕竟这个API只能在Messenger的内嵌webview里正常工作。下面是几个不需要依赖支付网站传参的可行方案:

方案1:通过Facebook登录关联PSID

这是桌面端最可靠的解决方案,核心思路是用Facebook登录拿到用户的Facebook ID,再和你后端存储的PSID做关联:

  • results.html页面集成Facebook登录组件,只请求最基础的权限(比如public_profile)就行,不用申请过多权限
  • 用户完成登录后,前端把拿到的Facebook ID传给你的后端
  • 早在用户第一次和Messenger机器人互动时,你就可以调用Graph API(GET /{psid}?fields=id)获取用户的Facebook ID,把PSID和这个ID绑定存在数据库里
  • 现在通过登录拿到的Facebook ID,就能直接从数据库里匹配到对应的PSID了

方案2:利用同域名Cookie留存PSID

如果你的支付发起页是在Messenger webview里加载的,可以试试用Cookie传递PSID:

  • 在用户点击支付按钮的页面(这个页面处于Messenger webview环境),设置一个HttpOnly、Secure的Cookie,把PSID存入其中,域名指定为mydomain.com
  • 当支付完成重定向回results.html时,因为是同一个域名,浏览器会自动携带这个Cookie,你的后端直接读取Cookie就能拿到PSID
  • 注意:如果桌面端浏览器禁用了第三方Cookie可能有影响,但这属于第一方Cookie,大部分浏览器默认是允许的

方案3:强制在Messenger webview内打开支付页面

如果能调整支付发起的方式,可以尝试用Messenger Extensions的openBrowser方法打开支付链接:

  • 在支付发起页(处于Messenger webview内),调用以下代码:
    window.extAsyncInit = function() {
      MessengerExtensions.openBrowser('你的支付链接', {}, function success() {}, function error(err) {});
    }
    
  • 这个方法会强制在Messenger的内嵌webview里打开链接,不会跳转到外部浏览器,这样支付完成重定向回来后,页面依然在Messenger环境中,就能正常调用Messenger Extensions获取PSID了
  • 虽然你说支付网站不受控制,但这个操作是由你的页面发起的,不需要支付网站做任何修改,可以试试是否生效

额外说明

移动端之所以正常,是因为移动端Messenger默认会用内嵌webview打开外部链接,不会脱离Messenger的上下文;而桌面端Messenger的逻辑是直接唤起系统浏览器,导致页面彻底脱离了Messenger的环境,Messenger Extensions自然就失效了。

内容的提问来源于stack exchange,提问作者Bence Gedai

火山引擎 最新活动