@@ -1531,7 +1531,7 @@ CustomAd.offClose(listener) // 需传入与监听时同一个的函数对象
15311531``` */
15321532 offClose(
15331533 /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */
1534- listener?: UDPSocketOffCloseCallback
1534+ listener?: CustomAdOffCloseCallback
15351535 ): void
15361536 /** [CustomAd.offError(function listener)](https://developers.weixin.qq.com/minigame/dev/api/ad/CustomAd.offError.html)
15371537*
@@ -1601,10 +1601,10 @@ CustomAd.offResize(listener) // 需传入与监听时同一个的函数对象
16011601 ): void
16021602 /** [CustomAd.onClose(function listener)](https://developers.weixin.qq.com/minigame/dev/api/ad/CustomAd.onClose.html)
16031603 *
1604- * 监听原生模板广告关闭事件(仅部分可被用户关闭的模板支持) 。 */
1604+ * 监听原生模板广告关闭事件。 */
16051605 onClose(
16061606 /** 原生模板广告关闭事件的监听函数 */
1607- listener: UDPSocketOnCloseCallback
1607+ listener: CustomAdOnCloseCallback
16081608 ): void
16091609 /** [CustomAd.onError(function listener)](https://developers.weixin.qq.com/minigame/dev/api/ad/CustomAd.onError.html)
16101610 *
@@ -13117,7 +13117,7 @@ InterstitialAd.offClose(listener) // 需传入与监听时同一个的函数对
1311713117``` */
1311813118 offClose(
1311913119 /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */
13120- listener?: UDPSocketOffCloseCallback
13120+ listener?: CustomAdOffCloseCallback
1312113121 ): void
1312213122 /** [InterstitialAd.offError(function listener)](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.offError.html)
1312313123*
@@ -13156,7 +13156,7 @@ InterstitialAd.offLoad(listener) // 需传入与监听时同一个的函数对
1315613156 * 监听插屏广告关闭事件。 */
1315713157 onClose(
1315813158 /** 插屏广告关闭事件的监听函数 */
13159- listener: UDPSocketOnCloseCallback
13159+ listener: CustomAdOnCloseCallback
1316013160 ): void
1316113161 /** [InterstitialAd.onError(function listener)](https://developers.weixin.qq.com/minigame/dev/api/ad/InterstitialAd.onError.html)
1316213162 *
@@ -14141,7 +14141,7 @@ TCPSocket.offClose(listener) // 需传入与监听时同一个的函数对象
1414114141``` */
1414214142 offClose(
1414314143 /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */
14144- listener?: UDPSocketOffCloseCallback
14144+ listener?: CustomAdOffCloseCallback
1414514145 ): void
1414614146 /** [TCPSocket.offConnect(function listener)](https://developers.weixin.qq.com/minigame/dev/api/network/tcp/TCPSocket.offConnect.html)
1414714147*
@@ -14205,7 +14205,7 @@ TCPSocket.offMessage(listener) // 需传入与监听时同一个的函数对象
1420514205 * 监听一旦 socket 完全关闭就发出该事件 */
1420614206 onClose(
1420714207 /** 一旦 socket 完全关闭就发出该事件的监听函数 */
14208- listener: UDPSocketOnCloseCallback
14208+ listener: CustomAdOnCloseCallback
1420914209 ): void
1421014210 /** [TCPSocket.onConnect(function listener)](https://developers.weixin.qq.com/minigame/dev/api/network/tcp/TCPSocket.onConnect.html)
1421114211 *
@@ -14261,7 +14261,7 @@ UDPSocket.offClose(listener) // 需传入与监听时同一个的函数对象
1426114261``` */
1426214262 offClose(
1426314263 /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */
14264- listener?: UDPSocketOffCloseCallback
14264+ listener?: CustomAdOffCloseCallback
1426514265 ): void
1426614266 /** [UDPSocket.offError(function listener)](https://developers.weixin.qq.com/minigame/dev/api/network/udp/UDPSocket.offError.html)
1426714267*
@@ -14316,7 +14316,7 @@ UDPSocket.offMessage(listener) // 需传入与监听时同一个的函数对象
1431614316 * 监听关闭事件 */
1431714317 onClose(
1431814318 /** 关闭事件的监听函数 */
14319- listener: UDPSocketOnCloseCallback
14319+ listener: CustomAdOnCloseCallback
1432014320 ): void
1432114321 /** [UDPSocket.onError(function listener)](https://developers.weixin.qq.com/minigame/dev/api/network/udp/UDPSocket.onError.html)
1432214322 *
@@ -19915,39 +19915,108 @@ wx.reportScene({
1991519915*
1991619916* 需要基础库: `3.11.2`
1991719917*
19918- * 发起人脸识别验证,用于对可疑用户进行身份验证和防沉迷检查。该接口会调起微信的人脸识别系统,验证用户身份以确保游戏安全和合规性。
19918+ * 腾讯游戏人脸识别验证功能是基于健康系统防沉迷体系,用于识别疑似未成年人冒用成年人账号游玩游戏的行为,是防止未成年人沉迷网络游戏的一项重要措施。本接口是为开通虚拟支付功能的小游戏开发者提供的,此接口是基于人脸识别的未成年人身份核验接口。本次识别是根据用户在腾讯健康系统中留存的实名信息进行验证,结果将直接返回至开发者。
19919+ *
19920+ * **接口限额**
19921+ *
19922+ * - **后台调用限制**:1000 次/天(每个小程序 AppID)
19923+ * - 超出限额后将返回错误码 2002008(频率控制)
19924+ * - 1天内全部游戏对一个用户只能调起1次人脸识别
19925+ * - 若用户人脸识别通过:7天内不能再被弹出人脸识别
19926+ * - 根据小游戏评级每个月限制使用次数,一旦发现恶意滥用接口,会取消使用资格。具体使用次数如下:
19927+ * - S级:300次/月
19928+ * - A级:100次/月
19929+ * - B级:30次/月
1991919930*
1992019931* **处理流程**
1992119932*
19922- * 1. 开发者调用 `wx.requestFacialRecognition` 发起人脸识别。
19923- * 2. 系统根据策略判定是否需要展示授权弹窗。
19924- * - 若判定为"不展示弹窗":立即回调结果,示例:`{ errCode: 0, errMsg: '本用户7天内人脸识别已通过' }`
19925- * - 若判定为"需展示弹窗":进入步骤 3。
19926- * 3. 系统展示授权弹窗。
19927- * - 玩家拒绝:立即回调 `fail`,`errCode = 2002006`
19928- * - 玩家同意:进入步骤 4。
19929- * 4. 系统开始进行人脸识别验证
19930- * - 玩家在跳转页面中完成活体/人脸识别;关闭页面返回游戏。
19931- * 5. 系统回调最终识别结果返回
19933+ * <img src="https://mmgame.qpic.cn/image/2034b86e1e8f3541629d4b4d16cf41ff84fd99efe25f4fac181603edd8a29e14/0" width="600" alt="人脸识别流程图" />
1993219934*
1993319935* **示例代码**
1993419936*
1993519937* ```js
19936- wx.requestFacialRecognition({
19937- success(res) {
19938- // 人脸识别通过或 7 天内已通过
19939- // 形如:{ errCode: 0, errMsg: 'ok' }
19940- console.log('requestFacialRecognition success:', res)
19941- },
19942- fail(err) {
19943- // 失败或受限等场景
19944- console.log('requestFacialRecognition fail:', err)
19945- },
19946- complete(res) {
19947- // 无论成功失败均会触发
19948- console.log('requestFacialRecognition complete:', res)
19949- }
19950- })
19938+ // 实际业务场景:防沉迷身份验证
19939+ function checkUserIdentity() {
19940+ wx.requestFacialRecognition({
19941+ success(res) {
19942+ // 场景 1:本次人脸识别通过
19943+ // res = { errCode: 0, errMsg: 'ok' }
19944+ console.log('人脸识别成功:', res)
19945+ // 允许继续游戏
19946+ startGame()
19947+ },
19948+ fail(err) {
19949+ console.error('人脸识别失败:', err)
19950+
19951+ let tipMessage = ''
19952+ let shouldBlock = false // 是否需要阻断游戏
19953+
19954+ // 根据错误码进行不同处理
19955+ switch (err.errCode) {
19956+ case 2002004:
19957+ // 人脸识别失败(需要阻断)
19958+ // err = { errCode: 2002004, errMsg: '人脸识别失败' }
19959+ tipMessage = '识别失败,请稍后重试'
19960+ shouldBlock = true
19961+ break
19962+
19963+ case 2002006:
19964+ // 用户取消/超时/不同意,导致未完成人脸识别(需要阻断)
19965+ // err = { errCode: 2002006, errMsg: '用户取消' }
19966+ tipMessage = '您已取消验证,无法继续游戏'
19967+ shouldBlock = true
19968+ break
19969+
19970+ case 2002007:
19971+ // 本用户7天内人脸识别已通过(可以继续游戏)
19972+ // err = { errCode: 2002007, errMsg: '本用户7天内人脸识别已通过,通过日期为2024-01-15' }
19973+ tipMessage = '您已完成验证'
19974+ shouldBlock = false
19975+ break
19976+
19977+ case 2002008:
19978+ // 频率控制:本日已调起过人脸识别 or 本月调用次数已达上限(可以继续游戏)
19979+ // err = { errCode: 2002008, errMsg: '本日已调起过人脸识别' }
19980+ // 或 err = { errCode: 2002008, errMsg: '本月调用次数已达上限' }
19981+ tipMessage = '今日验证次数已达上限'
19982+ shouldBlock = false
19983+ break
19984+
19985+ case 2002009:
19986+ // 无权限发起人脸识别(可以继续游戏)
19987+ // err = { errCode: 2002009, errMsg: '无权限发起人脸识别' }
19988+ tipMessage = '暂无权限使用此功能'
19989+ shouldBlock = false
19990+ break
19991+
19992+ default:
19993+ // 系统异常等其他错误(可以继续游戏,避免影响正常用户)
19994+ tipMessage = '系统异常,请稍后重试'
19995+ shouldBlock = false
19996+ }
19997+
19998+ if (tipMessage) {
19999+ wx.showModal({
20000+ title: '提示',
20001+ content: tipMessage,
20002+ showCancel: false
20003+ })
20004+ }
20005+
20006+ if (shouldBlock) {
20007+ // 仅对识别失败(2002004)和用户取消(2002006)阻断游戏
20008+ restrictGameFeatures()
20009+ } else {
20010+ // 其他情况允许继续游戏
20011+ startGame()
20012+ }
20013+ },
20014+ complete(res) {
20015+ // 无论成功失败均会触发
20016+ console.log('人脸识别流程结束:', res)
20017+ }
20018+ })
20019+ }
1995120020``` */
1995220021 requestFacialRecognition(option?: RequestFacialRecognitionOption): void
1995320022 /** [wx.requestMidasFriendPayment(Object object)](https://developers.weixin.qq.com/minigame/dev/api/midas-payment/wx.requestMidasFriendPayment.html)
@@ -21379,10 +21448,13 @@ wx.writeBLECharacteristicValue({
2137921448 type CreateRoomSuccessCallback = (
2138021449 result: CreateRoomSuccessCallbackResult
2138121450 ) => void
21451+ /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */
21452+ type CustomAdOffCloseCallback = (res: GeneralCallbackResult) => void
2138221453 /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */
2138321454 type CustomAdOffErrorCallback = (
2138421455 result: CustomAdOnErrorListenerResult
2138521456 ) => void
21457+ type CustomAdOnCloseCallback = (res: GeneralCallbackResult) => void
2138621458 /** 原生模板广告错误事件的监听函数 */
2138721459 type CustomAdOnErrorCallback = (
2138821460 result: CustomAdOnErrorListenerResult
@@ -23588,15 +23660,12 @@ wx.writeBLECharacteristicValue({
2358823660 type TruncateFailCallback = (res: FileError) => void
2358923661 /** 接口调用成功的回调函数 */
2359023662 type TruncateSuccessCallback = (res: FileError) => void
23591- /** onClose 传入的监听函数。不传此参数则移除所有监听函数。 */
23592- type UDPSocketOffCloseCallback = (res: GeneralCallbackResult) => void
2359323663 /** onError 传入的监听函数。不传此参数则移除所有监听函数。 */
2359423664 type UDPSocketOffErrorCallback = (result: GeneralCallbackResult) => void
2359523665 /** onMessage 传入的监听函数。不传此参数则移除所有监听函数。 */
2359623666 type UDPSocketOffMessageCallback = (
2359723667 result: UDPSocketOnMessageListenerResult
2359823668 ) => void
23599- type UDPSocketOnCloseCallback = (res: GeneralCallbackResult) => void
2360023669 type UDPSocketOnErrorCallback = (result: GeneralCallbackResult) => void
2360123670 /** 收到消息的事件的监听函数 */
2360223671 type UDPSocketOnMessageCallback = (
0 commit comments