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

落日映苍穹つ 2024-04-20 22:30 184阅读 0赞

前言

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <!-- <meta > 生产上有https访问的,会导致上报的referer为空,移动运营商会去校验请求referer是否进行备案-->
  8. <!-- step2: 添加meta -->
  9. <meta content="always" name="referrer">
  10. <title>H5 一键登录demo</title>
  11. <style>
  12. body {
  13. display: flex;
  14. align-items: center;
  15. justify-content: center;
  16. flex-direction: column;
  17. height: 300px;
  18. }
  19. p {
  20. font-size: 14px;
  21. }
  22. </style>
  23. <!-- 手机查看日志 -->
  24. <!-- <script src="https://cdn.bootcss.com/vConsole/3.3.0/vconsole.min.js"></script>
  25. <script>
  26. var vConsole = new VConsole();
  27. </script> -->
  28. <!-- 本机验证本身不需要jquery 库,此处使用仅为了在demo中减少代码量 -->
  29. <script src="//apps.bdimg.com/libs/jquery/1.9.1/jquery.js"></script>
  30. <!-- stpe1: 引入JS -->
  31. <!-- 引入axios 网络请求依赖此库-->
  32. <!-- <script src="https://unpkg.com/axios/dist/axios.min.js"></script> -->
  33. <!-- 本地依赖 -->
  34. <script src="axios.min.js"></script>
  35. <!-- 引入gysdk-min.js 注意路径-->
  36. <script src="gysdk-min.js"></script>
  37. <script type="text/javascript">
  38. var userAgent = navigator.userAgent;
  39. if (userAgent.indexOf('AlipayClient') > -1) {
  40. // 支付宝小程序的 JS-SDK 防止 404 需要动态加载,如果不需要兼容支付宝小程序,则无需引用此 JS 文件。
  41. document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');
  42. } else if (/QQ/i.test(userAgent) && /miniProgram/i.test(userAgent)) {
  43. // QQ 小程序
  44. document.write(
  45. '<script type="text/javascript" src="https://qqq.gtimg.cn/miniprogram/webview_jssdk/qqjssdk-1.0.0.js"><\/script>'
  46. );
  47. } else if (/miniProgram/i.test(userAgent) && /micromessenger/i.test(userAgent)) {
  48. // 微信小程序 JS-SDK 如果不需要兼容微信小程序,则无需引用此 JS 文件。
  49. document.write('<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"><\/script>');
  50. } else if (/toutiaomicroapp/i.test(userAgent)) {
  51. // 头条小程序 JS-SDK 如果不需要兼容头条小程序,则无需引用此 JS 文件。
  52. document.write('<script type="text/javascript" src="https://s3.pstatp.com/toutiao/tmajssdk/jssdk-1.0.1.js"><\/script>');
  53. } else if (/swan/i.test(userAgent)) {
  54. // 百度小程序 JS-SDK 如果不需要兼容百度小程序,则无需引用此 JS 文件。
  55. document.write('<script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.22.js"><\/script>');
  56. } else if (/quickapp/i.test(userAgent)) {
  57. // quickapp
  58. document.write('<script type="text/javascript" src="https://quickapp/jssdk.webview.min.js"><\/script>');
  59. }
  60. if (!/toutiaomicroapp/i.test(userAgent)) {
  61. document.querySelector('.post-message-section').style.visibility = 'visible';
  62. }
  63. </script>
  64. <script type="text/javascript" src="https://b.bdstatic.com/searchbox/icms/searchbox/js/swan-2.0.22.js"></script>
  65. <!-- uni 的 SDK -->
  66. <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
  67. </head>
  68. <body>
  69. <h3>H5 一键登录 demo 演示</h3>
  70. <p>点击登录体验 H5 一键登录</p>
  71. <button id='test'>登录</button>
  72. <p>此处为点击登录模拟场景, 接入方可根据业务需求,进行修改</p>
  73. </body>
  74. </html>
  75. <script>
  76. // 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
  77. document.addEventListener('UniAppJSBridgeReady', function () {
  78. const appid = "dC***输入你的appid*****b2"
  79. //初始化个验SDK
  80. function initGy() {
  81. GyManager.setDebugMode(true)
  82. GyManager.init({
  83. app: "***输入你的app名***",
  84. appid: appid, timeout: 3000, onResult: function (res) {
  85. console.log("demo init ", res);
  86. if (res.success) {
  87. initResult = res;
  88. }
  89. }
  90. });
  91. }
  92. //保存初始化结果
  93. let initResult;
  94. // 可提前判断网络状态 决定是否初始化H5一键登录
  95. var nettype = GyManager.checkNetInfo();
  96. console.log("demo checkNetInfo", nettype);
  97. // 根据客户业务进行判断 网络判断返回 cellular、 wifi、 unknown
  98. if (nettype === 'wifi') {
  99. // 可选方案:
  100. // 1: 提示用户关闭wifi 进行体验
  101. // 2: 直接降级走其他验证形式
  102. console.error("demo wifi状态无法一键登录")
  103. uni.navigateTo({
  104. url: '/pages/pages2/pages2?text=wifi状态无法一键登录'
  105. });
  106. //调用服务端校验接口
  107. // 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
  108. //调用服务端校验接口
  109. } else {
  110. // stpe3: 初始化H5一键登录
  111. initGy()
  112. }
  113. // 模拟点击登录场景 可以在页面加载的时候判断网络状态后初始化就调用gateway方法
  114. $('#test').click(() => {
  115. // 调用H5一键登录
  116. if (!initResult) {
  117. uni.navigateTo({
  118. url: '/pages/pages2/pages2?text=gysdk初始化失败,无法登录'
  119. });
  120. console.error("demo gysdk初始化失败,无法登录")
  121. // 降级走其他验证方式
  122. return
  123. }
  124. //step5: 调用H5 一键登录
  125. GyManager.oneLogin({
  126. canSwithch: true,
  127. logo:"./logo.png",
  128. onTokenSuccess: function (res) {
  129. console.log("demo onTokenSuccess", res);
  130. console.log(res['code'])
  131. console.log(res['accesscode'])
  132. console.log(res['gyuid'])
  133. // console.log(res['code'])
  134. //调用服务端校验接口
  135. // 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
  136. uni.navigateTo({
  137. url: '/pages/pages2/pages2?text=登陆成功&code='+res['code']+'&accesscode='+res['accesscode']+'&gyuid='+res['gyuid']
  138. });
  139. //调用服务端校验接口
  140. },
  141. onTokenFail: function (err) {
  142. //调用服务端校验接口
  143. // 待触发 `UniAppJSBridgeReady` 事件后,即可调用 uni 的 API。
  144. uni.navigateTo({
  145. url: '/pages/pages2/pages2?text=登陆失败'
  146. });
  147. //调用服务端校验接口
  148. console.error("demo onTokenFail", err);
  149. }
  150. });
  151. })
  152. });
  153. </script>

