Files
weixin-java-tools/weixin-java-pay/REAL_NAME_USAGE.md
2025-12-20 17:23:55 +08:00

4.7 KiB
Raw Permalink Blame History

微信支付实名验证接口使用说明

概述

微信支付实名验证接口允许商户查询用户的实名认证状态如果用户未实名认证接口会返回引导用户进行实名认证的URL。

官方文档

https://pay.wechatpay.cn/doc/v2/merchant/4011987607

接口说明

查询用户实名认证信息

  • 接口地址https://api.mch.weixin.qq.com/userinfo/realnameauth/query

  • 请求方式POST需要使用商户证书

  • 请求参数

    • appid公众账号ID自动填充
    • mch_id:商户号(自动填充)
    • openid用户在商户appid下的唯一标识
    • nonce_str:随机字符串(自动生成)
    • sign:签名(自动生成)
  • 返回参数

    • return_code:返回状态码
    • return_msg:返回信息
    • result_code:业务结果
    • openid:用户标识
    • is_certified实名认证状态Y-已实名认证N-未实名认证)
    • cert_info:实名认证信息(加密,仅已实名时返回)
    • guide_url引导用户进行实名认证的URL仅未实名时返回

使用示例

1. 获取实名验证服务

// 获取WxPayService实例
WxPayService wxPayService = ... // 根据你的配置初始化

// 获取实名验证服务
RealNameService realNameService = wxPayService.getRealNameService();

2. 查询用户实名认证状态(完整方式)

import com.github.binarywang.wxpay.bean.realname.RealNameRequest;
import com.github.binarywang.wxpay.bean.realname.RealNameResult;
import com.github.binarywang.wxpay.exception.WxPayException;

try {
    // 构建请求对象
    RealNameRequest request = RealNameRequest.newBuilder()
        .openid("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o") // 用户的openid
        .build();

    // 调用查询接口
    RealNameResult result = realNameService.queryRealName(request);

    // 处理返回结果
    if ("Y".equals(result.getIsCertified())) {
        System.out.println("用户已实名认证");
        System.out.println("认证信息:" + result.getCertInfo());
    } else {
        System.out.println("用户未实名认证");
        System.out.println("引导链接:" + result.getGuideUrl());
        // 可以将guide_url提供给用户引导其完成实名认证
    }
} catch (WxPayException e) {
    System.err.println("查询失败:" + e.getMessage());
}

3. 查询用户实名认证状态(简化方式)

import com.github.binarywang.wxpay.bean.realname.RealNameResult;
import com.github.binarywang.wxpay.exception.WxPayException;

try {
    // 直接传入openid进行查询
    RealNameResult result = realNameService.queryRealName("oUpF8uMuAJO_M2pxb1Q9zNjWeS6o");

    // 处理返回结果
    if ("Y".equals(result.getIsCertified())) {
        System.out.println("用户已实名认证");
    } else {
        System.out.println("用户未实名认证,引导链接:" + result.getGuideUrl());
    }
} catch (WxPayException e) {
    System.err.println("查询失败:" + e.getMessage());
}

注意事项

  1. 证书要求:本接口需要使用商户证书进行请求,请确保已正确配置商户证书。

  2. OPENID获取openid是用户在商户appid下的唯一标识需要通过微信公众平台或小程序获取。

  3. 认证信息cert_info字段返回的信息是加密的,需要使用相应的解密方法才能获取明文信息。

  4. 引导链接:当用户未实名时,返回的guide_url可以用于引导用户完成实名认证建议在小程序或H5页面中使用。

  5. 频率限制:请注意接口调用频率限制,避免频繁查询同一用户的实名状态。

业务场景

  • 转账前校验:在进行企业付款到零钱等操作前,可以先查询用户的实名认证状态
  • 风控审核:作为业务风控的一部分,确认用户已完成实名认证
  • 用户引导:发现用户未实名时,引导用户完成实名认证以使用相关功能

错误处理

try {
    RealNameResult result = realNameService.queryRealName(openid);
    // 处理结果...
} catch (WxPayException e) {
    // 处理异常
    String errorCode = e.getErrCode();
    String errorMsg = e.getErrCodeDes();
    
    // 根据错误码进行相应处理
    switch (errorCode) {
        case "SYSTEMERROR":
            // 系统错误,建议稍后重试
            break;
        case "PARAM_ERROR":
            // 参数错误检查openid是否正确
            break;
        default:
            // 其他错误
            break;
    }
}

相关链接