通过华为账号识别用户风险,降低业务损失

news/2026/1/22 10:54:42/文章来源:https://www.cnblogs.com/HarmonyOSSDK/p/19515841

当应用平台组织诸如秒杀、抽奖等营销活动时,经常会遭遇"薅羊毛"行为,给业务方带来不小的经费损失。比如通过虚假手机号进行批量注册,多次参加活动;又比如,当应用商户进行红包补贴、优惠券发放等营销活动时,使用脚本或模拟器"薅羊毛"。

为避免该问题,HarmonyOS SDK华为账号服务(Account Kit)提供了获取用户风险等级的能力,能够有效识别恶意场景,提前防范业务风险。

应用场景

一、应用登录风控场景:

当用户使用华为账号关联登录应用时,开发者可通过华为账号获取用户风险等级的能力获取用户账号的风险等级,对高风险等级账号进行风控,提升应用的安全等级。

二、营销活动反作弊场景:

在应用进行营销活动期间,如进行商户补贴、优惠券发放等商业营销活动时获取华为账号风险等级,协助开发者有效识别"薅羊毛"风险;保护营销资源合理使用,降低业务安全问题给营销方带来的损失,为相关活动保驾护航。

风险等级

图片1

获取用户风险等级方式

一、 通过华为账号一键登录获取用户风险等级。

在应用登录风控场景中,开发者可以通过华为账号一键登录获取用户风险等级,对恶意账号进行风控,提升应用的安全等级。
大致业务流程如下:

图片2

通过华为账号一键登录获取用户风险等级的开发,需要建立在一键登录的开发基础上。在进行代码开发前,请确认已经完成一键登录的开发准备工作,然后申请对应的scope权限,接着就可以进行客户端部分的开发。

在客户端开发部分,需要参考一键登录开发流程步骤1及步骤2,确保系统账号已登录,匿名手机号获取成功,且用户首次通过华为账号登录该应用。接着再参考步骤3的示例代码,在LoginWithHuaweiIDButton组件参数params中设置riskLevel标识为true,其余示例代码保持不变,拉起应用登录页。

