接入移动手机号一键登录类的封装,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.手机号或者邮箱注册 优点: ...
随机推荐
- C++ Boost 异步网络编程基础
Boost库为C++提供了强大的支持,尤其在多线程和网络编程方面.其中,Boost.Asio库是一个基于前摄器设计模式的库,用于实现高并发和网络相关的开发.Boost.Asio核心类是io_servi ...
- 递归锁和死锁(Python)
一.递归锁 # Lock :互斥锁 效率高 # RLock :递归(recursion)锁 效率相对低 在同一个线程中可以被acquire多次,如果想要释放锁,acquire多少次就要release多 ...
- WinForm之ComboBox实现模糊查询
ComboBox实现模糊查询 第一步:在Form_Load事件中绑定数据源 第二步:写一个方法,返回一个List<string>类型的集合来存储控件中的Items 第三步:在Form_Lo ...
- Python常用脚本-查询数据库,调用网站接口,下载文件保存到本地
# coding=utf-8 # 证照模板下载,查询中心库,调用网站接口,下载文件保存到本地 import requests import json import datetime import xl ...
- 基于SLAM的规划算法仿真复现|SLAM|智能规划
图片来自百度百科 前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总https: ...
- 【Flink入门修炼】1-3 Flink WordCount 入门实现
本篇文章将带大家运行 Flink 最简单的程序 WordCount.先实践后理论,对其基本输入输出.编程代码有初步了解,后续篇章再对 Flink 的各种概念和架构进行介绍. 下面将从创建项目开始,介绍 ...
- CentOS7环境源码安装python3.9
操作系统 : CentOS7.6.1810_x64 Python 版本 : 3.9.12 1.获取源代码 python官方网址: https://www.python.org/ 源码下载地址: 或者直 ...
- 鹏程杯子2023 pwn
主要就是修改stdin的最后几位,使他变为write,然后泄露libc,为所欲为即可. 本人是卡在不知道stdin那里可以修改. 然后使用一下jmp qword rbp这个gadget 0x400a9 ...
- .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
前言 很多同学都不愿给电脑设动态壁纸,其中有个重要原因就是嫌它占资源过多.今天大姚分享一个.NET开源.免费(MIT license)的一个小而快并且功能强大的 Windows 动态桌面软件,支持视频 ...
- Elasticsearch不同集群间备份恢复(S3存储)
S3存储 首先都知道需要在ES集群上安装S3插件以及重启集群 在MINIO集群创建相应的桶 Kibana上注册快照存储库,两个不同的集群需要对接到同一个S3存储库,对接后会自动识别桶里的快照 < ...