鸿蒙API9手机号验证

news2024/11/16 16:32:21

鸿蒙API9手机号验证

做一个app用户认证,之前一直想着都是通过HMS Core里边来接入,但是里边的文档最高只支持到API7。
由于想直接用API9来接,毕竟感觉后续ts/java混合开发要被舍弃,尽量还是用新的来弄。看了一遍新的API9的文档,感觉比之前的完善了很多,不过就是相应的配套支持还少点。卡了好久,没事想先关注一下文档有没有更新。突然发现还有另外一个途径,在AppGallery Connect里边有个认证服务,目前API9支持手机跟邮箱两种方式,后续应该能更新华为账号方式登陆。据说现在微信也开始适配鸿蒙了,感觉再过一段时间可能就能接入微信登陆了。

文档地址

参考地址

下边按步骤接入一下,需要提前准备一个AppGallery Connect账号。

新建工程

随便创建一个,记录一下bundle ID,然后在通过 AppGallery Connect 创建一个应用,填写相同的bundle ID。或者反过来也行,只要保证两边的bundle ID一样就行了。

开通认证服务

进入AppGallery Connect开通认证服务

请添加图片描述

开通认证服务的手机号项目

请添加图片描述

开局送了1000条短信每月,简直不要太爽,微信小程序的配额一共免费1000条,而且那个还不一定会发验证码,相比于这个就良心多了。
在认证的用量能看到短信的发送次数。

请添加图片描述

在项目设置的项目配额里边,改成查看认证服务能够看到短信的配额用多少了。

请添加图片描述

在认证服务的配置中还能设置短信模版内容

请添加图片描述

配置依赖

下载 agconnect-services.json,在AppGallery Connect项目配置->常规下边有这个文件的下载地方。

请添加图片描述

把其放到项目的这个位置上,resources/rawfile/文件夹下。

请添加图片描述

增加项目文件的依赖,项目文件路径 工程/entry/oh-package.json5
把如下内容添加到package.json5里边

{
  "@hw-agconnect/auth-ohos": "^1.1.2",
  "@hw-agconnect/api-ohos": "^1.1.2",
  "@hw-agconnect/core-ohos": "^1.1.2"
}

修改后文件如下:

{
  "license": "",
  "devDependencies": {},
  "author": "",
  "name": "entry",
  "description": "Please describe the basic information.",
  "main": "",
  "version": "1.0.0",
  "dependencies": {
    "@hw-agconnect/auth-ohos": "^1.1.2",
    "@hw-agconnect/api-ohos": "^1.1.2",
    "@hw-agconnect/core-ohos": "^1.1.2"
  }
}

之后同步项目工程,等待安装依赖库。

在 entry/src/main/module.json5 文件里边增加网络权限。

"requestPermissions": [
  {
    "name": "ohos.permission.INTERNET",
  }
]

写个大概的页面

根据功能需要,要有一个短信输入框、验证码输入框、发送验证码按钮、登陆按钮几个。
稍微画一下界面,效果如下:

请添加图片描述

接入逻辑

引入模块

import agconnect from '@hw-agconnect/api-ohos';
import "@hw-agconnect/core-ohos";
import "@hw-agconnect/auth-ohos";
import { EmailAuthProvider, VerifyCodeAction, VerifyCodeSettingBuilder, PhoneUserBuilder,
  PhoneAuthProvider, AGConnectAuth, AGConnectAuthCredentialProvider
} from "@hw-agconnect/auth-ohos"

初始化及查看是否有用户登录信息,如果之前短信验证码验证成功的话,一般来说第二次启动就能拿到上次的登录信息:

agconnect.instance().init(this.context.getApplicationContext());
agconnect.auth().getCurrentUser().then(user=>{
  if(user){
    //业务逻辑
    console.log('xx get user success ' + JSON.stringify(user))
    this.message = 'uuid: ' + user.getUid()
  } else {
    console.log('xx not login')
    this.message = '暂无登陆信息'
  }
}).catch(error=>{
  console.log('xx get user failed'+JSON.stringify((error)))
})

把手机号跟验证码发到全局变量里边

