2025-11-17 【小程序】微信人脸核身

交互流程

sequenceDiagram
autonumber
    actor 用户
    participant 外部小程序
    participant 半屏金额明细
    participant jsapi
    participant 小程序后端
    participant 微信后端

     用户->>外部小程序: 1. 确认收款
    外部小程序->>半屏金额明细: 2. 半屏打开
    半屏金额明细->>半屏金额明细: 3. 登录、实名、三流合一、高风险人群
    rect rgba(0, 0, 255, .1)
    Note right of jsapi: 人脸核身
    半屏金额明细->>半屏金额明细: 弹窗提示“高危人群扫脸认证”
    用户->>半屏金额明细: 点击“扫脸认证”
    半屏金额明细->>jsapi: 【jsapi】检查设备是否支持人脸检测 wx.checkIsSupportFacialRecognition
    jsapi-->>半屏金额明细: 返回是否支持人脸检测结果
    半屏金额明细->>小程序后端: 【api】获取user_id_key
    小程序后端->>微信后端: 调用 getuseridkey传入access_token、name、id_card_number
    微信后端-->>小程序后端: 返回 获取user_id_key
    小程序后端-->>半屏金额明细: 返回 获取user_id_key

    半屏金额明细->>jsapi: 人脸核身wx.startFacialRecognitionVerify 传入user_id_key
    jsapi->>半屏金额明细:  返回人脸核身结果verify_result
    半屏金额明细->>小程序后端:  【api】二次校验 人脸核身结果,传入verify_result
    小程序后端->>微信后端: 调用 getinfo传入access_token、verify_result
    微信后端-->>小程序后端: 返回 identify_ret、errcode
    小程序后端-->>半屏金额明细: 返回 二次校验人脸核身结果
    半屏金额明细->>半屏金额明细: identify_ret、errcode均为0,自动跳转“金额明细”
    end

    用户->>半屏金额明细: 点击“确认收款”
    半屏金额明细->>半屏金额明细: 三流合一、缴税、收款

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { apiGetUserIdKey, apiVerifyFace } from "@services/nature";

const startFacialRecognitionVerify = (userIdKey) =>
new Promise((resolve) => {
wx.startFacialRecognitionVerify({
userIdKey,
success: (result) => {
resolve(result);
},
fail: (e) => {
console.log("fail", e);
resolve(e);
},
// complete: () => {
// console.log('complete');
// },
});
});
/**
* 判断当前用户设备 是否支持
*/
const checkIsSupportFacialRecognition = () =>
new Promise((resolve) => {
wx.checkIsSupportFacialRecognition({
// 支持
success: () => {
resolve(true);
},
// 不支持
fail: () => {
resolve(false);
},
// complete: () => {
// resolve(false);
// },
});
});
/**
* 人脸核身校验
*/
const facialRecognitionVerify = async () => {
// 1. 判断当前用户设备 是否支持
const success = await checkIsSupportFacialRecognition();
if (!success) {
return {
success: false,
errMsg: "当前微信版本过低,请升级微信至最新版本后重试。",
};
}
// 2. 获取用户 user_id_key
const resultUserIdKey = await apiGetUserIdKey({ source: 1 });
if (!resultUserIdKey.userIdKey || resultUserIdKey.errcode !== 0) {
return {
success: false,
errMsg: resultUserIdKey.errmsg || "获取扫脸用户凭证失败",
};
}
// 3. 调用jsapi 唤起人脸核审
const verifyResult = await startFacialRecognitionVerify(
resultUserIdKey.userIdKey
);
if (verifyResult.errCode !== 0) {
const errMsg = verifyResult.errMsg?.includes("cancel")
? "用户取消人脸识别,无法正常收款"
: verifyResult.errMsg;
return { success: false, errMsg: errMsg || "人脸识别失败,请稍后重试" };
}
// 4. 二次校验,jsapi认证结果
const verifyFaceResult = await apiVerifyFace({
verifyResult: verifyResult.verifyResult,
source: 1,
});
if (verifyFaceResult.identifyRet !== 0 || verifyFaceResult.errcode !== 0) {
return {
success: false,
errMsg: verifyFaceResult.errmsg || "人脸识别失败,请稍后重试",
};
}
console.log("facialRecognitionVerify4", verifyFaceResult);
return { success: true };
};

/**
* 弹窗提示高风险人群 需人脸识别
*/
const showFacialRecognitionVerifyModal = (content) =>
new Promise((resolve) => {
wx.showModal({
title: "温馨提示",
content,
cancelText: "暂不认证",
confirmText: "扫脸认证",
confirmColor: "#008858",
success: (res) => {
if (res.confirm) {
resolve(true);
} else if (res.cancel) {
// 阻断流程
resolve(false);
}
},
});
});
module.exports = {
facialRecognitionVerify,
showFacialRecognitionVerifyModal,
};

2025-11-17 【小程序】微信人脸核身
https://zhangyingxuan.github.io/2025-11-17 【小程序】微信人脸核身/
作者
blowsysun
许可协议