很多网站在手机浏览器中显示正常,转发到微信后却会出现字体过小、按钮难点、分享标题不对、登录反复跳转或支付无法调起等问题。原因在于“适配微信”包含两个层面:页面本身要适合移动设备,涉及分享、身份和支付时,还要接入微信提供的网页能力。

如果网站只是文章、企业介绍或下载说明,重点通常是移动布局和分享体验;如果包含会员、订单、活动报名等业务,则可能进一步用到网页授权、JS-SDK和微信支付。并不是每个网站都需要把所有接口接一遍。

 网站微信适配要做什么?从内置浏览器到JS-SDK

适配微信不只是做手机版

微信中的网页仍然是普通网页,由微信内置浏览器打开。HTML、CSS和JavaScript的基础规则没有改变,因此第一步依旧是做好响应式设计,而不是先判断微信User-Agent后复制一套页面。

在此基础上,微信又提供了一些普通浏览器没有的能力,例如自定义分享内容、选择图片、扫码、公众号网页授权和开放标签。这些功能通常需要公众号或相关应用资质、域名配置以及服务端签名。

可以把适配工作分成三层:

  • 基础页面层:布局、字体、图片、表单和加载速度。

  • 微信交互层:分享、扫码、定位、图片选择等JS-SDK能力。

  • 业务接入层:用户授权、微信支付和小程序衔接。

先把移动端基础做好

页面应在head中设置移动视口,让浏览器按照设备宽度渲染,而不是把桌面页面整体缩小:

<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">

布局尽量使用Flex、Grid、百分比和max-width,不要把正文容器、图片或表单写成固定桌面宽度。图片和视频可以限制在父容器以内:

img,
video {
  max-width: 100%;
  height: auto;
}

手机页面通常更适合单栏结构。导航、浮动按钮和弹窗也要考虑窄屏空间,避免关闭按钮贴近屏幕边缘或被底部操作栏遮挡。

触控按钮不能只追求视觉紧凑。购买、提交、复制和关闭等操作应留出足够点击范围,相邻按钮之间也需要间距。不要只为桌面的鼠标悬停设计提示,因为手机上没有稳定的hover操作。

处理刘海屏与系统字体

部分手机存在圆角、刘海和底部手势区域。使用viewport-fit=cover后,可以配合安全区域变量给固定导航或底部按钮留出空间:

.page-header {
  padding-top: env(safe-area-inset-top);
}

.bottom-action {
  padding-bottom: env(safe-area-inset-bottom);
}

正文也不宜依赖过小字号。微信用户可能调整系统或客户端字体大小,如果页面通过固定高度强行限制文本区域,字体放大后容易出现截断和按钮错位。

更稳妥的方式是让文字容器根据内容自然增高,减少固定行高与固定高度的组合,并允许用户缩放页面。为了保持视觉一致而禁用缩放,会影响视力不便用户的正常阅读。

微信能力依赖域名配置

接入微信JS-SDK前,通常需要在微信公众平台配置JS接口安全域名。需要网页授权时,还要配置网页授权回调域名;涉及支付,则需按支付产品设置授权目录或支付域名。

这些配置不是同一个概念。分享配置正常,并不代表网页授权和支付自然可用。开发时应分别检查:

  • 当前公众号是否具备所需接口权限。

  • 页面域名是否已经加入对应的安全域名配置。

  • 回调地址是否属于已配置域名。

  • 支付页面是否位于有效支付目录中。

  • 测试环境与正式环境是否使用了不同域名。

生产网站建议统一使用HTTPS,并减少HTTP与HTTPS、带www与不带www之间的多次跳转。域名和页面地址不稳定,会增加授权回调、签名和分享链接排查难度。

分享卡片需要单独接入

网站设置title、description和页面图片,是普通网页的基础工作,但不能把微信分享卡片完全寄托在这些标签上。需要稳定控制分享标题、描述、链接和缩略图时,应按照微信JS-SDK流程配置分享接口。

典型流程是由服务端获取相关票据,再使用随机字符串、时间戳和当前页面URL生成签名,前端通过wx.config完成权限验证。AppSecret、access token和签名密钥不能写进网页JavaScript。

前端通过权限验证后,再设置发送给朋友和朋友圈的分享信息:

wx.ready(function () {
  wx.updateAppMessageShareData({
    title: pageTitle,
    desc: pageDescription,
    link: shareUrl,
    imgUrl: shareImage
  });

  wx.updateTimelineShareData({
    title: pageTitle,
    link: shareUrl,
    imgUrl: shareImage
  });
});

