代码编织梦想

功能说明

  • 提交客户端获取到的token、opToken等数据,验证后返回手机号码

调用地址

请求头

  • Content-Type :application/json

入参说明

字段类型说明必传
appkeyStringapp标识Y
tokenString客户端的tokenY
opTokenString客户端返回的运营商tokenY
operatorString客户端返回的运营商,CMCC:中国移动通信, CUCC:中国联通通讯, CTCC:中国电信Y
signString签名(MD5(所有参数使用key的正序,通过a=b&b=c+appSecret组成))Y
timestamplong当前时间戳(毫秒)Y
md5StringAPK的md5签名,例:e4caa1a08ba0570b5c1290b1a0bc9252N

加密示例

  • 参数
"appkey" -> "2f2d7j9wf8a40"
"opToken" -> "f630dwff2f8f209c60a6449cf971ad50b3e83f4620a1536252457229836325"
"operator" -> "CUCC"
"token" -> "0:AAAAhAAAAIAIFOEDCVObiS1Pdyogg4JQw5Su4ce9rl/QVDaqKlcGDCzBssmrB3dYL3HcnNG9Gj7IzhiB/cRJF221cELTGHRiFGAjpGpjipkw/EbnoFuxjp3TPAhvprf/vqWm9dmUQCJ7P/+twKy5o5Y9XBBpD+W/jVPX/WbIQofYg3YGwAAAPDTY7g1X3rL326Dnlsifj/UDjoZ0Ftdh8qWG+ofn0P41bbO6q88id06vkU2x2eUEOb1RggqYt+BLHyG3PoLIC0AMGoUcTVyCcGYq15j+ZS23qiA2SLRYgwvvhD3N+HKTSWEPmYQDUKls5fckyQGW6x6yGB71NDUqwntBdQxwmT6W5NG379KyvPwRkZSN4cyJ29HugMMTx/0F9nF6YVgEogEHOms515lQ7f3TJqTidsVdIehQcDb2FdXnCJUjnOJTK4RWRHp9IvTxwXgmsT7WzkwWuSe/12sEx8Zdk2U66//nqgJ5c1FDbuHsqGlKA8fYyo="
"timestamp" -> 1655190952281
"appSecret" -> "9abee316611wd9ff607feb9f2c496338"
  • 排序结果
appkey=2f2d7j9wf8a40&opToken=f630dwff2f8f209c60a6449cf971ad50b3e83f4620a1536252457229836325&operator=CUCC&timestamp=1655190952281&token=0:AAAAhAAAAIAIFOEDCVObiS1Pdyogg4JQw5Su4ce9rl/QVDaqKlcGDCzBssmrB3dYL3HcnNG9Gj7IzhiB/cRJF221cELTGHRiFGAjpGpjipkw/EbnoFuxjp3TPAhvprf/vqWm9dmUQCJ7P/+twKy5o5Y9XBBpD+W/jVPX/WbIQofYg3YGwAAAPDTY7g1X3rL326Dnlsifj/UDjoZ0Ftdh8qWG+ofn0P41bbO6q88id06vkU2x2eUEOb1RggqYt+BLHyG3PoLIC0AMGoUcTVyCcGYq15j+ZS23qiA2SLRYgwvvhD3N+HKTSWEPmYQDUKls5fckyQGW6x6yGB71NDUqwntBdQxwmT6W5NG379KyvPwRkZSN4cyJ29HugMMTx/0F9nF6YVgEogEHOms515lQ7f3TJqTidsVdIehQcDb2FdXnCJUjnOJTK4RWRHp9IvTxwXgmsT7WzkwWuSe/12sEx8Zdk2U66//nqgJ5c1FDbuHsqGlKA8fYyo=
  • 计算结果
sign -> 3f1991b27b1c86a32e661eabdd3d1f5a

请求示例

