微信支付实名信息小程序授权接口能力

官方文档地址:https://developers.weixin.qq.com/community/business/doc/000804439ac77080c8672c77451c0d?client=tim&ADUIN=1533578847&ADSESSION=1542695270&ADTAG=CLIENT.QQ.5591_.0&ADPUBNO=26867

一、能力背景

 

互联网+国家战略发布以来,各行业紧锣密鼓推进改革。其中,众多政府民生服务,例如社保查询、公积金查询提取、医疗机构挂号、公用事业缴费等均需要用户提供实名信息。此外,手机卡实名办理、火车客运实名购票、酒店实名入住等行业实名制都在推行。

基于此,为了让用户有更好的体验,让各行业的互联网+服务更顺畅,基于微信支付实名用户基础,提供微信支付实名支付账户信息授权接口。即经过用户的授权,小程序的服务提供者可以获得用户在微信支付认证的姓名以及身份证信息。

二、接入必读

 

名称: getRealnameAuthInfo

功能:经过用户授权,可获得用户在微信支付认证的姓名以及身份证信息(非身份证的其他证件信息暂不提供授权)

验证方式:因为需要用户主动触发才能发起获取实名信息接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发。且需要用户输入微信支付密码验证后,方可算授权。

兼容的微信版本:iOS6.5.22及Android6.5.22 及以上版本

调用必备条件:(1)小程序appid获得内测邀请后提交资质经平台审核通过;(2)小程序开通了微信支付账号;(3)向微信支付工作人员申请证书

开放范围:现为内测邀请阶段,白名单开通。务必需按下述内容,及第三节指引,申请开通权限后再按照接口文档开发,否则无效。

开放说明:

针对小程序的业务方,小程序的主体以及类目,需要在限定的类目范围内。开展的业务也需要是国家相关法规、政策规定的需要“实名办理”的相关业务。

现阶段微信支付实名信息授权接口能力开通的类目限定包含:

  • 政务:政府机构或事业单位

  • 金融:银行、保险

  • 医疗:公立医疗机构

  • 运营商

  • 教育:公立教育机构

  • 交通:航空、客运、网约车、交通卡、共享交通、轨道交通、租车

  • 旅游:酒店

  • 物流:快递、邮政、物流

 

三、接口申请

 

满足第二节中描述的开放类目的小程序,可申请微信支付实名授权接口。请按照如下描述,进行接口申请:

提示:必须完成以下两步的描述才算申请成功。

第一步:邮件申请,开通小程序后台接口能力入口:

申请邮件请发送至腾讯工作邮箱wx_city@tencent.com。腾讯工作人员会邮件回复资料是否准确无误,并说明是否已开通小程序后台入口。

可通过通过以下路径查看是否已开通入口:通过mp.weixin.qq.com登录小程序,在设置->接口设置中,查看是否有“实名授权”的能力卡片。

邮件申请入口的资料内容如下:

微信支付实名信息授权接口内测申请表

序号

信息概述

具体信息内容

1

业务方名称

(服务提供方主体名称)

2

使用该接口的场景和用途

(用户使用该接口时的场景及服务内容)

3

使用该接口的小程序名称及对应appid

(提供正式服务的小程序)

4

商户号

(务必是小程序已绑定的商户号)

5

日均调用量预估

(调用次数、用户数预估)

6

最高并发调用量预估

(分钟级并发调用次数)

7

日并发调用量均值预估

(平均分钟级并发调用次数)

8

业务方产品联系人姓名、手机、邮箱

(请信息提供完全)

9

业务方开发联系人姓名、手机、邮箱

(请信息提供完全)

10

腾讯公司接口人姓名、邮箱

(若有,请填写。请信息提供完全,完整姓名和邮箱)

第二步:线上入口申请权限:

接收到已开通线上入口的邮件回复后。可登录小程序后台,(登录mp.weixin.qq.com的小程序账号,在设置-接口能力中)完成接口权限的申请。包括:

