【uniapp】个推H5号码认证一键登录(附代码)

前言

最近在做APP、h5产品,登陆注册成了难题。邮箱验证多数人不会使用,还是短信方便点,短信可以采用号码认证和验证码的方式,前者稍微便宜的,关于性价比和上手程度我推荐个推,
于是有了今天这篇案例记录,对于H5向uniapp进行数据传输,我建议看我这篇【uniapp】H5向uniapp通信存储数据——H5如何传递数据到uniapp方法的解决方案


个推号码认证业务流程

在这里插入图片描述

开发者通过修改H5密钥信息完成配置,用户访问该网页通过个推及三大运营商SDK返回token、gyuid,开发者需要通过这几个数据换取手机号,从而完成登陆验证,开发者需要自己写取号接口及解密过程,本次通过该案例实现Uniapp支持H5登录认证成功并获取手机号,下文流程根据用户发起的逻辑进行梳理


产品成功演示

demo演示:

个推H5号码认证一键登录

接入产品演示:

个推H5号码认证一键登录2


目录

  • 前言
    • 个推号码认证业务流程
  • 产品成功演示
  • 阿里云认证的演示图
  • 个推演示图
  • 对比
  • 认证
    • 实名认证
  • 产品认证
  • 开通
  • 官方SDK
  • 对接H5号码认证
    • H5认证页面
      • 修改oneLogin.html
    • uniapp配置
      • 新建index.vue
      • 新建pages2.vue
    • 新建api.php
    • 解密操作
  • 完整项目代码
    • 使用教程
  • 最后


阿里云认证的演示图

在这里插入图片描述
在这里插入图片描述


个推演示图

在这里插入图片描述


对比

个推和阿里云、易盾都支持H5但是易盾需要充值最低套餐,阿里云文档不行,个推可以自定义充值,价格在二者之间,个推认证企业送1000调用次数

产品阿里云个推易盾
对接难度🚹
是否支持H5
免费赠送1001000100
服务态度两天没问明白排队时间长及时未了解
同等套餐费用便宜便宜最便宜

认证

实名认证

我建议企业认证,优惠多

在这里插入图片描述


产品认证

应用服务中新建一键认证,根据流程往下,添加H5认证
在这里插入图片描述


开通

产品开通后
在这里插入图片描述

需要进行H5域名配置
在这里插入图片描述


官方SDK

如有需要请自己下载


对接H5号码认证

H5认证页面

官方自带的oneLogin.html,不过由于是H5没有和Uniapp对接,需要开发者自己对接,可以采用我的,我的已完成基础使用,可通过H5将数据传递到Uniapp中进行业务处理

