顾客在微信里付款,为什么要先认出他是谁
扫码付和 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 时三个都要填:
| 框 | 管什么 | 不填会怎样 |
|---|---|---|
| 业务域名 | 顾客在微信里点开你的链接时,微信允不允许直接打开 | 微信会先插一个“即将访问外部网页”的提示页,顾客得多点一次才进得来 |
| JS接口安全域名 | 页面调用微信网页能力时用(例如把预约页分享给朋友时显示你设定的标题和封面)。与收款无关 | 这类能力失效,但顾客付款不受影响 |
| 网页授权域名 | 就是上面讲的第 ①② 步——认人那一步的落点 | 顾客在微信里付不了款(跳出去回不来) |
三个框要填的值都在新版后台的「微信与数据接口 → 微信支付」页里,复制过来原样粘贴。校验文件(MP_verify_xxxxxxxx.txt)三个框共用同一份,交给我们登记一次就够。
五、三个常见误解
误解一:顾客得先关注公众号才能付款。
不用。静默授权对没有关注你公众号的人一样有效。顾客不需要先关注、也不会被要求关注。
误解二:可以用 unionid 代替 openid。
不行。unionid 是“同一个人在同一家企业名下所有公众号、小程序里的统一编号”,用来认出“这是同一个人”很好用,但支付接口只认 openid。
误解三:openid 存下来以后就不用再授权了。
openid 本身确实是稳定的(同一个人 + 同一个公众号,编号不变)。但系统没办法确定“此刻正在手机上操作的这个人”就是存档里那一位——比如顾客把付款链接转给了家人,家人的微信打开时就是另一个 openid 了。
所以每次付款都重新走一遍授权,拿到的才是“此时此刻、这个微信里”的那个 openid。反正顾客看不见,多这一步换掉一整类只有顾客能看见的报错,非常划算。
六、配错了会怎样
这一块的错误有个共同特点:你这边一切正常,只有顾客看得见。所以配完最好自己用微信走一遍真实付款。
| 症状 | 多半是哪一步出了问题 |
|---|---|
| 页面跳到微信后提示授权失败、跳不回来 | 网页授权域名填错,或填成了别的子域名 |
| 页面能跳回来,但一直转圈、进不到付款框 | 换 openid 那一步失败——公众号编号或密钥不对 |
| 走到最后一步,付款框弹不出来 / 提示无法完成支付 | JSAPI 支付授权目录填错,或结尾少了 / |
| 付款框弹出来了,但提示付款人身份不符 | 拿 openid 用的公众号,和收款用的商户号没有绑定关系 |
填之前逐条核对
- 结尾有没有
/(支付授权目录必须以斜杠结尾,少一个微信会当成文件名) - 是不是
https://而不是http:// - 有没有多余的空格、大小写有没有抄错(大小写是区分的)
- 域名有没有抄成别的子域名
- 后面有没有跟着
?开头的参数或#
相关内容
- 从零接入自己的微信支付 —— 从申请商户号到第一笔真实付款的完整操作步骤
- 微信支付的密钥与证书分别是什么 —— API 密钥与商户 API 证书各自的用途
- 自建微信服务号的接入方式 —— 服务号本身的接入步骤
- 收款方式 —— 顾客可用的付款渠道一览