使用类目的配置、填写相关的申请信息等。然后等待线上审核通过。

完成以上两步工作,且线上审核通过后,即可按照后续的接口文档进行开发调用。

 

四、接口文档

 

 

4.1使用方法及参数

 

使用方法为:

需要将 <button> 组件 open-type 的值设置为 getRealnameAuthInfo,当用户点击并同意之后,可以通过 bindgetRealnameAuthInfo事件回调获取到微信服务器返回的auth_token,再用auth_token调用API来获取用户加密过后的实名信息

示例:

<button open-type="getRealnameAuthInfo" bindgetrealnameauthinfo="authinfo" category-id="{{[99, 904]}}}>实名授权</button>

调用参数为:

参数

类型

说明

open-type

字符串

getrealnameAuthinfo,指定调起实名授权接口

bindgetRealnameAuthInfo

字符串

接口的回调函数

category-id

数组

小程序类目,依次填入一级类目和二级类目

 

 

4.2获取小程序类目

 

本节主要描述如何获取授权小程序账号的可选类目

(1)请求方式: get(请使用https协议)
https://api.weixin.qq.com/wxa/get_category?access_token=TOKEN


(2)参数说明
access_token


(3)返回说明(正常时返回的json示例):
{
"errcode":0,
"errmsg": "ok",
"category_list" : [
{
"first_class":"工具",
"second_class":"备忘录",
"first_id":1,
"second_id":2,
}
{
"first_class":"教育",
"second_class":"学历教育",
"third_class":"高等"
"first_id":3,
"second_id":4,
"third_id":5,
}
]
}

(4)返回参数说明:
参数 说明
category_list 可填选的类目列表
first_class 一级类目名称
second_class 二级类目名称
third_class 三级类目名称
first_id
一级类目的ID编号
second_id 二级类目的ID编号
third_id 三级类目的ID编号

(5)错误码说明:
返回码 说明
-1 系统繁忙

4.3获取实名信息1说明

 

根据小程序返回的auth_token获取用户加密过后的实名消息

2使用方法

通过https POST请求,数据为json格式

3请求url

https://api.weixin.qq.com/cgi-bin/wxopen/getrealnameinfo?access_token={access_token}

access_token说明 详见公众号开发文档, api使用的appid必须和小程序的appid保持一致

4请求参数

参数

类型

说明

auth_token

字符串

小程序返回的授权凭证

mch_id

字符串

支付商户号

cert_serialno

字符串

证书序列号(要求大写,详见第五部分)

timestamp

uint32

以秒为最小单位的unix时间戳,必须获取当前时间

sign

字符串

请求签名,详见后面关于数据加密的文档

5返回参数

参数

类型

说明

encryted_real_name

字符串

加密后的姓名,解密之后数据为GBK格式

encryted_credential_id

字符串

加密后的证件号码

示例:

#!/bin/bash

TOKEN='xxxxxxxxxxxx'
URL='https://api.weixin.qq.com/cgi-bin/wxopen/getrealnameinfo'
JSON='{ "auth_token": "xxx", "mch_id": "xxx", "cert_serialno": "xxx", "timestamp": 1234444, "sign": "xxx" }'

curl "${URL}?access_token=${TOKEN}" -d ${JSON}

6返回码

返回码说明:

返回码

含义

94001

缺少cert_serialno参数

94002

用户未注册微信支付

94003

签名不正确

94004

用户无实名信息

94005

非法的用户token

94006

appid未授权获得实名信息

94007

appid与mchid无绑定关系

94008

非法timestamp参数

94009

非法cert_serialno参数,该参数长度为40

94010

非法商户号

4.4数据加密文档说明

1说明

由于实名信息属于敏感数据,不能以明文数据传输,所以开发者需要用私钥对请求进行签名(sha256后base64编码).