curl --location --request POST 'http://identify.verify.mob.com/auth/auth/sdkClientFreeLogin' \
--header 'Content-Type: application/json' \
--data-raw '{"token":"0:AAAAhAAAAIAIJn3PvTUUJ94umGqPmZCFtprF5Pg7uCxb+Opp+JtZrHIX3yxVOGEHJQLHuRLU1hlTbYyxCMfW53fuck6OL1X+01qdf+NpTVj1ApmQzapKWFB3DEPNNdyad8HwxZY/ZGWcch0Njy+Pb0TgqMwAytBWKu5vlvN9LRoWw/6F3K4BGgAAAPDHlbG1uFKewi7J1g3d6tAor/kIHG0A8csscrESYVfmVYzB6RBfQWfwDpZIYLrXOuSFdWP3bqKbEyIiqvSeY3ktxSus2lUdD6MzwYo1aXJ6oALEW/A07Qx5/3S6ClSmtGrHuzDnC6JCsmHEQWR7S2wNLSojS95Zd91AC2gpqV5tmKEaVGDc827JVEHXFX6Zr5d0pNmBHLS0b67BrNfG4v0qSgcf/OL3a1xOQVieqUDbrAPiNF7Q2wifCbj0FQyIt5+LPpOkqKDbYff21WinJMTOuOMoJcqOhrI1gUEmnHE/ZU8ZZXN52Kffd+Pk7aR7MMU=","opToken":"a53c2dc92083cb1375218a0f1dd35e0050bb26e40ba0a1536204920384995379", "appkey": "2f2d7a68f8a40", "operator": "CUCC",  "sign": "576ec00ac6ad80a2d0a92872d748e82b", "timestamp": 1655094782181}'

响应示例

请求成功

{
    "error": null,
    "res": "ZfukzNuB5oKbxBKxK9MoYFzr1IDZ0Z/i+xLYyq/JCAmi24DPYHdGeUqxE6OjQuP3VY1c76CyfoU=",
    "seqid": "456484936150429696",
    "status": 200
}

请求失败

{
    "status": 4119342,
    "res": null,
    "error": "签名错误",
    "seqid": "null"
}
  • 响应参数
keydescription
error返回码描述
res加密后的JSON串,含有返回的手机号,需进行DES解密
seqid流水号,请求出错时可能为空
status返回码

数据解密

返回体中的res数据需要使用appSecet解密

  • 解密方式

DES/CBC/PKCS5Padding

偏移量 00000000

使用base64转码

  • 解密后示例
{   
    "isValid":1, 
    "phone": "13888888888",
    "valid":"true"
}
  • 字段说明
字段类型必传说明
isValidintegerY验证状态,1:成功, 2:失败
phonestringY返回手机号
validbooleanY验证状态 true 成功 false:失败

Java

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;

public class DES {

    public static final String ALGORITHM = "DES";
    public static final String PADDING = "DES/CBC/PKCS5Padding";
    private static final byte[] DEFAULT_INITIALIZATION_VECTOR = ("00000000".getBytes()) ;

    private String padding = PADDING;
    private byte[] initializationVectorBytes = DEFAULT_INITIALIZATION_VECTOR;
    private AlgorithmParameterSpec paramSpec;

    public static void main(String res,String appSecret) throws Exception {

        byte[] decode = DES.decode(Base64Utils.decode(res.getBytes()), appSecret.getBytes());
        String result = new String(decode);

    }


    public DES(){
        this.paramSpec = new IvParameterSpec(initializationVectorBytes);
    }

    public DES(String padding) {
        this.padding = padding;
        this.paramSpec = new IvParameterSpec(initializationVectorBytes);
    }

    public DES(String padding, byte[] initializationVectorBytes) {
        this.padding = padding;
        this.initializationVectorBytes = initializationVectorBytes;
        this.paramSpec = new IvParameterSpec(initializationVectorBytes);
    }

    public DES(byte[] initializationVectorBytes) {
        this.initializationVectorBytes = initializationVectorBytes;
        this.paramSpec = new IvParameterSpec(initializationVectorBytes);
    }


