跳到内容
商家帮助中心
Esc
切换打开⌘J预览
本页内容

顾客在微信里付款,为什么要先认出他是谁

扫码付和 H5 付都不需要认人,唯独顾客在微信里打开预约页付款时,系统必须先拿到他的 openid。本页讲清 openid 是什么、网页授权那一步在做什么、公众号后台和商户平台那两个「域名/目录」的框各自管哪一步,以及配错时会出现什么症状。

这篇指南面向自带微信服务号、并且顾客会在微信里完成付款的品牌管理员。

微信支付有一件事特别容易让人困惑:同样是收顾客的钱,用电脑扫码付、用手机浏览器付,都不需要做任何额外的事;唯独顾客在微信里打开你的预约页付款时,中间会多出一步「网页授权」,而且公众号后台和商户平台还各要填一个「域名/目录」的框。

不理解这一步的人,通常会在两个地方栽跟头:以为那一步可以省掉,或者把两个框填反。本页把它讲清楚。

一、三种付款方式,只有一种需要「认人」

这是理解整件事的钥匙。

顾客怎么付 付款动作发生在哪 微信怎么知道是谁在付 需要先认人吗
电脑上扫码 顾客打开微信 App,主动扫你的码 微信 App 自己就知道现在是谁登录着 不需要
手机浏览器付 从浏览器唤起微信 App,在 App 里确认 同上 不需要
在微信里打开页面付 网页里弹出付款框 ⚠️ 不知道——除非网页先告诉它 需要

前两种,付款动作发生在微信自己的界面里,付款人是谁微信心里有数,下单的时候根本不用提。

第三种不一样:付款框是一个网页弹出来的。网页对微信来说是外人——微信不会仅凭一个网页的请求,就去扣某个人的钱。所以它要求:你先告诉我这笔钱要记在谁头上,我再弹框。

那个“谁”,就是 openid。

二、openid 是什么

openid 是「某个人」在「某个公众号」下的身份编号,长得像 oXy8w1a2b3cD4eF5gH6iJ7kL8

最反直觉的一点,也是最该记住的一点:

弹付款框的那一刻,微信还会核对一次:现在这个微信里登录的人,是不是你下单时说的那个 openid?对不上就不给付。

这也解释了一件事:openid 不能随便编一个填进去,编了也过不了这道核对。

三、「网页授权」那一步在做什么

拿 openid 的唯一办法,就是走一次微信的网页授权

这里有个特别容易想反的地方,先说结论:我们不是“去某个地方拿 openid”,而是把顾客送去微信、再让微信把他送回来。 openid 只有微信知道,我们没法自己去取。

整个过程是这样的(注意每一步是在把顾客往前送):

顾客在微信里点开你的预约页,选择微信支付

        │  ← 我们把顾客送走

① 微信的授权页
   (我们带上:你的公众号编号 + 一个"办完请送回这里"的地址)

        │  顾客看不到任何弹窗,页面一闪而过
        │  ← 微信把顾客送回来

② 我们的授权落点
   ⭐ 就是你要填进「网页授权域名」的那个地址
   微信在地址后面附带了一张一次性凭证


③ 我们的服务器拿这张凭证,直接向微信换 openid
   (服务器和微信直接通话,顾客的手机完全不参与)


④ 拿到 openid → 向微信下单 → 拿到付款凭据


⑤ 付款页弹出付款框,顾客输密码 / 指纹,付款完成

微信为什么要管这个落点

因为微信只肯把顾客送回它认可的地址

如果不管,任何人都可以拿你的公众号编号拼一个授权链接,把顾客骗到自己的服务器上去——那张一次性凭证就落到了别人手里。让你先在后台登记落点,等于告诉微信“只有这个地址是我本人的”。

⚠️ 所以这个框填错的后果很直接:顾客点了付款、跳到微信、然后回不来。而你这边的系统一切正常,什么错误都不会报。

第 ② 步那张一次性凭证只能用一次,5 分钟过期。这就是为什么付款页在跳转过程中地址会变一次:拿到 openid 之后系统会立刻把那张用过的凭证从地址里去掉,否则顾客一刷新页面就会白屏。

四、几个「域名 / 目录」的框,各管哪一步

公众号后台和商户平台上都有名字带“域名 / 目录”的框。最容易被搞混的是下面这两个——名字都带“域名”,管的却是流程里完全不同的两步

要填的框 在哪里填 管流程的哪一步 填的粒度
网页授权域名 公众号后台
mp.weixin.qq.com
上图第 ①② 步——顾客被送去微信、再送回来的那个落点 只填域名,不带路径
JSAPI 支付授权目录 微信支付商户平台
pay.weixin.qq.com
上图第 ⑤ 步——弹出付款框的那一页所在的目录 目录,必须以 / 结尾