@State message: string = '^_^'
@State phoneNumber: string = ''
@State verifyCode: string = ''
countryCode: string = '+86'

发送验证码及验证码登陆流程

private handleSendVerifyCode = () => {
  let verifyCodeSettings = new VerifyCodeSettingBuilder()
    .setAction(VerifyCodeAction.REGISTER_LOGIN)
    .setLang('zh_CN')
    .setSendInterval(60)
    .build();
  agconnect.auth().requestPhoneVerifyCode(this.countryCode,this.phoneNumber,verifyCodeSettings)
    .then(verifyCodeResult => {
      console.log('xx verify code success '+JSON.stringify(verifyCodeResult))
      //验证码申请成功
      this.message = '发送验证码成功'
    }).catch(error => {
    //验证码申请失败
    console.log('xx verify code fail '+JSON.stringify(error))
  });
}

private handleCheckVerifyCode = () => {
  let credential = PhoneAuthProvider.credentialWithVerifyCode(this.countryCode,this.phoneNumber, this.verifyCode);
  agconnect.auth().signIn(credential)
    .then(user => {
      //登录成功
      console.log('xx user is '+JSON.stringify(user))
      this.message = 'uuid: ' + user.getUser().getUid()
    }).catch(error => {
    //登录失败
    console.log('xx login code fail '+JSON.stringify(error))
  });
}

之后整体代码接入一下完成:

import common from '@ohos.app.ability.common'
import agconnect from '@hw-agconnect/api-ohos';
import "@hw-agconnect/core-ohos";
import "@hw-agconnect/auth-ohos";
import { EmailAuthProvider, VerifyCodeAction, VerifyCodeSettingBuilder, PhoneUserBuilder,
  PhoneAuthProvider, AGConnectAuth, AGConnectAuthCredentialProvider
} from "@hw-agconnect/auth-ohos"

@Entry
@Component
struct Index {
  @State message: string = '^_^'
  @State phoneNumber: string = ''
  @State verifyCode: string = ''
  countryCode: string = '+86'

  private context = getContext(this) as common.UIAbilityContext

  onPageShow() {
    agconnect.instance().init(this.context.getApplicationContext());
    agconnect.auth().getCurrentUser().then(user=>{
      if(user){
        //业务逻辑
        console.log('xx get user success ' + JSON.stringify(user))
        this.message = 'uuid: ' + user.getUid()
      } else {
        console.log('xx not login')
        this.message = '暂无登陆信息'
      }
    }).catch(error=>{
      console.log('xx get user failed'+JSON.stringify((error)))
    }) ;
  }

  private handleSendVerifyCode = () => {
    let verifyCodeSettings = new VerifyCodeSettingBuilder()
      .setAction(VerifyCodeAction.REGISTER_LOGIN)
      .setLang('zh_CN')
      .setSendInterval(60)
      .build();
    agconnect.auth().requestPhoneVerifyCode(this.countryCode,this.phoneNumber,verifyCodeSettings)
      .then(verifyCodeResult => {
        console.log('xx verify code success '+JSON.stringify(verifyCodeResult))
        //验证码申请成功
        this.message = '发送验证码成功'
      }).catch(error => {
      //验证码申请失败
      console.log('xx verify code fail '+JSON.stringify(error))
    });
  }

  private handleCheckVerifyCode = () => {
    let credential = PhoneAuthProvider.credentialWithVerifyCode(this.countryCode,this.phoneNumber, this.verifyCode);
    agconnect.auth().signIn(credential)
      .then(user => {
        //登录成功
        console.log('xx user is '+JSON.stringify(user))
        this.message = 'uuid: ' + user.getUser().getUid()
      }).catch(error => {
      //登录失败
      console.log('xx login code fail '+JSON.stringify(error))
    });
  }