    public byte[] encodeBytes(byte[] data,byte[] key) throws Exception {
        Key secretKey = getKey(key);
        Cipher cipher = Cipher.getInstance(padding);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);
        byte[] bytes = cipher.doFinal(data);
        return bytes;
    }

    public byte[] decodeBytes(byte[] data,byte[] key) throws Exception {
        Key secretKey = getKey(key);
        Cipher cipher = Cipher.getInstance(padding);
        cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);
        return cipher.doFinal(data);

    }

    public String getPadding() {
        return padding;
    }

    public byte[] getInitializationVectorBytes() {
        return initializationVectorBytes;
    }

    private static Key getKey(byte[] key) throws Exception {
        DESKeySpec dks = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
        SecretKey secretKey = keyFactory.generateSecret(dks);
        return secretKey;
    }

    public static byte[] decode(byte[] data, byte[] key) throws Exception {
        return decode(data,key,DEFAULT_INITIALIZATION_VECTOR);
    }


    public static byte[] encode(byte[] data, byte[] key) throws Exception {
        return encode(data,key,DEFAULT_INITIALIZATION_VECTOR);
    }

    public static byte[] decode(byte[] data, byte[] key, byte[] ivBytes) throws Exception {
        DES des = new DES(PADDING,ivBytes);
        return des.decodeBytes(data,key);
    }

    public static byte[] encode(byte[] data, byte[] key, byte[] ivBytes) throws Exception {
        DES des = new DES(PADDING,ivBytes);
        return des.encodeBytes(data,key);
    }
}

返回码

错误码说明
5119104解密失败
5119105服务错误
4119301数据校验失败
4119302数据不存在
5119302数据不存在
4119303数据已经存在
5119303数据已经存在
4119310token未找到
5119310token未找到
4119311token非法
4119330App没有初始化
4119331AppSecret错误
5119341余额不足
5119501未知的运营商类型
5119511AppKey每分钟验证次数超过限制
5119513未审核的包名每天验证数量超过限制
4119521包名没有配置
5119531AppKey在黑名单中
5119546[免密登录][APP每分钟]超限
5119507免密登录失败
5119509免密获取TOKEN失败
4119342签名错误
4119343timestamp错误
5119601未设置价格
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/apkkkk/article/details/129831686

好奇一键登录是怎么实现的吗?进来了解一下?_普通网友的博客-爱代码爱编程

/   今日科技快讯   / 近日美国联邦贸易委员会(FTC)正式宣布批准与Facebook达成50亿美元的和解协议。这是FTC有史以来对科技公司开出的最高金额罚单,此前的最高纪录是2012年谷歌因侵犯隐私而被罚款2250万美元。尽管这一罚款金额比此前纪录提高了上百倍,但50亿美元也只占Facebook公司2018年收入的9%。

不是每一个人都需要掌握一键登录!除非......-爱代码爱编程

  点击上方 "程序员小乐" ,关注公众号 8点20分,第一时间与你相约 每日英文 Don't judge people by their outlook for you don't know what stories behind their eyes.  不要以貌取人,因为你不知道他们的双眼后面藏着什么故事。

你知道一键登陆背后的技术逻辑么?_java葵花宝典的博客-爱代码爱编程

作者:NanBox juejin.im/post/5d197adff265da1bb31c4fa9 我们先来看一下目前的一些登录方式: 账号、密码登陆 使用账号加密码是最传统的登录方式,可以说是简单粗暴的,一般也不会出现什么问题。 缺点 但这种方式要求用户要记住自己的账号

用户一键登陆,如何实现?了解一下!_zl1zl2zl3的博客-爱代码爱编程

我们先来看一下目前的一些登录方式: 账号、密码登陆 使用账号加密码是最传统的登录方式,可以说是简单粗暴的,一般也不会出现什么问题。 缺点 但这种方式要求用户要记住自己的账号和密码,也就是有一个记忆成本。用户为了降低记忆成本,很可能会在不同平台使用同一套账号密码。从安全角度考虑,一旦某个平台的账号密码泄露了,会连累到该用户使用的其他平台。 另外

好奇一键登录是怎么实现的吗?-爱代码爱编程