网页授权域名有一条特别容易踩的规则

它是整串域名的逐字比对,不是“后缀匹配”:

后台填了:wx.example.com

     ├── wx.example.com/任意路径     ✅ 通过(同一域名下路径随便)
     ├── pay.example.com/…           ❌ 拒绝(不同子域名,不继承)
     └── example.com/…               ❌ 拒绝(父域名也不继承)

而且这个框的名额很少——目前一个公众号可以填 2 个(微信调整过这个数字,以你后台页面上实际显示的框数为准)。相比之下,「JSAPI 支付授权目录」有 5 个名额,宽松得多。

所以填这一项之前,先想清楚这 2 个名额分别要留给谁:一旦两个都占满,再想加第三个站点就得先牺牲一个。需要填的固定值显示在新版后台的「微信与数据接口 → 微信支付」页里,复制后原样填即可。

公众号后台其实有三个域名框,三个都要填

上面说的「网页授权域名」不是孤零零一个。在同一个页面上(「设置与开发 → 账号设置 → 功能设置」,往下滚到底),还有另外两个名字很像的域名框——接入 Darkroom 时三个都要填

服务号后台 · 账号设置 → 功能设置
mp.weixin.qq.com
账号设置
账号详情功能设置授权管理
功能设置
微信音频播放器允许微信音频播放器音乐故事场景引用本账号文章片段?
文章朗读声音默认声音录制我的声音
隐私设置允许通过名称搜索到本账号
图片水印使用账号名称作为水印
业务域名值在新版后台复制设置
JS接口安全域名?值在新版后台复制设置
网页授权域名值在新版后台复制设置
最下面这三个域名框都要配,各管一件事,缺一个就会有一类功能坏掉。 要填的值在新版后台「财务和账单 → 微信支付」页,复制过来原样粘贴——上面四行与 Darkroom 无关,不用动。
管什么 不填会怎样
业务域名 顾客在微信里点开你的链接时,微信允不允许直接打开 微信会先插一个“即将访问外部网页”的提示页,顾客得多点一次才进得来
JS接口安全域名 页面调用微信网页能力时用(例如把预约页分享给朋友时显示你设定的标题和封面)。与收款无关 这类能力失效,但顾客付款不受影响
网页授权域名 就是上面讲的第 ①② 步——认人那一步的落点 顾客在微信里付不了款(跳出去回不来)

三个框要填的值都在新版后台的「微信与数据接口 → 微信支付」页里,复制过来原样粘贴。校验文件(MP_verify_xxxxxxxx.txt)三个框共用同一份,交给我们登记一次就够。

五、三个常见误解

误解一:顾客得先关注公众号才能付款。

不用。静默授权对没有关注你公众号的人一样有效。顾客不需要先关注、也不会被要求关注。

误解二:可以用 unionid 代替 openid。

不行。unionid 是“同一个人在同一家企业名下所有公众号、小程序里的统一编号”,用来认出“这是同一个人”很好用,但支付接口只认 openid

误解三:openid 存下来以后就不用再授权了。

openid 本身确实是稳定的(同一个人 + 同一个公众号,编号不变)。但系统没办法确定“此刻正在手机上操作的这个人”就是存档里那一位——比如顾客把付款链接转给了家人,家人的微信打开时就是另一个 openid 了。

所以每次付款都重新走一遍授权,拿到的才是“此时此刻、这个微信里”的那个 openid。反正顾客看不见,多这一步换掉一整类只有顾客能看见的报错,非常划算。

六、配错了会怎样

这一块的错误有个共同特点:你这边一切正常,只有顾客看得见。所以配完最好自己用微信走一遍真实付款。

症状 多半是哪一步出了问题
页面跳到微信后提示授权失败、跳不回来 网页授权域名填错,或填成了别的子域名
页面能跳回来,但一直转圈、进不到付款框 换 openid 那一步失败——公众号编号或密钥不对
走到最后一步,付款框弹不出来 / 提示无法完成支付 JSAPI 支付授权目录填错,或结尾少了 /
付款框弹出来了,但提示付款人身份不符 拿 openid 用的公众号,和收款用的商户号没有绑定关系

填之前逐条核对

  • 结尾有没有 /(支付授权目录必须以斜杠结尾,少一个微信会当成文件名)
  • 是不是 https:// 而不是 http://
  • 有没有多余的空格、大小写有没有抄错(大小写是区分的
  • 域名有没有抄成别的子域名
  • 后面有没有跟着 ? 开头的参数或 #

相关内容