接入微信城市服务,开发者小程序可以使用实名信息校验接口。主要实现的功能是,在用户同意情况下,通过微信城市服务去校验用户(或业务方)输入的实名信息,是否正确且与用户在“开通微信支付”时,预留的实名信息一致。
1、本接口暂只支持校验基于大陆身份证 “姓名与身份证开通微信支付”的用户实名信息;
2、由于信息较为敏感,使用此接口校验用户(或业务方)输入的实名信息时,需要在页面前端征得用户的同意。因此调用此接口后,会跳转至微信官方的“用户同意”界面。用户点击同意按钮后方可继续后续调用。
3、请根据开放范围、场景所需及信息校验必要性申请本接口,并请谨慎使用。若后期使用过程中,用户举报较多或被发现在不合理使用,微信有权永久回收该小程序的该接口的权限。
接口的开放的场景及必要性,参考国家法规、政策规定的需要“实名办理”的相关业务。具体的开放主体类目范围如下:
水、电、燃、暖等官方生活缴费机构;
(1)请求方式:POST
(2)请求地址:
https://api.weixin.qq.com/intp/realname/checkrealnameinfo?access_token=ACCESSTOKEN
(3)请求格式:JSON
(4)请求参数:
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
openid | string | 用户在业务方下的openid | 与申请权限时提供的业务方的小程序appid保持一致 |
real_name | string | 姓名 | 需要校验的姓名 |
cred_id | string | 证件号 | 需要校验的证件号 |
cred_type | string | 默认为1,即身份证 | 目前暂只支持身份证 |
code | string | 回调获取的code | 通过小程序回跳获取的code参数 |
(5)返回字段
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
errcode | int | 0为接口调用成功 | 错误码 |
errmsg | string | 失败时的错误提示 | 错误原因 |
verify_openid | string | V_OP_NA:用户暂未实名认证;V_OP_NM_MA:用户与姓名匹配;V_OP_NM_UM:用户与姓名不匹配。 | 有多个结果时用分号”;”连接; |
verify_real_name | string | 当verify_openid 为V_OP_NM_MA 时返回:V_NM_ID_MA:姓名与证件号匹配;V_NM_ID_UM:姓名与证件号不匹配。 | 校验结果 |
(1)请求方式
跳转至微信城市服务提供的 appid 和 path
appid:wx308bd2aeb83d3345 path:subPages/city/wxpay-auth/main
(2)应答方式:
用户完成确认同意后,会跳回至业务方小程序,并在 extraData 字段中带上调用后台接口所需的 code,即 extraData 中的 code 字段。
此处的 access_token 获取方式:点击查看详细说明
$access_token = '';
$url = "https://api.weixin.qq.com/intp/realname/checkrealnameinfo?access_token=$access_token";
$params = [
'openid' => '', // 用户 openid
'real_name' => '', // 用户姓名
'cred_id' => ,'' // 身份证号
'cred_type' => 1,
'code' => '' // 小程序获取到的 code
];
$result = curlRequest($url, $params);
if ($result['errcode'] == 0) {
switch ($result['verify_openid']) {
case 'V_OP_NA':
return '您还没有实名认证,请先进行微信实名认证';
break;
case 'V_OP_NM_MA':
if ($result['verify_real_name'] == 'V_NM_ID_MA') {
return '姓名与证件号匹配';
}
if ($result['verify_real_name'] == 'V_NM_ID_UM') {
return '姓名与证件号不匹配';
}
break;
case 'V_OP_NM_UM':
return '用户与姓名不匹配';
break;
}
} else {
return $result['errmsg'];
}
// 发送 CURL 请求
function curlRequest($url, $data = [])
{
$string_data = json_encode($data, JSON_UNESCAPED_UNICODE);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($string_data))); // 设置请求头
curl_setopt($ch, CURLOPT_POSTFIELDS, $string_data); // 设置请求体
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // 定义请求类型
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTP_VERSION, 'CURL_HTTP_VERSION_1_1');
$output = curl_exec($ch);
curl_close($ch);
$arr = json_decode($output, true);
return $arr;
}
在将请求数据进行 json_encode 的时候,一定要加第二个参数 JSON_UNESCAPED_UNICODE 以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。 自 PHP 5.4.0 起生效。否则不会校验成功!