需求:实现手机号一键登录,由于官方只有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服务端类的封装与调用的更多相关文章

  1. 单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造

    接上篇 单点登录(SSO)解决方案之 CAS 入门案例 服务端数据源设置: 开发中,我们登录的user信息都是存在数据库中的,下面说一下如何让用户名密码从我们的数据库表中做验证. 案例中我最终把cas ...

  2. cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...

  3. cocos2d-x开发:服务端基础库封装

    元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...

  4. SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...

  5. 一键登录已成大势所趋,Android端操作指南来啦!

    根据极光(Aurora Mobile)发布的<2019年Q2移动互联网行业数据研究报告>,2019年第二季度,移动网民人均安装APP总量已达56款.面对如此繁多的APP,想在用户的手机中占 ...

  6. unapp一键登录

    一.整理思路 un-app官网提供多种实现[一键登录](https://uniapp.dcloud.net.cn/uniCloud/univerify "")的方法,这里的选择是 ...

  7. 客户端获取服务端自定义类数据 z

    客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...

  8. WCF学习心得--客户端获取服务端自定义类数据

    因项目需求,需要一个WCF服务,赶鸭子上架吧!下面直接切入正题! 首先创建WCF应用程序,具体如何创建就不赘述了,网上一大篇,我主要说说自己遇到的问题 问题一:超时问题,在最后获取数据的时候突然提示服 ...

  9. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)

    查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...

  10. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-1.数据信息安全--微信授权一键登录功能介绍

    笔记 1.数据信息安全--微信授权一键登录功能介绍 简介:讲解登录方式优缺点和微信授权一键登录功能介绍         1.手机号或者邮箱注册             优点:              ...

随机推荐

  1. 错误的daemon.json配置,导致docker容器启动失败 Failed to start Docker Application Container Engine

    docker学习-配置错误的源 问题点剖析 参考 docker学习-配置错误的源 问题点剖析 使用docker安装了nginx,编写Dockerfile,映射端口,终于跑起来了.但是,当我重启服务器, ...

  2. 基于知识图谱的《红楼梦》人物关系可视化及问答系统(含码源):命名实体识别、关系识别、LTP简单教学

    基于知识图谱的<红楼梦>人物关系可视化及问答系统(含码源):命名实体识别.关系识别.LTP简单教学 文件树: app.py是整个系统的主入口 templates文件夹是HTML的页面 |- ...

  3. [转发]MySQL安装配置教程(超级详细、保姆级)

    MySQL安装配置教程(超级详细.保姆级)_SoloVersion的博客-CSDN博客_mysql安装配置教程一. 下载MySQLMysql官网下载地址https://downloads.mysql. ...

  4. .net ELk 成功使用

    原文地址: http://t.zoukankan.com/shousiji-p-15222276.html

  5. Delphi判断一个字符串在另一个字符串中出现的次数 7个方法的效率对比。

    unit Unit14; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...

  6. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记

    任务16:oauth2 + oidc 实现 client部分 实现 client 之前启动一下上一节的 server,启动之前需要清除一些代码 注释 Program 的 MigrateDbContex ...

  7. JS Leetcode 33. 搜索旋转排序数组题解,图解旋转数组中的二分法

    壹 ❀ 引 本来今天(2021.4.7)的每日一题是81. 搜索旋转排序数组 II,但今天工作很忙,下班人基本累个半死,题目别说按照二分法的思路做不出来,连题解看了会都没法沉下心去看,不过得到的信息是 ...

  8. 从零开始的微信小程序入门教程(三),有趣且好玩的数据绑定

    壹 ❀ 引 我在从零开始的微信小程序入门教程(二),初识WXML与WXSS一文中简单介绍了小程序组件与小程序样式相关概念,在了解这两者之后,其实我们已经可以搭建出简单的静态页面,与书写HTML页面一样 ...

  9. 多层PCB线路板制作流程

    PCB制作第一步是整理并检查pcb多层线路板布局(Layout).电路板制作工厂收到PCB设计公司的CAD文件,由于每个CAD软件都有自己独特的文件格式,所以深圳PCB板厂会转化为一个统一的格式Ger ...

  10. Python中`yield`关键字详解

    Python中`yield`关键字有什么用? Python中yield关键字有什么用? 它能做什么? 例如,我试图理解这段代码1: def _get_child_candidates(self, di ...