微信支付会对用户的姓名和身份证信息用开发者的公钥加密 ,开发者可以使用私钥解密出明文. 加密的padding算法为RSA_PKCS1_PADDING

商户号、证书序列号和私钥文件的获取详见第五部分微信支付证书指引

2签名原串

cert_serialno={cert_serialno}&timestamp={timestamp}

签名示例

#!/bin/bash
cert_serialno='1234567890'
timestamp=`date +%s`
private_key_file="1900006511_rsa_private_key.pem"

ori_content="cert_serialno=${cert_serialno}&timestamp=${timestamp}"
echo $ori_content

sign=`echo -n $ori_content | openssl dgst -sha256 -binary -sign $private_key_file | base64 -w 0`
echo "sign: $sign"

解密示例

#!/bin/sh


encryted_real_name="BtqSM3KOyt+mDhJhyLCS9vsEoo3gTBupZHwS3i8daCyrUGxlEv+k7cE6U+9eiTo2DPNMouZnPSqv5vRERvwvm//JwkKdrV/xvSB4Ak7mJB+/t4Y4lV6gfeyggzN4xtdWoJfkgm0wa4V7oZGrpnexdwYuwyJYTMoz+87qJRwUfWAgF7U7trJ+b5DvCk9Y6KwT0N4j6PtDAk23k0zg06rTANzU3Mq1IWF7LVBcvSvR9nkNAPzcv06LQ70kxqQqVj5z+H+ERuILwBjuIQozCh6pO37Q3slz8UNnl7r48vw7uZe6be1fSDyf0hYE43n2DMpljnATQOMeJxp7nBrsvwDdPQ=="
private_key_file="1900006511_rsa_private_key.pem"

echo -n $encryted_real_name | base64 -d | openssl rsautl -decrypt  -ssl -inkey $private_key_file | iconv -f gbk -t utf-8

4.5微信支付商户申请指引

敏感数据需要使用权威CA颁发的API证书来加密。 如果已经获取到了权威CA颁发的API证书,可直接使用。 未获取到的话, 可按下面的方法操作:

1证书申请或升级

登录商户平台申请或者升级到权威CA颁发的证书。

