前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【uniapp】个推H5号码认证一键登录(附代码)

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

作者头像
德宏大魔王
发布2024-05-25 12:30:07
3140
发布2024-05-25 12:30:07
举报
文章被收录于专栏:cloud stdio

前言

最近在做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

免费赠送

100

1000

100

服务态度

两天没问明白排队时间长

及时

未了解

同等套餐费用

便宜

便宜

最便宜


认证

实名认证

我建议企业认证,优惠多

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

产品认证

应用服务中新建一键认证,根据流程往下,添加H5认证

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

开通

产品开通后

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

需要进行H5域名配置

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

官方SDK

如有需要请自己下载


对接H5号码认证

H5认证页面

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

修改oneLogin.html
代码语言:javascript
复制
<!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所访问的域名

代码语言:javascript
复制
<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进行传输数据,在该页面进行其他接口操作

代码语言:javascript
复制
<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(也就是加密的手机号)

代码语言:javascript
复制
<?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)
);   
}  
  
?>

解密操作

代码语言:javascript
复制
// 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 个推号码认证业务流程
      • 目录
  • 产品成功演示
  • 阿里云认证的演示图
  • 个推演示图
  • 对比
  • 认证
    • 实名认证
    • 产品认证
    • 开通
    • 官方SDK
    • 对接H5号码认证
      • H5认证页面
        • 修改oneLogin.html
      • uniapp配置
        • 新建index.vue
        • 新建pages2.vue
      • 新建api.php
        • 解密操作
        • 完整项目代码
        相关产品与服务
        号码认证
        号码认证(Number Verification Service)集成了三大运营商特有的网关取号、验证能力,自动通过底层数据网关和短信网关识别本机号码,在不泄漏用户信息的前提下,安全、快速地验证用户身份。提供一键登录、本机校验两大功能,实现一键免密注册、登录、校验,提升用户使用体验。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档