参与签名的页面URL通常要去掉井号及其后的片段,并保持与后端收到的URL一致。单页应用在路由切换后如果页面地址发生变化,也要重新判断是否需要获取签名。

分享链接应使用长期有效的规范地址,不要携带登录Token、临时授权码或用户隐私参数。缩略图也应使用外部能够稳定访问的图片,而不是本地路径或需要登录才能读取的资源。

登录授权按实际需求接入

只有业务确实需要识别微信用户时,才有必要接入公众号网页授权。普通文章阅读、产品介绍和公开下载页面,没有必要一打开就要求用户授权。

微信公众号网页授权常见作用域包括snsapi_base和snsapi_userinfo。前者主要用于静默获取用户标识,后者涉及用户确认及更多信息。应按照最小权限原则选择,不要为了以后可能使用而默认申请更多数据。

授权流程应由后端参与完成:

用户进入业务页面
→ 跳转微信授权
→ 微信返回一次性code
→ 服务端交换授权结果
→ 建立网站自己的登录会话
→ 返回原业务页面

服务端应校验state参数,防止授权回调被伪造或串用。一次性code、访问凭据和AppSecret也不应暴露给前端或写入页面地址。

还要避免授权循环。常见原因包括登录Cookie无法保存、回调域名不一致、每次刷新都重新发起授权,以及授权完成后没有正确恢复原始页面。

微信内外支付场景不同

网站支持微信支付时,需要先判断用户在哪种环境中付款。微信内公众号网页通常使用JSAPI支付;普通手机浏览器中的网页则属于微信外H5支付场景。

两者的下单接口、业务配置和客户端调起方式不同,不能因为都是“H5页面”就使用同一套流程。

支付订单应由服务端创建和签名。前端只负责展示订单并调用对应支付能力,订单金额、商品内容和支付状态不能由浏览器单方面决定。支付完成后,也不能只相信前端的成功回调,应以服务端查询结果或微信支付通知为准。

网站同时面向微信内外访问时,可以在业务层分别准备JSAPI支付和H5支付入口;无法调起时,应给出明确提示,而不是让按钮点击后没有反应。

网页与小程序如何衔接

已经拥有小程序的网站,可以在微信网页中使用开放标签引导用户进入指定小程序页面。常见方式是wx-open-launch-weapp,但需要完成JS-SDK配置,并在wx.config中声明相应的开放标签。

开放标签不能只看桌面浏览器中的HTML效果。它的显示和跳转依赖微信客户端版本、公众号与小程序关系、域名及接口权限,必须使用真实微信环境测试。

在微信外部浏览器中,则应根据官方提供的URL Link、URL Scheme或业务落地页方案处理。网页内开放标签和外部浏览器唤起方式不是完全相同的能力。

无论采用哪种方式,都应保留普通网页入口。小程序无法打开、客户端版本不支持或用户不愿跳转时,核心信息仍应能够在网页中查看。

不要过度依赖环境判断

通过User-Agent可以大致识别页面是否位于微信内,但不适合把它当作唯一业务判断依据。客户端版本、系统和可用接口可能不同,应结合wx.ready、wx.error和wx.checkJsApi等机制判断能力是否真正可用。

页面应为微信接口失败准备降级方案:

  • 自定义分享失败时,页面本身仍可正常浏览和复制链接。

  • 微信授权不可用时,允许使用网站账号或其他登录方式。

  • 小程序跳转不支持时,显示普通网页按钮。

  • 扫码或图片选择不可用时,提供文件上传和手动输入。

不要为了接入微信而让网站只能在微信中使用。微信环境适合提供增强能力,HTML页面本身仍应保持独立可访问。

上线前重点测试什么

桌面浏览器的移动设备模拟只能发现布局问题,无法完整模拟公众号授权、微信分享、支付和开放标签。正式上线前至少应使用Android微信、iOS微信以及一个普通手机浏览器进行测试。

测试内容除了首页,还应包括文章详情、表单、登录回调、支付结果、错误页面和分享后重新打开的链接。需要重点观察软键盘弹出后的布局、字体放大、横竖屏切换、弱网加载、返回按钮以及重复授权等情况。

网站适配微信的合理顺序,是先保证移动网页本身稳定,再根据业务接入分享、授权、支付或小程序。这样即使某项微信能力暂时不可用,用户仍能完成基本浏览和操作,而不会因为一个接口失败导致整站无法使用。

参考资料

  1. 微信网页开发JS-SDK说明

  2. 微信公众号网页授权说明

  3. 微信网页开放标签说明

  4. 微信支付H5下单接口说明

  5. 微信支付JSAPI场景开发说明

  6. MDN响应式网页设计指南

  7. MDN移动端视口配置说明