php 抖音授权登陆

前端:

<view class="form weapp"><button v-if="page.agree" open-type="getPhoneNumber" @getphonenumber="ttLogin" class="btn":class="{ disabled: !page.agree, 'ttprefix': page.mode== 'tt' }"><text>授权登录</text></button><view v-else class="btn" @click="validateChecked" :class="{ disabled: !page.agree }"><text class="text">授权登录</text></view>
</view>onLoad(({type
}) => {// #ifdef  MP-TOUTIAOpage.can_switch = truepage.mode = 'tt'douyinLogin() // 进入就请求抖音login// #endif});const douyinLogin = () => {return new Promise(function(reslove, reject) {tt.login({success(res) {if (res.code && res.anonymousCode) {reslove(res);page.ttcode = res.codepage.anonymousCode = res.anonymousCode} else {reject('登录失败!' + res.errMsg)}},fail(res) {console.log(`login 调用失败`);},})})
}// 按钮发起请求
// 抖音登陆
const ttLogin = (e) => {const account = tt.getEnvInfoSync()const appid = account.microapp.appId // 获取appidconst {iv,encryptedData} = e.detail;const code = page.ttcode;const anonymous_code = page.anonymousCode;if (code) {passport.ttlogin({appid,codeanonymous_code,iv,encryptedData}).then(({data,err,msg}) => {if (err === 0) {const {token,user} = data;auth.login(token, {...user});uni.showToast({title: "登录成功"});setTimeout(() => {handleBack();}, 1500)} else {uni.showToast({title: msg,icon: "none"});}});} else {uni.showModal({title: "提示",content: "拒绝授权将无法登陆小程序!",showCancel: false,});}// ttcheckSession()
}

后端:

/*** @notes:抖音授权登陆* @return \think\response\Json* User: Administrator* Author:timeAxis* @date: * @throws \think\db\exception\DbException* @throws \think\db\exception\ModelNotFoundException* @throws \think\db\exception\DataNotFoundException*/public function ttlogin(){$rules = ['appid'     => 'require','code'      => 'require','anonymous_code'    => 'require','source'    => 'string','inviter'    => 'string','iv'        => 'require','encryptedData'      => 'require'];$this->validate(request()->param(), $rules);$params = request()->only(array_keys($rules));$thirdmobile = ThirdPlatformUser::getmobile($params['appid'], $params['code'], $params['anonymous_code']);// 解密获取手机号$encryptedData = base64_decode($params['encryptedData'],true);$sessionKey = base64_decode($thirdmobile['data']['session_key']);$iv = base64_decode($params['iv']);$output = openssl_decrypt($encryptedData, 'AES-128-CBC',$sessionKey, 1,$iv);$output = json_decode($output, true);$mobile = $output['phoneNumber'];$user = User::where(['mobile' => $mobile,])->find();if(!$user){$lastFourDigits = substr($mobile, -4);$user = new User;$user->user_id  = User::genID();$user->username = $user->user_id;$user->mobile   = $mobile;$user->nickname = '昵称'.$lastFourDigits;$user->save();}$return = User::login_return($user);return success($return);}// 获取抖音授权凭证
public static function getmobile($appid, $code,$anonymous_code= null)
{$instance = App::instance(['app_id' => $appid,]);$resultparams = ['appid'      => $instance->app_id,'secret'     => $instance->secret,'code'       => $code,'anonymous_code' => $anonymous_code];$resultstr = json_encode($resultparams);$url = "https://developer.toutiao.com/api/apps/v2/jscode2session"; // 地址
//            $url = "https://open-sandbox.douyin.com/api/apps/v2/jscode2session"; // 测试$client = new Client;$resp = $client->post($url, ['body' => $resultstr]);$body = $resp->getBody()->getContents();$return = json_decode($body, true);if ($return['err_no']) {throw new \Exception("抖音授权失败: ".$return['errmsg']);}return $return;
}

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

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

相关文章

餐谱的展示程序

开发背景 可以根据分类直接找到需要展示的餐谱&#xff0c;大的分类A、B、C、D等 二级分类 A1、A2、A3、A4。。。 餐谱就是图片 加 说明 页面 选择一级分类A&#xff0c;选择二级分类A1&#xff0c;查询出该分类下的餐谱 代码 /*** 查询列表*/RequiresPermissions("…

node.js的Express框架的介绍 与 安装详细教程

一、Express框架介绍 &#xff08;1&#xff09;Express定义&#xff1a; Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用&#xff0c;和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 &#xff08…

关于数据结构的整理

一.BRTEE&#xff1a; B树介绍&#xff1a; B 树是一种多路平衡查找树&#xff0c;通常用于数据库索引结构&#xff0c;在B树中&#xff0c;所有的关键字都被存储在叶子节点上&#xff0c;并按照顺序连接成一个有序链表。B树具有很好的平衡性和高效性&#xff0c;适用于范围查…

IDEA 每次启动都显示选择项目页面

IDEA版本&#xff1a;2021.3.3 打开 Settings > Appearance & Behavior > System Settings 取消勾选 Reopen projects on startup 然后下次启动 IDEA 会显示选择项目页面

Nacos中的负载均衡策略:深度解析与应用实践

作为一名资深的架构师&#xff0c;我深知在微服务架构中&#xff0c;负载均衡的重要性不言而喻。它关乎着服务的可用性、性能和稳定性。在众多微服务治理组件中&#xff0c;Nacos以其简洁易用、功能强大的特点&#xff0c;赢得了广大开发者的青睐。今天&#xff0c;我们就来深入…

Python代码:一、HelloWorld

1、题目&#xff1a; 将字符串 Hello World! 存储到变量str中&#xff0c;再使用print语句将其打印出来。 2、代码 import sys str Hello World ! print(str)3、在sublime运行的结果

第18节 神级开源shellcode工具:donut

我做了一个关于shellcode入门和开发的专题&#x1f469;&#x1f3fb;‍&#x1f4bb;&#xff0c;主要面向对网络安全技术感兴趣的小伙伴。这是视频版内容对应的文字版材料&#xff0c;内容里面的每一个环境我都亲自测试实操过的记录&#xff0c;有需要的小伙伴可以参考。 我的…

python创建新环境并安装pytorch

python创建新环境并安装pytorch 一、创建新环境1、准备工作2、创建虚拟环境并命名3、激活虚拟环境 二、安装pytorch1、pytorch官网2、选择与你的系统相对应的版本3、安装成功 一、创建新环境 1、准备工作 本次创建的环境是在anaconda环境下&#xff0c;否则需要在纯净环境下创…

AutoNeRF:Training Implicit Scene Representations with Autonomous Agents

论文概述 《AutoNeRF》是由Pierre Marza等人撰写的一篇研究论文&#xff0c;旨在通过自主智能体收集数据来训练隐式场景表示&#xff08;如神经辐射场&#xff0c;NeRF&#xff09;。传统的NeRF训练通常需要人为的数据收集&#xff0c;而AutoNeRF则提出了一种使用自主智能体高效…

Spring Boot | Spring Boot 中 自定义“用户退出控制“、获取“登录用户信息“

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 ) :二、 自定义 "用户退出控制" ( 通过 "HttpSecurity类" 的 logout( )方法来实现 "自定义用户用户登录控制" ) :1.基础项目文件准备2.实现 "自定义身份认证"…

生产 Dockerfile 构建 nodejs 前端镜像打包内存溢出

错误&#xff1a;FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 该错误是在进行生产环境通过 Dockerfile 构建前端项目镜像时抛出的。 解决办法就是修改 node 内存限制&#xff1a; 从 Node.js v8.0 开始&…

springboot005学生心理咨询评估系统

springboot005学生心理咨询评估系统 亲测完美运行带论文&#xff1a;获取源码&#xff0c;私信评论或者v:niliuapp 运行视频 包含的文件列表&#xff08;含论文&#xff09; 数据库脚本&#xff1a;db.sql其他文件&#xff1a;ppt.ppt论文&#xff1a;开题.doc论文&#xf…

WT99C262-SG LoRa开发板使用教程

WT99C262-SG模块是全新一代的Wi-FiBLELoRa无线扩频模块&#xff0c;基于启明云端WTLRC262-SG系列模组设计开发的新一代LoRa扩频芯片方案设计的无线串口模块。具有多种传输方式&#xff0c;LoRa扩频技术&#xff0c;且模组大部分管脚均已引出至两侧排针&#xff0c;开发人员可根…

基于Springboot的高校电动车租赁系统。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的高校电动车租赁系统。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

(二刷)代码随想录第8天|344.反转字符串● 541. 反转字符串II

344.反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数…

音频筑基:200字说清声和音的区别(Sound/Audio/Music/Voice/Speech辨析)

音频筑基&#xff1a;200字说清声和音的区别(Sound/Audio/Music/Voice/Speech辨析) 音频筑基&#xff1a;200字说清声和音的区别 音频筑基&#xff1a;200字说清声和音的区别(Sound/Audio/Music/Voice/Speech辨析) 梳理如下&#xff1a; 声音 声(Sound) 广义&#xff1a;机械波…

【DevOps】linux 的网络绑定 (Bonding)应用

目录 一、什么是网络绑定 1、提高带宽 2、增加冗余和高可用性 3、 负载均衡 4、 故障转移 5、 多路径传输 二、主要模式 三、配置步骤 1、 安装必要的软件包 2、 加载 Bonding 内核模块 3、 配置网络接口 4、重启网络服务 四、测试和监控 Bonding 一、什么是网络绑…

爬虫界的“闪电侠”:异步爬虫与分布式系统的实战秘籍

Hi&#xff0c;我是阿佑&#xff0c;前文给大家讲了&#xff0c;如何做一个合法“采蜜”的蜜蜂&#xff0c;有了这么个自保的能力后&#xff0c;阿佑今天就将和大家踏入 —— 异步爬虫 的大门&#xff01; 异步爬虫大法 1. 引言1.1 爬虫框架的价值&#xff1a;效率与复杂度管理…

卷轴分红商城模式:适用于多种的商业营销模式

卷轴分红商城模式是一种基于区块链技术的去中心化积分商城系统&#xff0c;通过智能合约和数字资产分红实现积分流通和价值回馈&#xff0c;适用于多种场景。 什么是卷轴分红商城模式&#xff1a; 这是一个去中心化的积分商城系统&#xff0c;消费者在商城消费时&#xff0c;可…

番外篇 | 一文读懂卷积神经网络(CNN)的基础概念及原理

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。本文旨在对卷积神经网络进行详细的讲解,从基本原理到实际应用,帮助读者全面了解CNN的工作原理、优势和基本组成等,以及其在现实生…