修改oneLogin.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- <meta > 生产上有https访问的,会导致上报的referer为空,移动运营商会去校验请求referer是否进行备案--><!-- step2: 添加meta --><meta content="always" name="referrer"><title>H5 一键登录demo</title><style>body {display: flex;align-items: center;justify-content: center;flex-direction: column;height: 300px;}p {font-size: 14px;}</style><!-- 手机查看日志 --><!-- <script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script><script>var vConsole = new VConsole();</script> --><!-- 本机验证本身不需要jquery 库,此处使用仅为了在demo中减少代码量 --><script src="//apps.bdimg.com/libs/jquery/1.9.1/jquery.js"></script><!-- stpe1: 引入JS --><!-- 引入axios 网络请求依赖此库--><!-- <script src="https://unpkg.com/axios/dist/axios.min.js"></script> --><!-- 本地依赖 --><script src="axios.min.js"></script><!-- 引入gysdk-min.js  注意路径--><script src="gysdk-min.js"></script><script type="text/javascript">var userAgent = navigator.userAgent;if (userAgent.indexOf('AlipayClient') > -1) {// 支付宝小程序的 JS-SDK 防止 404 需要动态加载,如果不需要兼容支付宝小程序,则无需引用此 JS 文件。document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');} else if (/QQ/i.test(userAgent) && /miniProgram/i.test(userAgent)) {// QQ 小程序document.write('<script type="text/javascript" src="https://qqq.gtimg.cn/miniprogram/webview_jssdk/qqjssdk-1.0.0.js"><\/script>');} else if (/miniProgram/i.test(userAgent) && /micromessenger/i.test(userAgent)) {// 微信小程序 JS-SDK 如果不需要兼容微信小程序,则无需引用此 JS 文件。document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');} else if (/toutiaomicroapp/i.test(userAgent)) {// 头条小程序 JS-SDK 如果不需要兼容头条小程序,则无需引用此 JS 文件。document.write('<script type="text/javascript" src="https://s3.pstatp.com/toutiao/tmajssdk/jssdk-1.0.1.js"><\/script>');} else if (/swan/i.test(userAgent)) {// 百度小程序 JS-SDK 如果不需要兼容百度小程序,则无需引用此 JS 文件。document.write('<script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.22.js"><\/script>');} else if (/quickapp/i.test(userAgent)) {// quickappdocument.write('<script type="text/javascript" src="https://quickapp/jssdk.webview.min.js"><\/script>');}if (!/toutiaomicroapp/i.test(userAgent)) {document.querySelector('.post-message-section').style.visibility = 'visible';}</script><script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.22.js"></script><!-- uni 的 SDK --><script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
</head><body><h3>H5 一键登录 demo 演示</h3><p>点击登录体验 H5 一键登录</p><button id='test'>登录</button><p>此处为点击登录模拟场景, 接入方可根据业务需求,进行修改</p>
</body></html>
<script>// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。document.addEventListener('UniAppJSBridgeReady', function () {const appid = "dC***输入你的appid*****b2"//初始化个验SDKfunction initGy() {GyManager.setDebugMode(true)GyManager.init({app: "***输入你的app名***",appid: appid, timeout: 3000, onResult: function (res) {console.log("demo init ", res);if (res.success) {initResult = res;}}});}//保存初始化结果let initResult;// 可提前判断网络状态 决定是否初始化H5一键登录var nettype = GyManager.checkNetInfo();console.log("demo checkNetInfo", nettype);// 根据客户业务进行判断 网络判断返回 cellular、 wifi、 unknownif (nettype === 'wifi') {// 可选方案: // 1: 提示用户关闭wifi 进行体验// 2: 直接降级走其他验证形式console.error("demo wifi状态无法一键登录")uni.navigateTo({url: '/pages/pages2/pages2?text=wifi状态无法一键登录'});//调用服务端校验接口// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。//调用服务端校验接口} else {// stpe3: 初始化H5一键登录initGy()}// 模拟点击登录场景 可以在页面加载的时候判断网络状态后初始化就调用gateway方法$('#test').click(() => {// 调用H5一键登录if (!initResult) {uni.navigateTo({url: '/pages/pages2/pages2?text=gysdk初始化失败,无法登录'});console.error("demo gysdk初始化失败,无法登录")// 降级走其他验证方式return}//step5: 调用H5 一键登录GyManager.oneLogin({canSwithch: true,logo:"./logo.png",onTokenSuccess: function (res) {console.log("demo onTokenSuccess", res);console.log(res['code'])console.log(res['accesscode'])console.log(res['gyuid'])// console.log(res['code'])//调用服务端校验接口// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。uni.navigateTo({url: '/pages/pages2/pages2?text=登陆成功&code='+res['code']+'&accesscode='+res['accesscode']+'&gyuid='+res['gyuid']});//调用服务端校验接口},onTokenFail: function (err) {//调用服务端校验接口// 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。uni.navigateTo({url: '/pages/pages2/pages2?text=登陆失败'});//调用服务端校验接口console.error("demo onTokenFail", err);}});   })});</script>

在这里插入图片描述

uniapp配置

新建index.vue

将webview的src换成你的oneLogin.html所访问的域名


<template><view><web-view src="https://****/h5authlogin/oneLogin.html"></web-view></view>
</template><script>export default {data() {return {}},methods: {}}
</script><style></style>

新建pages2.vue

这一步是为了将H5所返回的数据进行记录处理,由于Uniapp和H5通信不支持postmeassg方法,于是我打算通过uni.navigateTo进行传输数据,在该页面进行其他接口操作

<template><view class="">{{text}}<br />{{code}}<br />{{gyuid}}<br />{{accesscode}}<br /></view>
</template><script>export default {data() {return {text:'',code:'',gyuid:'',accesscode:''}},onLoad(options) {console.log(options.text)console.log(options.code)console.log(options.gyuid)console.log(options.accesscode)this.text=options.text;this.code=options.code;this.gyuid=options.gyuid;this.accesscode=options.accesscode;uni.request({url: 'https://******/api.php', //仅为示例,并非真实接口地址。data: {token:options.accesscode,gyuid:options.gyuid},method: 'POST',header: {'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息},success: (res) => {console.log(res.data);if (res.data.code==200) {uni.showToast({title:res.data.msg,duration:3000})} else if(res.data.code==100){uni.showToast({title:res.data.msg,duration:3000,icon:'none'})}}});},methods: {}}
</script>

测试可以成功返回数据如下图:
在这里插入图片描述

新建api.php

此接口用于获取pn(也就是加密的手机号)

<?php  // 假设你已经有了这些参数的值  
$appId = 'dCZI*********pb2';  
$timestamp = round(microtime(true) * 1000); // 获取当前毫秒时间戳  
$token = $_POST['token'];  
$gyuid = $_POST['gyuid']; // 构建请求参数  
$params = [  'appId' => $appId,  'timestamp' => $timestamp,  'token' => $token,  'gyuid' => $gyuid  
];  // 将请求参数转换为JSON字符串  
$jsonData = json_encode($params);  // 初始化cURL会话  
$ch = curl_init();  // 设置cURL选项  
curl_setopt($ch, CURLOPT_URL, 'https://h-gy.getui.net/v2/gy/ct_login/gy_get_pn');  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_POST, true);  
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);  
curl_setopt($ch, CURLOPT_HTTPHEADER, [  'Content-Type: application/json',  'Content-Length: ' . strlen($jsonData)  
]);  // 执行请求并获取响应  
$response = curl_exec($ch);  // 检查是否有错误发生  
if(curl_errno($ch)){  $error_msg = curl_error($ch);  echo "cURL Error: " . $error_msg;  
}  // 关闭cURL会话  
curl_close($ch);  // 处理响应  
if ($response) {  // 假设服务器返回的是JSON格式的数据,我们将其解码为PHP数组或对象  $result = json_decode($response, true); $code=$result['data']['result'];if ($code==20000) {die(json_encode(array('code' => 200,'msg' => '返回成功','data' => $result),480)
);   } else {// faildie(json_encode(array('code' => 100,'msg' => '返回错误','data' => $result),480)
);   }} else {  die(json_encode(array('code' => 100,'msg' => '错误','data' => ''),480)
);   
}  ?>