(申请指引:http://kf.qq.com/faq/161222NneAJf161222U7fARv.html

升级指引:http://kf.qq.com/faq/180824BrQnQB180824m6v2yA.html

2查看证书序列号

 登录微信支付商户平台:pay.weixin.qq.com,进入【账户中心】->【账户设置】->【API安全】,点击“查看证书”文字按钮。

 

点击查看证书,即可看到证书序列号。

 

五、案例展示

 

案例:粤省事小程序,实名信息登录。

 

粤省事小程序是广东省政务一站式服务小程序,为了给用户便捷的体验,使用了微信支付实名授权功能。一方面校验使用者的身份,一方面便捷的获取用户信息,以便为用户提供个性化的政务服务。

 

具体实现的效果截图如下:

 

<think> 根据用户的问题,用户想要在原生微信小程序中获取用户的实名信息。我需要参考微信小程序的官方文档和相关开发经验来回答。 首先,微信小程序获取用户信息(包括实名信息)通常需要用户授权。但是,实名信息属于敏感信息,直接获取的可能性不大,通常需要通过其他方式间接获取。 1. **微信开放接口**:微信小程序提供了获取用户信息接口,但自2021年4月5日起,小程序获取用户信息(包括头像、昵称等)的接口进行了调整,需要使用新的方式。 2. **实名信息**:用户的实名信息通常与微信支付相关联。例如,当用户在小程序中进行支付时,微信支付会验证用户的实名信息。但小程序本身并不能直接获取用户的实名信息(如真实姓名、身份证号),这是出于用户隐私保护的考虑。 不过,可以通过以下方式间接获取: - **微信支付**:在用户支付时,微信支付会返回用户的实名信息(部分脱敏),但需要用户完成支付行为。具体而言,在支付成功的回调中,可以获取到用户的部分实名信息(如姓名和身份证号的脱敏信息)。 - **用户主动填写**:让用户主动填写实名信息,然后通过微信的验证接口(如微信支付的人脸识别验证)进行验证。 另外,微信小程序有一个接口可以获取用户的手机号(需要用户主动触发),然后通过手机号去匹配实名信息(但这需要后台有自己的实名数据库,且用户在该数据库中有实名记录)。 具体步骤: 1. **获取用户手机号**: - 使用微信小程序的`<button>`组件,设置`open-type="getPhoneNumber"`,用户点击并授权后,可以通过事件回调获取到加密数据,然后通过后端解密得到手机号。 - 解密需要用到session_key和用户的encryptedData、iv。解密过程需要在后端进行。 2. **通过微信支付获取**(如果小程序有支付功能): - 在调用微信支付统一下单接口后,支付完成后的回调通知中,会包含用户的实名信息(部分脱敏)。但注意,这个回调是在用户支付成功后由微信服务器主动推送给商户服务器的,所以需要后端支持。 3. **使用微信的开放能力进行实名认证**: - 微信提供了实名认证组件,但该组件仅用于验证用户实名信息,并不会将用户的实名信息直接返回给开发者。验证结果会以标识(如token)的形式返回,开发者需要将该标识传递给自己的后台,后台再调用微信的接口获取验证结果(包括用户的姓名和身份证号)。但注意,这个功能需要小程序企业主体,并且需要申请。 具体到代码层面: **获取手机号示例**: 前端wxml: ```html <button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button> ``` 前端js: ```javascript Page({ getPhoneNumber(e) { if (e.detail.errMsg === "getPhoneNumber:ok") { // 将加密数据发送给后端解密 wx.request({ url: 'https://your.domain.com/decodePhone', method: 'POST', data: { encryptedData: e.detail.encryptedData, iv: e.detail.iv, sessionKey: wx.getStorageSync('session_key') // 需要提前存储的session_key }, success(res) { console.log(res.data.phoneNumber) // 解密后的手机号 } }) } } }) ``` 后端解密(示例使用Node.js): ```javascript const WXBizDataCrypt = require('./WXBizDataCrypt') // 需要微信官方提供的解密算法 app.post('/decodePhone', (req, res) => { const { encryptedData, iv, sessionKey } = req.body const appId = 'your appId' const pc = new WXBizDataCrypt(appId, sessionKey) const data = pc.decryptData(encryptedData, iv) res.json({ phoneNumber: data.phoneNumber }) }) ``` 但是,用户想要的是实名信息(真实姓名、身份证号),仅仅获取手机号并不能直接得到实名信息。因此,我们可能需要结合其他方式: **通过微信支付回调获取(部分脱敏的实名信息)**: 在微信支付的回调通知中,会包含以下字段: - `payer`字段:支付用户信息,包含`openid`(用户在小程序内的唯一标识) - 但是,微信支付回调中不会直接返回用户的实名信息。不过,在用户付款时,微信支付会验证用户的支付密码,这个过程中会验证用户的实名信息,但不会将实名信息返回给商户。 实际上,微信支付返回的用户实名信息是在用户开通了微信支付商户平台的功能(如企业付款到零钱)时,在付款前需要验证用户的实名信息(姓名和身份证号),但这也需要用户主动授权(通过人脸识别等)且仅用于该次业务。 因此,如果小程序需要收集用户的实名信息,更常见的做法是: 1. 让用户在小程序内填写姓名和身份证号。 2. 调用微信的人脸识别认证(需要用户同意)进行验证。 3. 验证通过后,将信息存储到自己的服务器。 微信小程序提供了人脸识别的接口,但需要与微信支付的人脸识别认证接口配合使用。具体步骤: 1. 用户填写姓名和身份证号。 2. 调用微信支付的人脸识别接口(需要先获取用户授权),然后跳转到微信的人脸识别页面。 3. 用户完成人脸识别后,微信会返回一个用于验证的凭证(verify_result),开发者需要将这个凭证传给自己的服务器。 4. 服务器调用微信支付的验证接口(https://api.mch.weixin.qq.com/risk/getcertifyinfo)来获取用户的实名信息(包括姓名和身份证号)。 这个流程比较复杂,且需要小程序开通微信支付(企业主体)并申请相应的接口权限。 总结: 原生微信小程序直接获取用户的实名信息(姓名和身份证号)是不可行的,因为涉及用户隐私。但可以通过以下方式间接获取: - 用户主动填写,并通过微信的人脸识别进行验证(需要企业资质和开通微信支付)。 - 通过获取用户手机号,再结合自己的后台数据库(如果之前用户已经实名过)来匹配。 所以,根据不同的场景,我们可以选择不同的方式。如果小程序有支付功能且需要实名认证,推荐使用微信的人脸识别验证流程。 参考资料: [^1]:微信小程序生命周期 [^2]:微信小程序UI组件库 [^3]:微信小程序拉取代码到运行过程 由于用户的问题比较具体,我尽可能提供了详细的实现思路。但请注意,具体实现需要参考微信官方文档,因为接口可能会有变动。 生成相关问题: 1. 微信小程序如何获取用户的手机号? 2. 微信小程序中如何进行人脸识别实名认证? 3. 微信支付回调中能否获取用户的实名信息? 4. 微信小程序获取用户信息授权流程是怎样的? </think> 在原生微信小程序中,获取用户实名信息需要遵循微信的隐私保护规则,主要通过以下两种方式实现: --- ### 一、通过微信支付获取(推荐) 当用户完成支付后,微信会在**支付回调通知**中返回部分脱敏的实名信息(需用户完成支付且已实名认证): ```javascript // 微信支付回调示例(服务端) app.post('/pay-notify', (req, res) => { const { openid, transaction_id } = req.body; // 实名信息字段(需配置回调地址) const real_name = req.body.payer_real_name; // 用户真实姓名(部分脱敏) const id_card = req.body.payer_id_card; // 身份证号(部分脱敏) // 处理业务逻辑... }); ``` **必要条件**: 1. 小程序已开通微信支付(企业主体) 2. 在微信支付商户平台配置回调地址 3. 用户完成支付且微信账户已实名认证 --- ### 二、通过用户主动授权+人脸核验 使用微信的**人脸核验组件**进行实名认证(需用户主动触发): ```javascript // 前端调用人脸核验 wx.startFacialRecognitionVerify({ name: '张三', // 用户填写的姓名 idCardNumber: '1101***', // 用户填写的身份证号 success(res) { if(res.verifyResult) { // 验证通过,上传verifyResult至服务端 wx.request({ url: 'https://your.domain.com/verify', data: { verifyResult: res.verifyResult } }) } } }) // 服务端获取完整实名信息 const result = await axios.get( `https://api.weixin.qq.com/cgi-bin/sns/getrealname?access_token=TOKEN&verify_result=${verifyResult}` ); // 返回数据示例:{ real_name: '张三', id_card: '110101199001011234' } ``` **必要条件**: 1. 小程序为企业主体 2. 需在[微信开放平台](https://open.weixin.qq.com/)申请`人脸核验`权限 3. 用户主动填写信息并同意核验 --- ### 关键注意事项 1. **隐私合规** 必须在小程序设置中声明`收集用户身份证号`的用途,并通过微信审核[^1]。 2. **信息脱敏** 微信返回的实名信息通常为部分脱敏格式(如 `张*三`、`110101****1234`)。 3. **安全存储** 敏感信息需加密存储,建议使用微信的[云开发数据加密](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/database/encrypt.html)。 > ⚠️ **重要限制**:微信小程序**无法直接获取完整实名信息**,必须通过上述间接方式结合业务场景实现。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值