LoginWithHuaweiIDButton({params: {// LoginWithHuaweiIDButton支持的样式style: loginComponentManager.Style.BUTTON_RED,// 账号登录按钮在登录过程中展示加载态extraStyle: {buttonStyle: new loginComponentManager.ButtonStyle().loadingStyle({show: true})},// LoginWithHuaweiIDButton的边框圆角半径borderRadius: 24,// LoginWithHuaweiIDButton支持的登录类型loginType: loginComponentManager.LoginType.QUICK_LOGIN,// LoginWithHuaweiIDButton支持按钮的样式跟随系统深浅色模式切换supportDarkMode: true,// verifyPhoneNumber:如果华为账号用户在过去90天内未进行短信验证,是否拉起Account Kit提供的短信验证码页面verifyPhoneNumber: true,// riskLevel:标识应用期望在登录后获取华为账号的风险等级riskLevel: true,},controller: this.controller
})

用户同意协议并点击一键登录按钮后,可获取到Authorization Code,并在服务端使用Client ID、Client Secret、Authorization Code调用获取用户级凭证接口向华为账号服务器请求获取Access Token,最后使用Access Token调用获取用户风险等级接口获取用户的风险等级。

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** 获取用户风险等级*/
@Slf4j
public class GetUserRiskLevelDemo {public static void main(String[] args) throws IOException {// 获取用户风险等级的接口URLString url = "https://account.cloud.huawei.com/user/getuserrisklevel";// 替换为您实际的Client IDString clientID = "<Client ID>";// 替换为您实际的transactionIDString transactionID = "<transactionID>";// 替换为您实际的获取到的用户级凭证Access TokenString accessToken = "<Access Token>";// 替换为您实际的sceneString scene = "<scene>";JSONObject result = getUserRiskLevel(url, clientID, transactionID, accessToken, scene);// 解析获取errCodeInteger errCode = result.getInteger("errCode");// 解析获取errMsgString errMsg = result.getString("errMsg");// 解析获取riskLevelInteger riskLevel = result.getInteger("riskLevel");// 解析获取riskTagJSONArray riskTag = result.getJSONArray("riskTag");}private static JSONObject getUserRiskLevel(String url, String clientID, String transactionID,String accessToken, String scene) throws IOException {HttpPost httpPost = new HttpPost(url + "?" + "clientID=" + clientID + "&transactionID=" + transactionID);Map<String, String> reqBody = new HashMap<>();reqBody.put("accessToken", accessToken);reqBody.put("scene", scene);httpPost.setHeader("Content-Type", "application/json;charset=utf-8");httpPost.setEntity(CallUtils.wrapJsonEntity(reqBody));return CallUtils.toJsonObject(CallUtils.remoteCall(httpPost, (CloseableHttpResponse response, String rawBody) -> {int statusCode = response.getStatusLine().getStatusCode();// http状态码不是200,请求失败if (statusCode != 200) {return new IOException("call failed! http status code: " + statusCode + ", response data: " + rawBody);}// http状态码为200,解析响应的body,判断业务错误码JSONObject errorResponseBody = CallUtils.toJsonObject(rawBody);// 错误码Integer errCode = errorResponseBody.getInteger("errCode");// errCode为0表示成功,非0表示失败if (Objects.nonNull(errCode) && errCode != 0) {return new IOException("call failed! http status code: " + statusCode + ", response data: " + rawBody);}return null;}));}
}

二、 通过华为账号其他方式登录获取用户风险等级。

在应用已使用华为账号关联登录的场景中,开展商户补贴、优惠券发放等商业营销活动时,开发者可通过华为账号其他方式登录获取华为账号风险等级,有效识别"薅羊毛"风险,保护营销资源合理使用。

大致业务流程如下:

图片3

通过华为账号其他方式登录获取用户风险等级的开发步骤同样分为客户端开发和服务端开发。客户端开发步骤如下:

  1. 首先导入authentication模块及相关公共模块。

    import { authentication } from '@kit.AccountKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { util } from '@kit.ArkTS';
    import { BusinessError } from '@kit.BasicServicesKit';

  2. 然后创建授权请求并设置参数。

    // 创建授权请求,并设置参数
    const authRequest = new authentication.HuaweiIDProvider().createAuthorizationWithHuaweiIDRequest();
    // 获取风险等级需要传如下scope
    authRequest.scopes = ['riskLevel'];
    // 获取authorizationCode需传如下permission
    authRequest.permissions = ['serviceauthcode'];
    // 用户是否需要登录授权,该值为true且用户未登录或未授权时,会拉起用户登录或授权页面
    authRequest.forceAuthorization = true;
    // 用于防跨站点请求伪造
    authRequest.state = util.generateRandomUUID();

  3. 调用AuthenticationController对象的executeRequest方法执行授权请求,并处理授权结果,从授权结果中解析出authorizedScopes和Authorization Code。

    // 执行授权请求
    try {
    // 此示例为代码片段,实际需在自定义组件实例中使用,以获取UIContext对象作为函数入参
    const controller = new authentication.AuthenticationController(this.getUIContext().getHostContext());
    controller.executeRequest(authRequest).then((data) => {
    const authorizationWithHuaweiIDResponse = data as authentication.AuthorizationWithHuaweiIDResponse;
    const state = authorizationWithHuaweiIDResponse.state;
    if (state && authRequest.state !== state) {
    hilog.error(0x0000, 'testTag', Failed to authorize. The state is different, response state: ${state});
    return;
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in authentication.');
    let riskLevelAuthorized: boolean = false;
    const authorizationWithHuaweiIDCredential = authorizationWithHuaweiIDResponse?.data;
    const authorizedScopes = authorizationWithHuaweiIDCredential?.authorizedScopes;
    // 判断授权成功scopes中是否包含riskLevel
    if (authorizedScopes?.includes("riskLevel")) {
    riskLevelAuthorized = true;
    }
    const authorizationCode = authorizationWithHuaweiIDCredential?.authorizationCode;
    // 开发者处理riskLevelAuthorized, authorizationCode
    }).catch((err: BusinessError) => {
    dealAllError(err);
    });
    } catch (error) {
    dealAllError(error);
    }
    // 错误处理
    function dealAllError(error: BusinessError): void {
    hilog.error(0x0000, 'testTag', Failed to obtain userInfo. Code: ${error.code}, message: ${error.message});
    // 在应用获取用户风险等级场景下,涉及UI交互时,建议按照如下错误码指导提示用户
    if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) {
    // 用户未登录华为账号,请登录华为账号并重试
    } else if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) {
    // 网络异常,请检查当前网络状态并重试
    } else if (error.code === ErrorCode.ERROR_CODE_USER_CANCEL) {
    // 用户取消授权
    } else if (error.code === ErrorCode.ERROR_CODE_SYSTEM_SERVICE) {
    // 系统服务异常,请稍后重试
    } else if (error.code === ErrorCode.ERROR_CODE_REQUEST_REFUSE) {
    // 重复请求,应用无需处理
    } else {
    // 获取用户信息失败,请稍后重试
    }
    }

    export enum ErrorCode {
    // 账号未登录
    ERROR_CODE_LOGIN_OUT = 1001502001,
    // 网络错误
    ERROR_CODE_NETWORK_ERROR = 1001502005,
    // 用户取消授权
    ERROR_CODE_USER_CANCEL = 1001502012,
    // 系统服务异常
    ERROR_CODE_SYSTEM_SERVICE = 12300001,
    // 重复请求
    ERROR_CODE_REQUEST_REFUSE = 1001500002
    }

  4. 在客户端开发完成后,同样需要调用获取用户级凭证接口向华为账号服务器请求获取Access Token,并使用Access Token调用获取用户风险等级接口获取用户的风险等级。

了解更多详情>>

访问华为账号服务联盟官网

获取获取风险等级开发指导文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1199671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python 图书管理系统(源码+数据库+文档)

图书管理 目录 基于PythonDjango图书管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango图书管理系统 一、前言 博主介绍&#xff1a;✌️大厂码农…

【大数据毕设全套源码+文档】基于Django+协同过滤算法的电影个性化推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

数据作为新型生产要素,正深刻推动各产业数字化转型与智能化升级

数据作为新型生产要素&#xff0c;正深刻推动各产业数字化转型与智能化升级。高质量数据集是实现数据价值释放的关键基础&#xff0c;能够有效支撑人工智能模型训练、算法优化和场景化应用落地。此次面向能源、生物医药、金融、交通、低空、教育等重点领域的首批高质量数据集“…

揭秘气相毛细柱行业十大品牌:生产厂家综合实力排行榜

在精密分析仪器领域,一根直径不足1毫米的毛细柱,却承载着环境监测的生命线、制药安全的守护神、食品安全的第一道防线。2026年,全球气相色谱柱市场正经历国产突围与国际巨头深度博弈的关键期,一份基于市场份额、技…

快速验证:用中文Cursor一小时打造天气APP

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于Python的天气查询应用原型&#xff0c;要求&#xff1a;1. 全程使用中文版Cursor 2. 展示AI生成代码过程 3. 包含API调用和UI设计 4. 可一键运行的完整项目。使用Flas…

2026成都装修公司哪家好?实测口碑装修公司+选装攻略,新手装修省心装

2026成都装修公司哪家好?实测口碑装修公司+选装攻略,新手装修省心装一、引言:成都装修市场选择多样,选对公司更省心 在成都这个充满活力与机遇的城市,装修市场正蓬勃发展。无论是旧房翻新,还是新房装修,人们对居…

RAG性能瓶颈突破:文档切分的核心逻辑与最优实践

引言在检索增强生成&#xff08;RAG&#xff09;系统中&#xff0c;有一个看似基础却能决定系统成败的关键环节——文档切分。很多开发者搭建的RAG系统&#xff0c;检索结果不准确、生成内容驴唇不对马嘴&#xff0c;究其原因&#xff0c;往往是文档切分做得不到位。想象一下&a…

【大数据毕设全套源码+文档】基于Djangod+协同过滤算法的经济型酒店推荐系统大数据的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

MySQL LIMIT在电商系统中的5个实战应用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个电商数据查询演示系统&#xff0c;展示LIMIT在不同场景下的应用。包括&#xff1a;1)商品列表分页查询 2)每日热销Top10 3)新用户随机推荐5件商品 4)库存预警前20条 5)用户…

我把pdfplumber整成了可以拖拉拽的web应用

pdfplumber是专门用来处理PDF的第三方库&#xff0c;完全开源和免费&#xff0c;它最核心的功能是提取PDF的文本和表格&#xff0c;支持保留段落、换行、空格的原始格式&#xff0c;不会像某些库那样把不同区域的文本混在一起&#xff0c;是我体验下来最好用的PDF处理库。pdfpl…

2026五大成都优质装修机构盘点

2026五大成都优质装修机构盘点一、成都装修市场现状剖析 随着成都城市建设的飞速发展以及人们生活水平的显著提高,装修行业在成都呈现出蓬勃发展的态势。大街小巷随处可见装修公司的招牌,各类装修相关信息丰富多样,…

双击轻捏,手写笔交互丝滑切换

在移动办公与数字创作日益普及的今天,手写笔已成为提升平板、手机等设备生产力的关键工具。然而,传统手写场景中,用户常因操作复杂(如频繁切换工具)、跨设备体验割裂等问题导致效率低下,而开发者则面临手势识别算…

基于Python + Django个性化餐饮管理系统(源码+数据库+文档)

个性化餐饮管理 目录 基于PythonDjango个性化餐饮管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango个性化餐饮管理系统 一、前言 博主介绍&…

用JDK1.7快速构建原型:Web服务示例

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 生成一个基于JDK1.7的轻量级Web服务原型&#xff0c;要求&#xff1a;1. 使用内置HttpServer实现REST接口&#xff1b;2. 包含简单的数据持久化功能&#xff1b;3. 支持JSON格式请…

通义千问模型部署新玩法:语音输入生成萌宠图片教程

通义千问模型部署新玩法&#xff1a;语音输入生成萌宠图片教程 你有没有想过&#xff0c;只要说一句话&#xff0c;就能生成一张可爱的动物图片&#xff1f;尤其对于孩子来说&#xff0c;能把自己想象中的小动物“变”出来&#xff0c;是一件多么神奇又有趣的事。现在&#xf…

2026现代装修全案公司揭晓!谁是你的梦中情“装”?

2026现代装修全案公司揭晓!谁是你的梦中情“装”?一.装修新潮流,全案公司为何火爆? 你是否在装修时面对琳琅满目的材料、风格各异的设计,以及繁琐的施工流程而感到焦头烂额?如今,越来越多的人将目光投向了现代装…

SQL和Python 哪个更容易自学?

SQL和Python不是一个物种&#xff0c;Python肯定更难学习。如果你从事数据工作&#xff0c;我建议先学SQL、有余力再学Python。因为SQL不光容易学&#xff0c;而且前期的投入产出比更大。 SQL是数据查询语言&#xff0c;场景限于数据查询和数据库的管理&#xff0c;对大部分数据…

了解Agent Skills,这一篇就够了

一、Skills 简介 Skill 是一种模块化、可复用的能力包&#xff0c;用于将特定任务的专业知识、工作流程和可执行逻辑进行结构化封装&#xff0c;使 AI 在执行该类任务时具备稳定、一致且可持续演进的行为能力。 Agent 在执行任务时&#xff0c;会自主决策&#xff0c;会根据P…

1小时搞定:用PLAYWRIGHT快速验证产品创意

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个快速验证产品创意的PLAYWRIGHT原型&#xff0c;功能包括&#xff1a;1.自动采集竞品关键页面截图 2.提取核心功能点对比 3.生成可视化对比报告 4.模拟用户旅程。要求支持配…

林业资源管理|基于java + vue林业资源管理系统(源码+数据库+文档)

林业资源管理 目录 基于springboot vue林业资源管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue林业资源管理系统 一、前言 博主介绍&…