  build() {
    Column({space: 20}) {
      TextInput({placeholder:"请输入手机号"})
        .width(320)
        .height(40)
        .type(InputType.Number)
        .onChange((v) => {
          this.phoneNumber = v
        })

      Row({space: 20}) {
        TextInput({placeholder:"请输入验证码"})
          .width(200)
          .height(40)
          .type(InputType.Number)
          .onChange((v) => {
            this.verifyCode = v
          })

        Button("发送验证码")
          .width(100)
          .height(40)
          .onClick(()=>{
            if(this.phoneNumber.length == 11) {
              this.handleSendVerifyCode()
            } else {
              AlertDialog.show({
                message: '请输入正确的手机号',
                confirm: {
                  value: '确定',
                  action: ()=>{}
                }
              })
            }
          })
      }

      Button("登陆")
        .width(320)
        .height(40)
        .margin({top: 40})
        .onClick(()=>{
          if(this.verifyCode.length >= 4) {
            this.handleCheckVerifyCode()
          } else {
            AlertDialog.show({
              message: '请输入正确的验证码',
              confirm: {
                value: '确定',
                action: ()=>{}
              }
            })
          }
        })

      Text(this.message)
        .margin({top: 40})
    }
    .alignItems(HorizontalAlign.Center)
    .padding({top: 100})
    .width('100%')
  }
}

最后最后还有个比较好的功能就是谁发过短信注册过用户在AppGallery Connect都能够查看到。

请添加图片描述

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

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

相关文章

The-MIFARE-Hack-1 -mifare技术

