# 三、实名认证文档
通过用户刷脸授权同意身份验证后,向商户返回face_sid 和open id, 商户根据 face_sid 进行用户是否已认证的判断;对于未认证的用户,可根据 face_sid 向微信后台请求进行实名认证,用户授权实名信息(如姓名、身份证号、手机号等)后返回给商户,经过解密后才可获取加密信息。对于已认证的用户,可直接调用接口关闭实名认证。
该能力目前仅针对医院行业开放申请。
# 使用场景说明
在医院场景下,用户采用传统的刷身份证/医保卡等方式来建档、办理就医卡完成挂号、缴费、查询报告等繁杂的流程。
实名认证目前主要应用在医院的设备上:用户通过刷脸将自己的身份信息授权给医院办理相关业务,在全过程中无需刷卡操作,因此患者就诊体验变得更轻松和方便。
# 接入指引
- 申请对象范围
- 支持商户类型:普通商户、普通服务商子商户
- 支持场景:刷脸就医场景
- 场景合理性:公立医院
- 安全能力:
 a) 拥有该主体下的跟实名数据对接的系统的等保三级证书,如无等保三级证书可由二级证书代替, 或者 ISO27001证。
 b) 用户实名信息不得经过服务商控制的服务器,并提供【数据安全评估应答及承诺文件】
- 商户质量:主体无明确违规处罚记录
- 申请流程: - 邮件标题:【刷脸实名权限申请】商户名称-服务商名称-日期
- 邮件正文:复制粘贴权限申请表表格内容及涉及实名接口的全部流程交互图
- 发送地址至wxpay_operation(微信支付医疗健康运营):wxpay_operation@tencent.com
- 抄送至sarahshao(邵霞):sarahshao@tencent.com;
- 邮件附件(相关模板如下):
 ① 微信刷脸接口权限申请表。点击下载申请表;
 ② 数据安全评估应答及承诺文件。点击下载文件;
 ③ 商户与平台签订的合作协议。点击下载协议;
 ④ 与申请商户名称完全一致的 信息系统安全等级保护三级证书(简称等保三级证书) 或者 ISO27001证,清晰的扫描件,示例如下:
 
- 邮件标题:【刷脸实名权限申请】商户名称-服务商名称-日期
 
 # 接入过程

# 实名认证时序图
注意:从1.20版本后,如果不需要Step 3请求用户授权认证,也需要调用getWxpayAuth接口退出SDK等待,参数quit_face_auth传1。
# SDK调用
# 使用方式
- SDK需要集成到商户应用,提供的SDK为C动态链接库dll,请注意采用cdecl调用约定
- 业务⽅C/C++技术栈可通过编译链接或者LoadLibrary的⽅式加载dll,并执行相关函数,C#等.NET平台的技术栈请参照下面C#导入DLL声明部分实现调用
- 运行时,需要先启动WxpayFaceService刷脸服务,然后商户应用使用SDK中的接口调起刷脸功能
注意点:
- 关于函数中⼊参、出参的数据格式, 均采⽤JSON字符串,编码为UTF-8。
- 调用wxpayCallFaceService成功后,务必调用wxpayReleaseResponse来释放响应结果
# 入口函数原型
/**
 * 调用人脸服务
 * @param reqBuf 	请求参数(JSON字符串)
 * @param reqSize 	请求参数长度
 * @param pRespBuf	用来接收响应结果(JSON字符串)的char**指针
 * @param pRespSize 用来接收响应结果长度的unsigned int*指针
 * @return 如果成功返回0,失败则返回非0
 */
extern "C" int wxpayCallFaceService(const char *reqBuf, unsigned int reqSize, char **pRespBuf, unsigned int *pRespSize);
/**
 * 释放人脸服务的响应字符串,调用wxpayCallFaceService成功后务必调用此函数释放内存
 * @param pRespBuf	指向响应结果(JSON字符串)的指针
 */
