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

news2024/10/7 6:44:35

前言

最近在做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)) {
			// quickapp
			document.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"
    //初始化个验SDK
    function 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、 unknown
    if (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 {
        // fail
        die(
        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.coloradmin.cn/o/1577606.html

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

相关文章

低代码如何集成多平台(企业微信、钉钉、飞书)SDK,且听我细细道来

前言 我们是一家做低代码产品开发的公司&#xff0c;我司的低代码产品支持在多个平台环境内使用&#xff1a;有钉钉、企业微信、微信、飞书、Web浏览器&#xff08;如谷歌&#xff09;&#xff0c;后续还会接入更多平台。面对这么多平台&#xff0c;每个平台的SDK可能一致&…

磁盘类型与IOPS性能指标

目录 1.磁盘的访问模式 2.磁盘分类 2.1 HDD机械磁盘 2.1.1 机械磁盘性能 2.1.2 IOPS 2.1.3 提升IOPS性能手段 2.1.4 RAID技术 RAID 0 RAID 1 RAID 5 RAID 6 RAID 10 RAID 50 RAID总结 2.2 SSD固态硬盘 2.2.1 查看磁盘调度算法 2.2.2 修改磁盘调度算法 2.2.3 …

lottery-攻防世界

题目 flag在这里要用钱买&#xff0c;这是个赌博网站。注册个账号&#xff0c;然后输入七位数字&#xff0c;中奖会得到相应奖励。 githacker获取网站源码 &#xff0c;但是找到了flag文件但是没用。 bp 抓包发现api.php&#xff0c;并且出现我们的输入数字。 根据题目给的附…

DNFOMP:杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器

DNFOMP&#xff1a;杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器 附赠自动驾驶学习资料和量产经验&#xff1a;链接 摘要 本文介绍了DNFOMP&#xff1a;杂乱环境中自动驾驶汽车导航的动态神经场最优运动规划器。动态变化环境中的运动规划是自动驾驶中最复杂的挑战之…

RA8900CE计时芯片介绍及开发方案

计时芯片 就是一个需要连接32.768k晶振的RTC芯片 规格书阅读 首先我们先读懂这个芯片是怎么用的。 引脚表 封装是这样的&#xff0c;一共10个引脚。 基本上一看这个引脚表就知道大概。 T1和T2是工厂测试的&#xff0c;不用管。 SCL和SDA是IIC通讯用的。 FOUT和FOE就是链…

文献速递:深度学习胰腺癌诊断--胰腺肿瘤的全端到端深度学习诊断

Title 题目 Fully end-to-end deep-learning-based diagnosis of pancreatic tumors 胰腺肿瘤的全端到端深度学习诊断 01 文献速递介绍 胰腺癌是最常见的肿瘤之一&#xff0c;预后不良且通常是致命的。没有肿瘤的患者只需要进一步观察&#xff0c;而胰腺肿瘤的诊断需要紧…

C/C++中局部变量static用法实例

1. 普通局部变量存储于进程栈空间&#xff0c;使用完毕会立即释放&#xff0c;静态局部变量使用static修饰符定义&#xff0c;即使在声明时未赋初值&#xff0c;编译器也会把它初始化为0&#xff0c;并且静态局部变量存储于进程的全局数据区&#xff0c;即使函数返回&#xff0…

用three.js做一个3D汉诺塔游戏(下)

本文由孟智强同学原创。 接上期&#xff1a;《用three.js做一个3D汉诺塔游戏&#xff08;上&#xff09;》 在上一期&#xff0c;我们成功地搭建了基础的 3D 场景。在本期中&#xff0c;我们将对场景进行优化&#xff0c;使其在视觉上更加真实&#xff0c;并为场景中的物体添加…

golang es查询的一些操作,has_child,inner_hit,对索引内父子文档的更新

1.因为业务需要查询父文档以及其下子文档&#xff0c;搞了很久才理清楚。 首先还是Inner_hits,inner_hits只能用在nested,has_child,has_parents查询里面 {"query": {"nested": {"path": "comments","query": {"match…

vulhub之fastjson篇-1.2.27-rce

一、启动环境 虚拟机:kali靶机:192.168.125.130/172.19.0.1(docker地址:172.19.0.2) 虚拟机:kali攻击机:192.168.125.130/172.19.0.1 本地MAC:172.XX.XX.XX 启动 fastjson 反序列化导致任意命令执行漏洞 环境 1.进入 vulhub 的 Fastjson 1.2.47 路径 cd /../../vulhub/fa…

企业IT运维事中故障定位方法及工具

企业IT故障定位指诊断故障直接原因或根因&#xff0c;故障定位有助于故障恢复动作更加有效。故障定位通常是整个故障过程中耗时最长的环节&#xff0c;定位的目标围绕在快速恢复的基础上&#xff0c;而非寻找问题根因&#xff0c;后者由问题管理负责。通常大部分可用性故障&…

GEE案例——小流域汇流计算以缅甸仰光为例(如何绘制除小流域内的河道)

简介 本案例主要介绍如何实现小流域内河流汇流的计算,这里需要用到地形中的坡度以及卷积的计算内容。 流域 流域是指一个地理区域内所有水流都会汇集到同一个主要水体(如河流、湖泊或海洋)的区域。流域由周围山脉、丘陵和地形特征所定义,其中的水流通过降水、融雪和地下…

计算机网络针对交换机的配置

实验 目的 交换机的基本配置&#xff0c;交换机VLAN配置 实验条件 Windows&#xff0c;Cisco packet tracer 实验 内容 交换机的基本配置&#xff0c;交换机VLAN配置 实验 过程 一、交换机的基本配置 进入特权模式 Switch>enable 进入配置模式 Switch#configure ter…

德国SycoTec义齿雕刻机主轴 助力高精密雕铣加工

随着科技的不断进步&#xff0c;义齿加工机械在牙科领域的应用越来越广泛。为了满足市场对高精度、高效率义齿加工设备的需求&#xff0c;SycoTec高速电主轴凭借其卓越的性能和可靠的质量&#xff0c;为CNC四轴、五轴义齿加工设备、五轴联动义齿加工中心、CAM/CAD义齿雕刻机、椅…

算法题中nextInt(),nextLine()的易错陷阱

nextInt()读取空格或回车前的整数 nextLine()读取回车前的一行&#xff0c;空格不会中断读取 陷阱代码如下&#xff1a; public class nextInt {public static void main(String[] args) {Scanner scannernew Scanner(System.in);System.out.println("请输入字符串数组…

C++11可变模板参数:海纳百川的Args

目录 一、可变模板参数的概念及功能 1.1Args的概念与使用 1.2获取args中的参数 二、emplace可变模板参数的实际应用 三、逗号表达式展开参数包 一、可变模板参数的概念及功能 1.1Args的概念与使用 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板…

item_get_app在竞品分析中的应用与效果评估

item_get_app作为淘宝开放平台的重要API接口&#xff0c;为商家在竞品分析中提供了强大的数据支持。在竞争激烈的电商市场中&#xff0c;竞品分析是商家不可或缺的一环&#xff0c;而item_get_app的应用则使得这一分析过程更加高效、精准。通过调用item_get_app接口&#xff0c…

C语言 08 类型转换

一种类型的数据转换为另一种类型的数据&#xff0c;这种操作称为类型转换。 类型转换分为自动类型转换和强制类型转换。 自动类型转换 比如现在希望将一个 short 类型的数据转换为 int 类型的数据&#xff1a; #include <stdio.h>int main(){short s 10;// 直接将s的…

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位&#xff0c;配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感 二、INCLUDES 包含&#xff0c;多…

275. 传纸条(DP)

题目描述 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。一次素质拓展活动中&#xff0c;班上同学安排坐成一个 m 行 n 列的矩阵&#xff0c;而小渊和小轩被安排在矩阵对角线的两端&#xff0c;因此&#xff0c;他们就无法直接交谈了。幸运的是&…