在这里插入图片描述

uniapp配置

新建index.vue

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

  1. <template>
  2. <view>
  3. <web-view src="https://****/h5authlogin/oneLogin.html"></web-view>
  4. </view>
  5. </template>
  6. <script>
  7. export default {
  8. data() {
  9. return {
  10. }
  11. },
  12. methods: {
  13. }
  14. }
  15. </script>
  16. <style>
  17. </style>

新建pages2.vue

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

  1. <template>
  2. <view class="">
  3. {
  4. {
  5. text}}
  6. <br />
  7. {
  8. {
  9. code}}
  10. <br />
  11. {
  12. {
  13. gyuid}}
  14. <br />
  15. {
  16. {
  17. accesscode}}
  18. <br />
  19. </view>
  20. </template>
  21. <script>
  22. export default {
  23. data() {
  24. return {
  25. text:'',
  26. code:'',
  27. gyuid:'',
  28. accesscode:''
  29. }
  30. },
  31. onLoad(options) {
  32. console.log(options.text)
  33. console.log(options.code)
  34. console.log(options.gyuid)
  35. console.log(options.accesscode)
  36. this.text=options.text;
  37. this.code=options.code;
  38. this.gyuid=options.gyuid;
  39. this.accesscode=options.accesscode;
  40. uni.request({
  41. url: 'https://******/api.php', //仅为示例,并非真实接口地址。
  42. data: {
  43. token:options.accesscode,
  44. gyuid:options.gyuid
  45. },
  46. method: 'POST',
  47. header: {
  48. 'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
  49. },
  50. success: (res) => {
  51. console.log(res.data);
  52. if (res.data.code==200) {
  53. uni.showToast({
  54. title:res.data.msg,
  55. duration:3000
  56. })
  57. } else if(res.data.code==100){
  58. uni.showToast({
  59. title:res.data.msg,
  60. duration:3000,
  61. icon:'none'
  62. })
  63. }
  64. }
  65. });
  66. },
  67. methods: {
  68. }
  69. }
  70. </script>

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