extern "C" void wxpayReleaseResponse(char **pRespBuf);
# C# 导入DLL声明
// 声明
[DllImport("WxpayFaceSDK.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public extern static int wxpayCallFaceService(IntPtr reqBuf, UInt32 reqSize, out IntPtr pRespBuf, out UInt32 pRespSize);
[DllImport("WxpayFaceSDK.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public extern static int wxpayReleaseResponse(out IntPtr pRespBuf);
// 封装
public static int CallWxpayFaceService(string req, ref string resp)
{
    byte[] reqBuf = Encoding.UTF8.GetBytes(req);
    IntPtr reqPtr = Marshal.AllocHGlobal(reqBuf.Length);
    Marshal.Copy(reqBuf, 0, reqPtr, reqBuf.Length);
    IntPtr respPtr;
    UInt32 respSize;
    int ret = wxpayCallFaceService(reqPtr, (UInt32)reqBuf.Length, out respPtr, out respSize);
    if (ret == 0)
    {
        byte[] respBuf = new byte[respSize];
        Marshal.Copy(respPtr, respBuf, 0, (int)respSize);
        resp = Encoding.UTF8.GetString(respBuf);
        wxpayReleaseResponse(out respPtr);
    }
    Marshal.FreeHGlobal(reqPtr);
    return ret;
}
# 请求参数Req和响应结果Resp构成
req和resp均为JSON结构的字符串
req包含:公共请求字段 + 命令专有请求字段
resp 包含:公共响应字段 + 命令专有响应字段
# 请求公共字段
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| cmd | 是 | string | 命令字,即各接口名: initWxpayface getWxpayfaceRawdata getWxpayfaceCode getWxpayAuth releaseWxpayface | 
| version | 是 | string | 版本号, 固定填写1 | 
| now | 是 | int | 取当前时间的10位unix时间戮。 例如:1540901425 | 
# 请求公共字段
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述 | 
# 公共错误码
| 参数 | 错误码 | 类型 | 说明 | 
|---|---|---|---|
| return_code | SUCCESS | string | 接口成功 | 
| return_code | ERROR | string | 接口失败 | 
| return_code | PARAM_ERROR | string | 参数错误 | 
| return_code | SYSTEMERROR | string | 接口返回错误 | 
# 接口调用流程
# 1、程序启动时初始化
# 程序启动时初始化initWxpayface
接口作用:对人脸SDK进行初始化
支持版本: 1.12及以上
# 请求参数
除公共参数外,下方参数中的代理设置可用于配置刷脸走商户内部代理。若不需要,则不用填写代理参数。
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| ip | 否 | string | HTTP代理IP | 
| port | 否 | string | HTTP代理端口, 须为数字 | 
| user | 否 | string | HTTP代理的用户名 | 
| passwd | 否 | string | HTTP代理的密码 | 
| proxy_type | 否 | int | 0:none; 1:HttpTunnel; 2:Socks5; v1.18版本及以上支持 | 
| camera_rotation | 否 | int | 对摄像头画面进行旋转: 1为+90度; 2为180度; 3为-90度; 如需使用该参数请联系微信支付确认设备实际效果符合规范。1.18版本以上支持 | 
# 返回参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述 | 
# 请求示例
// initWxpayface
// 初始化,默认无代理
const char* req = "{\"cmd\":\"initWxpayface\",\"version\":\"1\",\"now\":1540901425}";
// 初始化并配置代理
const char* req = "{\"cmd\":\"initWxpayface\",\"version\":\"1\",\"now\":1540901425,\"ip\":\"10.123.10.11\",\"port\":\"8356\",\"user\":\"username\",\"passwd\":\"password\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
    printf("resp: %s len: %u\n", resp, len);
    wxpayReleaseResponse(&resp);
}
/*
 * resp: {"return_code":"SUCCESS","return_msg":"SUCCESS"} len: 48
 */
# 2、获取数据
# 获取数据getWxpayfaceRawdata
接口作用:获取rawdata数据
支持版本: 1.12及以上
# 返回参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述 | 
| rawdata | S | string(2048) | 初始化数据。用于接口调用获取authinfo, 参见: 3、获取调用凭证 | 
# 调用示例
// getWxpayfaceRawdata
const char* req = "{\"cmd\":\"getWxpayfaceRawdata\",\"version\":\"1\",\"now\":1540901425}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
    printf("resp: %s len: %u\n", resp, len);
    wxpayReleaseResponse(&resp);
}
/*
 * resp: {"rawdata":"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==","return_code":"SUCCESS","return_msg":"SUCCESS"} len: 885
 */
# 3、获取调用凭证
# 获取调用凭证get_wxpayface_authinfo(rawdata)(获取调用凭证)
接口作用:获取调用凭证
接口地址:https://payapp.weixin.qq.com/face/get_wxpayface_authinfo
注意:这是一个后端调用接口,请在获取数据(getWxpayfaceRewdata)成功后获取调用凭证get_wxpayface_authinfo(rawdata)
# 请求参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| store_id | 是 | string(32) | 门店编号, 由商户定义, 各门店唯一。 | 
| store_name | 是 | string(128) | 门店名称,由商户定义。(可用于展示) | 
| device_id | 是 | string(32) | 终端设备编号,由商户定义。 | 
| attach | 否 | string | 附加字段。字段格式使用Json | 
| rawdata | 是 | string(2048) | 初始化数据。由微信人脸SDK的接口返回。 获取方式参见: [获取数据 getWxpayfaceRawdata](#获取数据 getWxpayfaceRawdata) [获取数据 getWxpayfaceRawdata](#获取数据 getWxpayfaceRawdata) | 
| appid | 是 | string(32) | 商户号绑定的公众号/小程序 appid | 
| mch_id | 是 | string(32) | 商户号 | 
| sub_appid | 否 | string(32) | 子商户绑定的公众号/小程序 appid(服务商模式) | 
| sub_mch_id | 否 | string(32) | 子商户号(服务商模式) | 
| now | 是 | int | 取当前时间,10位unix时间戳。 例如:1239878956 | 
| version | 是 | string | 版本号。固定为1 | 
| sign_type | 是 | string | 签名类型,目前支持HMAC-SHA256和MD5,默认为MD5 | 
| nonce_str | 是 | string(32) | 随机字符串,不长于32位 | 
| sign | 是 | string | 参数签名。详见微信支付签名算法 | 
# 返回参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string(16) | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述 | 
| authinfo | 是 | string(4096) | SDK调用凭证。用于调用SDK的人脸识别接口。 参见[人脸识别 getWxpayfaceCode](#人脸识别 getWxpayfaceCode) | 
| expires_in | 否 | int | authinfo的有效时间, 单位秒。 例如: 3600 在有效时间内, 对于同一台终端设备,相同的参数的前提下(如:相同的公众号、商户号、 门店编号等),可以用同一个authinfo,多次调用SDK的 getWxpayfaceCode接口。 | 
| nonce_str | 是 | string(32) | 随机字符串 | 
| sign | 是 | string(32) | 响应结果签名 | 
| appid | 是 | string(32) | 公众号 | 
| mch_id | 否 | string(32) | 商户号 | 
| sub_appid | 否 | string(32) | 子商户公众账号ID(服务商模式) | 
| sub_mch_id | 是 | string(32) | 子商户号(服务商模式) | 
# 请求示例
<return_code>SUCCESS</return_code>
<return_msg>请求成功</return_msg>
<nonce_str>Tivppi4UXAbgLxk8e1Sij76YdowOFFii</nonce_str>
<sign>PL0EUID6A7ICWNKHCSMQC0UIXOYNSE5B</sign>
<appid>wx31fdaErqR31</appid>
<mch_id>12345689</mch_id>
<authinfo>q3OPhFtQBf6KZGqmZhejKCRy5K/ch0kwS11YSsEj9XmUGqcsT2QPHt0Oa7xaCMCoSZTWMmShCo4dOiO5tU+OJEsvSxXzn5m3Nkh747tinNlbpJmVq1zOPj+FJNndkzanxoiAddO8p1EfrmUhJs/aNf0pDfrPoVfkAapK+ZY6blwyaDQ9bB7+KkZq29kObsXOZ3thg+bxP4RAqC0oxNS4JiyP0uA1Euzxtkc9lCTebloFied8stILrMehUKukeMGkZ1SzTyc8/HFHApzHahNPX6yD8ttzYnhe+IRMFJgpuTlIvEOYZUxenPXE1A5clrPvOBeJDszX/OvZl4fpYWPpXAcVQlw+gfYhblt+rT6ALMsD73w/rT4NRriQEEraC4Pfb5yua4qAqv4TVo04</authinfo>
<expires_in>7200</expires_in>
建议:返回的接口凭证authinfo,可以在expires_in指定的有效期内,同一台机具上重复使用
# 4、进行人脸识别
# 进行人脸识别getWxpayfaceCode(获取用户信息)
接口作用:启动人脸APP主界面入口,开启人脸识别,获取用户身份信息查询凭证。
注意:请在获取调用凭证get_wxpayface_authinfo(rawdata)成功后进行人脸识别(getWxpayfaceCode)
支持版本: 1.12及以上
# 请求参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| appid | 是 | string | 商户号绑定的公众号/小程序 appid | 
| mch_id | 是 | string | 商户号 | 
| sub_appid | 否 | string(32) | 子商户绑定的公众号/小程序 appid(可不填) | 
| sub_mch_id | 否 | string(32) | 子商户号(非服务商模式不填) | 
| store_id | 是 | string | 门店编号 | 
| openid | 否 | string | 通过getWxpayfaceUserInfo获取的openid,传入后可使用快捷支付模式。1.24版本以上支持该参数 | 
| telephone | 否 | string | 用户手机号。用于传递会员手机,此手机将作为默认值, 填写到手机输入栏。 | 
| face_authtype | 是 | string | 可选值: FACEPAY: 人脸凭证(face_code),用于刷脸支付FACE_AUTH: 实名认证(需联系微信支付开通权限) | 
| authinfo | 是 | string | 调用凭证。获取方式参见: get_wxpayface_authinfo | 
| screen_index | 否 | string | 指定刷脸界面显示的屏幕编号。编号1为主屏幕,其余屏幕按系统设置中的顺序从2开始编号,常用场景举例:双屏机器上传"2"即可显示在副屏上。如果不填写则默认显示在主屏幕。1.18版本以上支持该参数 | 
| disable_keyboard | 否 | string | 设置不接受外接键盘输入,可选值:"1",禁用。1.23版本以上支持该参数 | 
| token | 否 | string | 是否返回用户实名授权凭证,需要用户授权凭证传"1"。 [1.16版本以上支持] | 
# 返回参数
当face_authtype为FACE_AUTH时, 接口返回:
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述 | 
| openid | S | string | openid | 
| sub_openid | 否 | string | 子商户号下的openid(服务商模式) | 
| telephone_used | 否 | int | 是否使用了请求参数中的 telephone。可取值: 0:表示没有使用 telephone;1: 表示使用了 telephone; | 
| face_sid | 否 | string | 用户身份信息查询凭证(返回face_sid时不返回openId) | 
# 请求示例
// getWxpayfaceCode
const char* req = "{\"cmd\":\"getWxpayfaceCode\",\"version\":\"1\",\"now\":1540907996,\"appid\":\"wx97debaxyzabcca2\",\"mch_id\":\"1281087510\",\"store_id\":\"IMG001\",\"face_authtype\":\"FACE_AUTH\",\"authinfo\":\"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
    printf("resp: %s len: %u\n", resp, len);
    wxpayReleaseResponse(&resp);
}
/*
 * resp: {"face_code":"xxxxxxxx-xxxx-xxxx-bxxx-xxxxxxxxx","openid":"xxx-xxxxxxxxxxxxxxxxxxxxxxxx","return_code":"SUCCESS","return_msg":"SUCCESS"} len: 155
 */
# 5、请求用户授权认证
# 请求用户授权认证getWxpayAuth(实名认证授权)
接口作用: 获得用户授权商户获取实名认证信息
注意:根据人脸识别返回的openid判断是否实名认证,若未认证,参数quit_face_auth传0字符串实现实名认证授权。
支持版本: 1.16及以上
# 请求参数
除公共参数外,
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| authinfo | 是 | string | 调用凭证。获取方式参见: get_wxpayface_authinfo | 
| face_sid | 是 | string | 用户身份信息查询凭证。获取方式见getWxpayfaceCode | 
| quit_face_auth | 是 | string | "0" : 不退出实名认证授权,默认为"0" 1.20版本以上支持该参数,且该接口改为必调,流程请见时序图 | 
# 返回参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述见 | 
# 请求示例
// getWxpayAuth
const char* req = "{\"cmd\":\"getWxpayAuth\",\"version\":\"1\",\"now\":1540908003,\"face_sid\":\"xxxxdebaxyzabcca2\",\"authinfo\":\"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
    printf("resp: %s len: %u\n", resp, len);
    wxpayReleaseResponse(&resp);
}
/*
 * resp: {"return_code":"SUCCESS","return_msg":"success"} len: 48
 */
# 6、请求实名认证信息
接口作用:查询用户信息
接口地址:https://api.mch.weixin.qq.com/v3/facemch/users
请求方式:GET
注意:
- 调用该接口获取授权的实名信息商户需要先申请权限,申请流程请参见如何接入。
- 这是一个APIv3接口。
- APIv3接口规则请参见:wechatpay-api-v3。
- 使用Postman调试APIv3接口请参见:wechatpay-postman-script
 
- 如果是服务商模式,计算签名时使用服务商的商户号和API证书。
- 获取到返回数据后,使用商户『API证书』解密数据,『不』使用平台证书。
- 从私钥文件加载密钥请参见如何在程序中加载私钥
- 解密数据,参考下面的代码:
 
 public static String rsaDecryptOAEP(String ciphertext, PrivateKey privateKey)
    throws BadPaddingException, IOException {
    try {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] data = Base64.getDecoder().decode(ciphertext);
        return new String(cipher.doFinal(data), "utf-8");
    } catch (NoSuchPaddingException | NoSuchAlgorithmException e) {
        throw new RuntimeException("当前Java环境不支持RSA v1.5/OAEP", e);
    } catch (InvalidKeyException e) {
        throw new IllegalArgumentException("无效的私钥", e);
    } catch (BadPaddingException | IllegalBlockSizeException e) {
        throw new BadPaddingException("解密失败");
    }
}
# 请求参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| face_sid | 是 | string | ⼈脸识别成功后可获得接⼝调⽤凭证 注意face_sid是一个路径参数 | 
| info_type | 是 | string | 标识本次请求获取的信息类型 ASK_REAL_NAME:获取实名信息,包含姓名、身份证 ASK_UNION_ID:获取union id | 
| appid | 是 | string | 微信分配的公众账号ID | 
| sub_mchid | 否 | string | 微信⽀付分配的⼦商户号,服务商模式下必填 | 
| sub_appid | 否 | string | 微信分配的⼦商户公众账号ID | 
| sub_serial_no | 否 | string | ⼦商户证书序列号,服务商模式下请求实名信息必传 | 
# 返回参数
| 参数 | 必填 | 类型 | 说明 | |
| openid | 是 | string | 用户在商户appid 下的唯⼀标识 | |
| sub_openid | 否 | string | 用户在⼦商户appid下的唯⼀标识,请求参数传入sub_appid时则返回 | |
| real_name_info | encrypted_real_name | 否 | string | 加密后的姓名信息,商户⽤API证书私钥解密 info_type等于 ASK_REAL_NAME 时返回 | 
| credential_type | 否 | Integer | 证件类型, 1: 身份证 2: 护照 3: 军官证 4: ⼠兵证 5: 回乡证 6: 临时身份证 7: 户⼝簿8: 警官证 9: 台胞证 10: 营业执照 11: 其他证件 | |
| encrypted_credential_id | 否 | string | 加密后的身份证号,商户用API证书私钥解密 info_type等于 ASK_REAL_ NAME 时返回 | |
| union_id | 否 | string | info_type等于 ASK_UNION_ID 时返回 | |
# 7、退出实名认证授权
# 退出getWxpayAuth(退出实名认证授权)
接口作用: 退出获得用户实名认证
注意:根据人脸识别返回的openid判断是否实名认证,若已认证,参数quit_face_auth传1字符串实现退出实名认证授权。
支持版本: 1.20及以上
# 请求参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| authinfo | 是 | string | 调用凭证。获取方式参见: get_wxpayface_authinfo | 
| face_sid | 是 | string | 用户身份信息查询凭证。获取方式见getWxpayfaceCode | 
| quit_face_auth | 是 | string | "1": 退出实名认证授权 1.20版本以上支持该参数,且该接口改为必调,流程请见时序图 | 
# 返回参数
| 参数 | 必填 | 类型 | 说明 | 
|---|---|---|---|
| return_code | 是 | string | 错误码。公共定义见 公共错误码 | 
| return_msg | 是 | string(128) | 对错误码的描述见 | 
# 请求示例
// getWxpayAuth
const char* req = "{\"cmd\":\"getWxpayAuth\",\"version\":\"1\",\"now\":1540908003,\"face_sid\":\"xxxxdebaxyzabcca2\",\"authinfo\":\"0CSmor/Pp4vC7WE5CsJxet4Sg+D24C8eJxAMjjkBEl58hDLmofPunD+OX8v7JQyxUFmimUb9ai9cuPmGXC87MfStCOGaK/Fjb77DzF7nJgpwQhl8bdprPWKx6h04ZzPRQBlE6DAgcylr3CFSisWpMSUUmA9MtHAKD8fhzFeTEAgj0NK49DjIFZXczfZRgj8qUTRrajdJtO6gZMqlRgSwM83MP8xPG2lCO33nA5HsSMy/vh5ET5O3ubj+wpfMuD1fUj3HBy3YXxxGqFKjJV6dRwuMmAXnaTk0P0u3LSOWO7wiA6En/JgwVZvf9zkcCzq9OyJFrc+8QY6bQeuPWCe4E73n397jaD5fu8GqyokUlO/XytuYP2qcNWAol9vBpf3u2xWt/MobKjJcsDwsCxGFxtjWATRyU0fB9atI8GKGt9zxwWbMd0m6gleWWVGVOHxodNKJbWFP4rRKvPjG0nntZzX4SJ0q/7zevKzYQhU+F+q+ePvvgjKAcxnI5Jhaz/khkffQLw4YAaR7GuLZhHYeFPYEvzOXVk89+dJ/M7s1jZK4dtFa75U1Et9vn2bYtfourPpL3PA9oPPVVu2gPuq/S+WmBG6hCp0lq+/3P4png82cgLq6MNPhSwAq5YRqxlrHbfE3qk0qr/vXXSMbIOhfLWnKFdOyRv+3ohdQOC/8sdHbbSDcyQSprYZ+JREhz0W3qPKlHxlsbvSrpGNj9D4VxL4UXTnloq5KdwZoGSeBgvpNS5NPhXuU6u0cVMufUriKsxptftFu68cDzVv3hdu+1bYy/P9vffwSl01U2uJiTGErHqVMuILTNL==\"}";
char *resp;
unsigned int len;
int ret = wxpayCallFaceService(req, strlen(req), &resp, &len);
if (ret == 0) {
    printf("resp: %s len: %u\n", resp, len);
    wxpayReleaseResponse(&resp);
}
/*
 * resp: {"return_code":"SUCCESS","return_msg":"success"} len: 48
 */