RFID卡的使用变得越来越普遍。 一般来说,使用两种类型的RFID卡:有源卡和无源卡。 主动系统有自己的能源,而被动系统则依赖读卡器提供的能量。 最常见的 RFID 卡之一是 MIFARE Classic,由 NXP Semiconductors(以前是 Ph…

如何强化九小场所安全检查隐患排查工作

九小场所与人们的日常生活息息相关,相关部门对这些场所的消防安全非常重视;但是由于各种原因,经营者安全意识薄弱,导致存在严重的安全隐患。凡尔码开发的九小场所巡检系统针对九小场所基数大、底数不清、责任不明、主体意识薄弱等…

Python大数据之Python进阶(六)多线程的使用

文章目录 多线程的使用1. 导入线程模块2. 线程类Thread参数说明3. 启动线程4. 多线程完成多任务的代码5. 小结 线程执行带有参数的任务1. 线程执行带有参数的任务的介绍2. args参数的使用3. kwargs参数的使用4. 小结 线程的注意点1. 线程的注意点介绍2. 线程之间执行是无序的3.…

5.编写程序 超强力方法

5.1 创建战舰游戏 创建一个类似战舰的游戏:攻击网站 有一种棋盘类的战舰游戏,目标是要猜测对方战舰的坐标,然后轮流开炮攻击,命中数发就可以打沉对方的战舰。不过我们不喜欢战争,只要打垮这些达康公司就好(因为与商业…

10.10为什么要用二进制

由选择器引发的疑问与思考 ?想的是就让每位表示得越多,不就越能节省空间开销,从而不需要那么多的位数? 状态总量为S,R进制的N位数有SR*N, 表示当前这个位数的进制数所能表示最多的状态总量 客观存在的数量在不同进制…

springcloud----检索中间件 ElasticSearch 分布式场景的运用

如果对es的基础知识有不了解的可以看 es看这个文章就会使用了 1.分布式集群场景下的使用 单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。 海量数据存储问题:将索引库从逻辑上拆分为N个分片&#xff08…

【opencv】windows10下opencv4.8.0-cuda版本源码编译教程

【opencv】windows10下opencv4.8.0-cuda版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda版本源码编译教程前言准备工具cuda/cudnncmakeopencv4.5.0opencv_contrib CMake编译VS2019编译可…

Hadoop2.0探讨

文章目录 8. Hadoop 再探讨8.1 Hadoop的优化与发展8.2 HDFS 的FA和Federation(Hadoop2.0新特性)8.2.1 HDFS HA8.2.2 HDFS Federation 8.3 YARN8.3.1 MapReduce1.0的缺陷8.3.2 Yarn设计思路8.3.3 Yarn体系结构8.3.4 Yarn工作流程8.3.5 Yarn框架和MapReduce1.0框架对比分析8.3.6 …

C# Onnx GFPGAN GPEN-BFR 人像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace 图像修复 {public partial class Form1 : For…

MAX17058_MAX17059 STM32 iic 驱动设计

本文采用资源下载链接,含完整工程代码 MAX17058-MAX17059STM32iic驱动设计内含有代码、详细设计过程文档,实际项目中使用代码,稳定可靠资源-CSDN文库 简介 MAX17058/MAX17059 IC是微小的锂离子(Li )在手持和便携式设备的电池电量计。MAX170…

MTK8183/MT8183安卓4G核心板_联发科安卓手机开发板主板方案定制

MediaTek MT8183 整合先进功能和 AI 的主流 Chromebook 平台 MTK8183又称为MediaTek Kompanio 500,是一款支持强大功能的Chromebook平台,结合多种高功能硬件于单一高效能芯片。支持连接选项包括 Wi-Fi、蓝芽和 GNSS,外围设备可选择连接 USB …

Flutter 直接调用so动态库,或调用C/C++源文件内函数

开发环境 MacBook Pro Apple M2 Pro | macOS Sonoma 14.0 Android Studio Giraffe | 2022.3.1 Patch 1 XCode Version 15.0 Flutter 3.13.2 • channel stable Tools • Dart 3.1.0 • DevTools 2.25.0 先说下历程,因为我已经使用了Flutter3的版本,起初…

【考研408真题】2022年408数据结构41题---判断当前顺序存储结构树是否是二叉搜索树

文章目录 思路408考研各数据结构C/C代码(Continually updating) 思路 很明显,这是一个顺序存储结构的树的构成方法。其中树的根节点位置从索引0开始,对于该结构,存在有:如果当前根节点的下标为n&#xff0c…

波奇学C++:哈希

哈希本质是的值和位置建立关联起来,这种关联关系就是哈希函数 示例:除留余数:对输入的数字取模。 哈希冲突:多个不同的值指向同一个位置 解决方法: 闭散列:开发地址法。 把24放在下一个位置 哈希桶 闭散列法 闭散列…

NNDL:作业3

在Softmax回归的风险函数(公式(3.39))中如果加上正则化项会有什么影响? (1) 在 Softmax 回归的风险函数中加入正则化项会对模型的训练产生影响。正则化项的作用是对模型的复杂度进行惩罚,防止过拟合的发生。 (2) 原书公式为: 在加入正则化后损失函数…

STM32单片机入门学习(六)-光敏传感器控制LED

光敏传感器模块和LED接线 LED负极接B12,正极接VCC 光敏传感模块一DO端接B13,GND接GND,VCC接VCC,AO不接。 如图: 主程序代码:main.c #include "stm32f10x.h" #include "Delay.h" //delay函数所在头文件 #include …

Python中套接字实现服务端和客户端3-3

3 创建客户端的步骤 创建客户端的步骤如图5所示。 图5 创建客户端的步骤 从图5可以看出,对于客户端来说,首先创建套接字,之后通过创建的套接字去连接服务端,如果连接成功,则继续通过该套接字向服务端发送数据&#x…

扩展windows 10 文件夹文件路径位数

Enable Long Paths in Windows 10, Version 1607, and Later PowerShell Copy New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force 管理员权限运行 PowerShell…

【开源电商网站】(2),使用docker-compose和dockerfile进行配置,设置自定义的镜像,安装插件,增加汉化包,支持中文界面汉化。

项目相关代代码地址 相关内容: https://blog.csdn.net/freewebsys/category_12461196.html 原文地址: https://blog.csdn.net/freewebsys/article/details/133666433 包括以下运行的详细代码: https://gitee.com/study-demo-all/oscommerc…

将cpu版本的pytorch换成gpu版本

1.首先激活虚拟环境 winRcmd 打开dos命令窗口 查看虚拟环境列表 conda env list 激活虚拟环境 2.将原来的pytorch_cpu版本换成gpu版本 注意:安装gpu版本的pytorch时并不需要先卸载原来的cpu版本pytorch,安装时会自己替换的 打开pytorch官网查看以前版本 Previo…