接入移动手机号一键登录类的封装,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.手机号或者邮箱注册 优点: ...
随机推荐
- 【3】超级详细matplotlib使用教程,手把手教你画图!(多个图、刻度、标签、图例等)
相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...
- 19.0 Boost 基于ASIO网络编程技术
Boost ASIO库是一个基于C++语言的开源网络编程库,该库提供了成熟.高效.跨平台的网络API接口,并同时支持同步与异步两种模式,ASIO库提供了多重I/O对象.异步定时器.可执行队列.信号操作 ...
- ASCII、Unicode、UTF8 10年后,史无前例,自己用js实现《专题3》
我自己史无前例的开发了一个网页小工具,可以利用这个工具 直接查询到 一个字符的unicode二进制的定义,和utf8格式下内存中 存储的二进制. =========================== ...
- delphi调试 字符串 栈的地址,和栈中存的值
- NC50454 A Simple Problem with Integers
题目链接 题目 题目描述 给定数列 \(a[1],a[2], \dots,a[n]\) ,你需要依次进行q个操作,操作有两类: 1 l r x:给定l,r,x,对于所有 \(i \in[l,r]\) ...
- NVME(学习杂谈)—Asynchronous Event
Asynchronous Event Request Host Software Recommendations 当一个异步事件请求完成(提供Event Type,Event Information, ...
- Ubuntu20.04/22.04 ESP32 命令行开发环境配置
ESP32 芯片系列 ESP32分三个系列 ESP32-S ESP32-S3: Xtensa 32位 LX7 双核 240 MHz, 384KB ROM, 512KB SRAM, QFN7x7, 56 ...
- 优先队列(PriorityQueue)常用方法及简单案例
1 前言 PriorityQueue是一种特殊的队列,满足队列的"队尾进.队头出"条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆).具体调整如下 ...
- Java中各种比较对象方式对比
1.介绍 比较对象是面向对象编程语言的一个基本特征.在本教程中,我们将介绍Java语言的一些特性,这些特性允许我们比较对象.此外,我们还将研究外部库中的这些特性. 2.==和!=操作符 让我们从==和 ...
- Oracle高级队列介绍
原始链接:http://www.oracle-developer.net/display.php?id=411 oracle高级队列介绍 高级队列Advanced Queuing(AQ)在oracle ...