You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Edge浏览器Web Push Notifications发送失败:400错误排查求助

Edge浏览器Web Push通知发送失败问题
  • 该功能在Chrome、Firefox、Safari中均可正常工作,但Edge浏览器无法接收推送通知。
  • 已成功在Edge中获取endpoint、auth和p256dh并保存至数据库,但使用Python的pywebpush库发送通知时,始终返回HTTP 400错误且无响应体,无法定位具体问题。
  • Edge返回的endpoint为https://wns2-db5p.notify.windows.com/w,查阅资料得知基于Chromium的浏览器应返回https://fcm.googleapis.com/fcm,不确定此信息是否准确。
  • Edge的通知授权流程与其他浏览器不同:请求授权时不会直接弹出窗口,仅在地址栏右侧显示图标,点击图标后才会弹出授权窗口。授权完成后虽已获取所需信息,但通知仍无法发送。已尝试将应用部署至线上环境(非localhost),问题依然存在。

前端获取订阅信息代码

const subscription = await registration.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: urlBase64ToUint8Array('<my-public-vapid-key>'),
});
const subscriptionAsJson = subscription.toJSON();
const p256dh = subscriptionAsJson.keys?.p256dh;
const auth = subscriptionAsJson.keys?.auth;
const endpoint = subscriptionAsJson.endpoint;

function urlBase64ToUint8Array(base64String: string) {
  var padding = '='.repeat((4 - base64String.length % 4) % 4);
  var base64 = (base64String + padding)
      .replace(/\-/g, '+')
      .replace(/_/g, '/');
  
  var rawData = window.atob(base64);
  var outputArray = new Uint8Array(rawData.length);
  
  for (var i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

发送通知的Python代码(基于Django)

vapid_claims = settings.VAPID_CLAIMS
parsed_endpoint = urlparse(device.notification_endpoint)
webpush(
    subscription_info={
        "endpoint": device.notification_endpoint,
        "keys": {
            "p256dh": device.p256dh,
            "auth": device.auth,
        }
    },
    data=data,
    vapid_private_key=settings.VAPID_PRIVATE_KEY,
    vapid_claims={
        "sub": vapid_claims["sub"],
        "exp": vapid_claims["exp"],
        "aud": f"{parsed_endpoint.scheme}://{parsed_endpoint.netloc}",
    },
)

Django相关配置

VAPID_PUBLIC_KEY = os.getenv("VAPID_PUBLIC_KEY")
VAPID_PRIVATE_KEY = os.getenv("VAPID_PRIVATE_KEY")
VAPID_CLAIMS = {
    "sub": "mailto:<my-email>",
    "exp": 60,
}

调整后的发送代码

webpush(
    subscription_info={
        "endpoint": notification_endpoint,
        "keys": {
            "p256dh": p256dh,
            "auth": auth,
        },
    },
    data=data,
    vapid_private_key=VAPID_PRIVATE_KEY,
    vapid_claims={
        "sub": vapid_claims["sub"],
        "exp": vapid_claims["exp"],
        "aud": f"{parsed_endpoint.scheme}://{parsed_endpoint.netloc}",
    },
    ttl=200,
)

内容的提问来源于stack exchange,提问作者Dean Koštomaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:29:52