今天来分享一下手机号码一键登录的接入方式,希望对大家有所帮助! 登录方式 我们先来看一下目前的一些登录方式。 账号 + 密码 使用账号加密码是最传统的登录方式,可以说是简单粗暴的,一般也不会出现什么问题。 缺点 但这种方式要求用户要记住自己的账号和密码,也就是有一个记忆成本。用户为了降低记忆成本,很可能会在不同平台使用同一套账号密码。从安全角度考虑

计算机网络原理 笔记整理-爱代码爱编程

计算机网络原理 ╭第一章 计算机网络概述 |第二章 网络应用 |第三章 传输层 |第四章 网络层 内容大纲< |第五章 数据链路层与局域网 |第六章 物理层 |第七章 无线与移动网络 ╰第

实现用户一键登录的方案有哪些?-爱代码爱编程

点击领取:程序员最新学习资料! 来源:juejin.im/post/5d197adff265da1bb31c4fa9 我们先来看一下目前的一些登录方式: 账号、密码登陆 使用账号加密码是最传统的登录方式,可以说是简单粗暴的,一般也不会出现什么问题。 缺点 但这种方式要求用户要记住自己的账号和密码,也就是有一个记忆成本。用户为了降低记忆

神奇的一键登录是怎么实现的?-爱代码爱编程

以前我做过自动获取手机号码,然后点击获取手机验证码,这样减少了输入手机号的过程,让注册登录过程简化了一点。这是通过Api直接获取手机SIM卡上的信息,直接 读取手机号,当时遇到各种问题,比如的手机卡获取不到的问题,双卡双待的手机的问题。 最近我看到更厉害的一键登录,不光可以自动获取到手机号,连验证码都不需要了,这简单是太神奇了,这是怎么实现的呢?今天我

mob秒验(一键登录注册)常见问题-爱代码爱编程

1、双卡双待手机怎么登录? 针对双卡双待手机只取当前有流量的卡号。 2、不用本机号码如何登录? 仍任支持使用传统验证方式登录,例如验证码登录等 3、Mob秒验(一键登录注册)只支持4G吗? 不是的,电信支持4G,5G网络取号,移动, 联通支持5G,4G, 3G, 2G网络取号但在非5G,4G网络情况下容易取号失败 4、Mob秒验

spring boot框架都有哪些优点和缺点?-爱代码爱编程

相较于传统的Spring框架,Spring Boot 框架具有以下优点。 1.可快速构建独立的 Spring 应用 Spring Boot是一个依靠大量注解实现自动化配置的全新框架。在构建Spring应用时,我们只需要添加相应的场景依赖,Spring Boot就会根据添加的场景依赖自动进行配置,在无须额外手动添加配置的情况下快速构建出一个独立的Sp

leetcode刷题记录-爱代码爱编程

1630. 等差子数组 1630. 等差子数组 先直接暴力,过了再说 public List<Boolean> checkArithmeticSubarrays(int[] nums, int[] l, i

mybatis插件原理(自己总结)-爱代码爱编程

前期需要了解的是: 1. mybatis对哪四种对象进行拦截? 1.1:ParameterHandler:对sql参数进行处理 1.2:ResultSetHandler:对结果对象进行处理 1.3:StatementHandler:对sql语句进行处理 1.4:Executor:执行器,执行增删改查 2.接下来就可以自定义插件了: 给一个

18-爱代码爱编程

题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据保证整个链式结构中不存在环。 注意,函数返回结果后,链表必须 保持其原始结构 。 自定义评测: 评测系统的输入如下(你设计的程序不适用此输入):

mysql innodb存储原理深入剖析与技术分析_mysql innodb 分析-爱代码爱编程

一、MySQL记录存储: MySQL InnoDB的数据由B+树来组织,数据记录存储在B+树数据页(page)中,每个数据页16kb,数据页 包括页头、虚记录、记录堆、自由空间链表、未分配空间、sl

基于springboot实现家乡特色食品景点推荐系统【源码+论文】分享_自己的家乡,设计 “推荐我家乡的***” 简单的应用系统,也可以给你开发的推荐软件-爱代码爱编程

基于springboot实现家乡特色推荐系统演示 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 摘要 在Internet高速