解密操作

// success解密
$pn=$result['data']['data']['pn'];
// 解密
// 密文及密钥
// $pn = '1fbf2605f954fad3ba18115000735aee';
$masterSecret = 'bZBM********a8';// 参数设置
$encryptMethod = 'aes-128-cbc';
$iv = '0000000000000000';//16位密钥
$key = $masterSecret;
while(strlen($key) < 16){$key .= $masterSecret;
}
$key = substr($key, 0, 16);// 解密
$result = openssl_decrypt(hex2bin($pn), $encryptMethod, $key, 1, $iv);
//echo $result;// 解密成功返回手机号

完整项目代码

uniapp个推H5号码认证一键登录demo

使用教程

解压所有文件上传到网站 下载uniapp到本地解压运行

1、修改oneLogin.html的配置信息,直接访问测试可调用、能使用 就可以下一步
2、修改uniapp端的index.vue和pages2.vue接口域名换成自己的就可以

打包uniapp项目部署到网站,访问项目即可剩下的自己配置了

最后

《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》

推荐专栏:

《Python爬虫脚本项目实战》

该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》

🥦如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
🥦作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选

如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!

🚀Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)
【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

⭐⭐欢迎订阅⭐⭐
在这里插入图片描述

Python爬虫脚本项目实战
在这里插入图片描述

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

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

相关文章

大模型技术应用实训室解决方案

