接入移动手机号一键登录类的封装,app应用,php服务端类的封装与调用
需求:实现手机号一键登录,由于官方只有java的demo和jar包,没有php的sdk及demo
<?php
/*
* 手机号一键登录加解密
*/
class Autophone
{
const A_APPID='xxxx';//Android appid
const IOS_APPID='xxxxxxxxx';//IOS appid
const PRIVATEKEY='/upload/file/rsa_private_key.pem';//私钥地址
const PUBLICKEY='/upload/file/rsa_pub_key.pem';//公钥地址
public $privateKey;//私钥资源
public $publicKey;//公钥资源
const API_URL='https://onekey2.cmpassport.com/unisdk/rsapi/loginTokenValidate';//请求地址
const VERSION='2.0';//参数,文档让写死
const STRICTCHECK="0";//参数,文档让写死
const ENCRTYTYPE='RSA';//参数,文档让写死
public $appid='';
public function __construct($type=1)
{
$this->appid=$this->getAppid($type);
$this->_getPrivateKey(getcwd().self::PRIVATEKEY);
$this->_getPublicKey(getcwd().self::PUBLICKEY);
}
/**
*获取公钥
*
* @param $file
*
*/
private function _getPublicKey($file)
{
$key_content = $this->_readFile($file);
if ($key_content) {
$this->publicKey = openssl_get_publickey($key_content);
}
}
/**
*获取私钥
*
* @param $file
*
*/
private function _getPrivateKey($file)
{
$key_content = $this->_readFile($file);
if ($key_content) {
$this->privateKey = openssl_get_privatekey($key_content);
}
}
/**
*读文件
*
* @param $file
*
* @return bool|string
* @throws Exception
*/
private function _readFile($file)
{
$ret = false;
if (!file_exists($file)) {
throw new Exception('pem file not found');
} else {
$ret = file_get_contents($file);
}
return $ret;
}
/**
*$data = $appId . $traceId . $timestamp . $token . $version;
*$appId 应用id
*$traceId 请求id
*$timestamp 时间戳,精确到毫秒
*$token 前端参数
*$version 版本号
*@param $data
*
* @return string
*/
public function sign($token)
{
$appid=$this->appid;
$data=$appid.$token;
$signature = '';
openssl_sign($data, $signature, $this->privateKey, 7);
return bin2hex($signature);
}
/**
*安卓和ios appid 不同
*
* @param $type
*
* @return string
*/
public function getAppid($type){
return $type==1 ? self::A_APPID: self::IOS_APPID ;
}
/**
*转成hex编码
*
* @param bool $hex
*
* @return bool|string
*/
public function _hex2bin($hex = false)
{
$ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;
return $ret;
}
/**
*编码方式
*
* @param $data
* @param $code
*
* @return bool|string
*/
public function _decode($data, $code)
{
switch (strtolower($code)) {
case 'base64':
$data = base64_decode($data);
break;
case 'hex':
$data = $this->_hex2bin($data);
break;
case 'bin':
default:
}
return $data;
}
/**
*解密手机号
*
* @param $data
*
* @return string
* @throws Exception
*/
public function decrypt($data){
$data = $this->_decode($data, 'hex');
$decrypted='';
$return_de = openssl_private_decrypt($data, $decrypted, $this->privateKey);
if (!$return_de) {
throw new Exception("解密失败");
}
return $decrypted;
}
/**
*构建请求参数
*
* @param $token
* @param $sign
*
* @return false|string
*/
public function buildParam($token){
$sign=$this->sign($token);
return json_encode([
'version'=>self::VERSION,
'msgid'=>substr(getLoggerId(),0,36),
'systemtime'=>get_millisecondNew(),
'strictcheck'=>self::STRICTCHECK,
'appid'=>$this->appid,
'token'=>$token,
'sign'=>$sign,
'encryptionalgorithm'=>'RSA'
]);
}
}
//调用,token由前端传入
$class= new Autophone($type);//type 1=安卓,2=ios
$json=$class->buildParam($token);//组装参数
$data=$http::curlPost($class::API_URL,$json,15,'json');//发送请求
if($data['resultCode'] !=103000 || empty($data['msisdn'])){
throw new Exception($data['resultCode'] .'-'. $data['desc']);
}
$phone=$class->decrypt($data['msisdn']);//解密手机号
接入移动手机号一键登录类的封装,app应用,php服务端类的封装与调用的更多相关文章
- 单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造
接上篇 单点登录(SSO)解决方案之 CAS 入门案例 服务端数据源设置: 开发中,我们登录的user信息都是存在数据库中的,下面说一下如何让用户名密码从我们的数据库表中做验证. 案例中我最终把cas ...
- cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...
- cocos2d-x开发:服务端基础库封装
元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...
- SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...
- 一键登录已成大势所趋,Android端操作指南来啦!
根据极光(Aurora Mobile)发布的<2019年Q2移动互联网行业数据研究报告>,2019年第二季度,移动网民人均安装APP总量已达56款.面对如此繁多的APP,想在用户的手机中占 ...
- unapp一键登录
一.整理思路 un-app官网提供多种实现[一键登录](https://uniapp.dcloud.net.cn/uniCloud/univerify "")的方法,这里的选择是 ...
- 客户端获取服务端自定义类数据 z
客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...
- WCF学习心得--客户端获取服务端自定义类数据
因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...
- 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-1.数据信息安全--微信授权一键登录功能介绍
笔记 1.数据信息安全--微信授权一键登录功能介绍 简介:讲解登录方式优缺点和微信授权一键登录功能介绍 1.手机号或者邮箱注册 优点: ...
随机推荐
- 4.3 C++ Boost 日期时间操作库
Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...
- LyScript 计算片段Hash并写出Excel
本案例将学习运用LyScript计算特定程序中特定某些片段的Hash特征值,并通过xlsxwriter这个第三方模块将计算到的hash值存储成一个excel表格,本例中的知识点可以说已经具备了简单的表 ...
- 详细了解Transformer:Attention Is All You Need
1. 背景 在机器翻译任务下,RNN.LSTM.GRU等序列模型在NLP中取得了巨大的成功,但是这些模型的训练是通常沿着输入和输出序列的符号位置进行计算的顺序计算,无法并行. 文中提出了名为Trans ...
- 如何修改11g RAC集群名称
背景:有一套11.2.0.4 RAC集群的环境,为了测试DG,直接复制了一套一模一样的环境,修改过IP之后,依然有问题,无法同时启动. 初步判断是因为在同一子网存在两个同名的集群(都是jystdrac ...
- .NET Core开发实战(第8课:配置框架:让服务无缝适应各种环境)--学习笔记
08 | 配置框架:让服务无缝适应各种环境 配置是应用程序发布到各种环境的必备能力,这一节开始详细讲解 ASP.NET Core 的配置框架 配置框架的核心包有两个,一个抽象包,一个实现包 Micro ...
- jvm的简介
什么是jvm? java虚拟机就是二进制字节码的运行环境.我们可以把jvm看做是运行在不同系统上的一个软件应用的计算机,就比如说我们要打开图片,就得用看图软件,或者我们要对文件进行解压,是不是得用解压 ...
- 从零开始的react入门教程(五),了解react中的表单,何为受控组件与非受控组件
壹 ❀ 引 我们在从零开始的react入门教程(四),了解常用的条件渲染.列表渲染与独一无二的key一文中介绍了react中常用的条件渲染操作,比如三元运算符,逻辑运算符等,结合react组件或者re ...
- Codeforces Round #847 (Div. 3) A-G
比赛链接 A 题意 判断输入字符串与 \(\pi\) 的最长前缀匹配,不超过 \(30\) 位. 题解 知识点:模拟. 抄样例最后一个 \(30\) 都正确的,直接匹配. 时间复杂度 \(O(1)\) ...
- NC19910 [CQOI2007]矩形RECT
题目链接 题目 题目描述 给一个a*b矩形,由a*b个单位正方形组成.你需要沿着网格线把它分成分空的两部分,每部分所有格子连通,且至少有一个格子在原矩形的边界上."连通"是指任两个 ...
- 马上就要元宵节了,这里给大家用css端上一碗汤圆
「更多福利资讯查看:2024 首次大厂挑战」. ` .... ` .bowl_wrap{ width: 200px; height: 220px; margin: 100px auto; positi ...