新建api.php

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

  1. <?php
  2. // 假设你已经有了这些参数的值
  3. $appId = 'dCZI*********pb2';
  4. $timestamp = round(microtime(true) * 1000); // 获取当前毫秒时间戳
  5. $token = $_POST['token'];
  6. $gyuid = $_POST['gyuid'];
  7. // 构建请求参数
  8. $params = [
  9. 'appId' => $appId,
  10. 'timestamp' => $timestamp,
  11. 'token' => $token,
  12. 'gyuid' => $gyuid
  13. ];
  14. // 将请求参数转换为JSON字符串
  15. $jsonData = json_encode($params);
  16. // 初始化cURL会话
  17. $ch = curl_init();
  18. // 设置cURL选项
  19. curl_setopt($ch, CURLOPT_URL, 'https://h-gy.getui.net/v2/gy/ct_login/gy_get_pn');
  20. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  21. curl_setopt($ch, CURLOPT_POST, true);
  22. curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
  23. curl_setopt($ch, CURLOPT_HTTPHEADER, [
  24. 'Content-Type: application/json',
  25. 'Content-Length: ' . strlen($jsonData)
  26. ]);
  27. // 执行请求并获取响应
  28. $response = curl_exec($ch);
  29. // 检查是否有错误发生
  30. if(curl_errno($ch)){
  31. $error_msg = curl_error($ch);
  32. echo "cURL Error: " . $error_msg;
  33. }
  34. // 关闭cURL会话
  35. curl_close($ch);
  36. // 处理响应
  37. if ($response) {
  38. // 假设服务器返回的是JSON格式的数据,我们将其解码为PHP数组或对象
  39. $result = json_decode($response, true);
  40. $code=$result['data']['result'];
  41. if ($code==20000) {
  42. die(
  43. json_encode(
  44. array(
  45. 'code' => 200,
  46. 'msg' => '返回成功',
  47. 'data' => $result
  48. ),480)
  49. );
  50. } else {
  51. // fail
  52. die(
  53. json_encode(
  54. array(
  55. 'code' => 100,
  56. 'msg' => '返回错误',
  57. 'data' => $result
  58. ),480)
  59. );
  60. }
  61. } else {
  62. die(
  63. json_encode(
  64. array(
  65. 'code' => 100,
  66. 'msg' => '错误',
  67. 'data' => ''
  68. ),480)
  69. );
  70. }
  71. ?>

解密操作

  1. // success解密
  2. $pn=$result['data']['data']['pn'];
  3. // 解密
  4. // 密文及密钥
  5. // $pn = '1fbf2605f954fad3ba18115000735aee';
  6. $masterSecret = 'bZBM********a8';
  7. // 参数设置
  8. $encryptMethod = 'aes-128-cbc';
  9. $iv = '0000000000000000';
  10. // 取16位密钥
  11. $key = $masterSecret;
  12. while(strlen($key) < 16){
  13. $key .= $masterSecret;
  14. }
  15. $key = substr($key, 0, 16);
  16. // 解密
  17. $result = openssl_decrypt(hex2bin($pn), $encryptMethod, $key, 1, $iv);
  18. //echo $result;
  19. // 解密成功返回手机号

完整项目代码

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爬虫脚本项目实战
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,184人围观)

还没有评论,来说两句吧...

相关阅读

    相关 uniapp H5 JSSDK封装使用

    先看效果吧, 封装以后使用很方便,两行代码就能得到微信网页开发中的 jssdk 的 wx.config 执行了 wx.ready 还是 wx.error ,如果返回 true