一、建设背景 随着大数据、云计算等技术的不断进步&#xff0c;大模型技术已成为人工智能领域的重要研究方向&#xff0c;其在自然语言处理、计算机视觉、语音识别等领域展现出强大的应用潜力。自2022年11月ChatGPT问世以来&#xff0c;大模型开始备受关注&#xff0c;科技巨头…

PPT 操作

版式 PPT中&#xff0c;巧妙使用母版&#xff0c;可以提高效率。 双击母版&#xff0c;选择其中一个版式&#xff0c;插入装饰符号。 然后选择关闭。 这个时候&#xff0c;在该版式下的所有页面&#xff0c;就会出现新加入的符号。不在该版式下的页面&#xff0c;不会出现新加…

Go-Gin中优雅的实现参数校验,自定义错误消息提示

问题描述 在参数校验的时候我们一般会基于"github.com/go-playground/validator/v10"这个库给结构体加标签实现校验参数&#xff0c;当参数校验错误的时候&#xff0c;他的提示一般是英文的&#xff0c;怎么自定义参数错误提示呢&#xff1f;跟着我一步步来 注册校…

2024/4/1—力扣—两数相除

代码实现&#xff1a; 思路&#xff1a;用减法模拟除法 // 用减法模拟除法 int func(int a, int b) { // a、b均为负数int ans 0;while (a < b) { // a的绝对值大于等于b&#xff0c;表示此时a够减int t b;int count 1; // 用来计数被减的次数// t > INT_MIN / 2:防止…

鸿蒙实现一种仿小红书首页滑动联动效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 效果描述&#xff1a;通过手指滑动列表&#xff0c;控制位置显示效果为&#xff1a;不论列表在什么位置下滑时下图粉色位置布局显示&#xff0c;手指上滑时下图粉色位置布局隐藏。 效果&#xff1a; 原理分析&…

怎样恢复已删除的照片?教你3个方法,一键恢复!

很多人喜欢以拍照的形式记录生活&#xff0c;手机里的照片就很容易堆积成山&#xff0c;但当内存不够用时就不得不选择删除。可是这些美好的照片始终是很多人心中抹不去的记忆&#xff0c;那么该怎样恢复已删除的照片呢&#xff1f;下面几招&#xff0c;教你一键恢复&#xff0…

YOLOV8注意力改进方法:DoubleAttention(附代码)

原论文地址&#xff1a;原论文地址 DoubleAttention网络结构的优点在于&#xff0c;它能够有效地捕获图像中不同位置和不同特征的重要性&#xff0c;从而提高了图像识别和分割的性能。 论文相关内容介绍&#xff1a; 论文摘要&#xff1a;学习捕捉远程关系是图像/视频识别的…

Android Studio学习16——Activity跳转时的参数传递

传递数据——example 传递对象类型的数据——example 传递 接收 回传数据——example

【C++】1957. 求三个数的平均数

问题&#xff1a;1957. 求三个数的平均数 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 小雅刚刚考完语文、数学、英语的三门期中考试&#xff0c;她想请你编个程序来帮她算算她的平均分。 要求输入三个正整数&#xff0c;分别表示三科考试的分数&#xff0c;输…

vue+springboot多角色登录

①前端编写 将Homeview修改为manager Manager&#xff1a; <template><div><el-container><!-- 侧边栏 --><el-aside :width"asideWidth" style"min-height: 100vh; background-color: #001529"><div style"h…

软件库V1.2版本开源-首页UI优化

iAppV3源码&#xff0c;首页的分类更换成了标签布局&#xff0c;各位可以参考学习&#xff0c;界面名称已经中文标注&#xff01; 老版本和现在的版本还是有较大的区别的&#xff0c;建议更新一下&#xff01; 新版本改动界面如下&#xff1a; 1、首页.iyu&#xff1a;分类按…

【Vue】Vue3中的OptionsAPI与CompositionAPI

文章目录 OptionsAPICompositionAPI对比总结 OptionsAPI 中文名:选项式API通过定义methods,computed,watch,data等属性方法&#xff0c;处理页面逻辑。以下是OptionsAPI代码结构 实例代码: <script lang"ts">// js或者tsimport { defineComponent } from vu…