会员对外文档平台 会员对外文档平台
登录
接口
介绍
  • TOB直充接口

  • TOB激活码直充接口

  • OTT直充接口

  • OTT自动续费接口

  • OTT激活码直充接口

  • 通用接口

  • 内容点播接口

  • 卡券类接口

  • 用户信息接口

    • 观影时长开始记录接口
    • 查询用户会员等级接口
    • 权益查询接口
    • 观影时长查询接口
    • 用户信息解密接口
    • 学生身份验证接口
  • 会员福利接口

  • 合作方客户FV管理

# 学生身份验证接口

# 简介

# 业务介绍

通过此接口进行用户学生身份认证,调用此接口可能涉及费用结算。

# 接口定义

# 应用场景

对于学生用户优惠售卖的业务,如果合作方侧没有学生认证能力,可使用此接口进行用户学生身份认证,认证通过后,使用特定产品为用户直充会员权益。此接口涉及费用结算,使用前请先与对应商务沟通。

# 接口域名

环境 域名
生产 openapi.vip.iqiyi.com
测试 test-openapi.vip.iqiyi.com

# URL

/identification/student

# 请求方式

参数 说明
Method POST
Content-Type application/x-www-form-urlencoded

# 请求参数

变量名 名称 是否必须 类型 说明
encryptContent 加密后的业务参数 是 String 由业务参数 AES加密得到,具体过程见AES+RSA加密描述
encryptAesPassword 加密后的AES秘钥 是 String RSA加密AES随机秘钥等到生成具体过程见AES+RSA加密描述
partnerNo 合作方编码 是 String 合作方的唯一标识

# data参数

变量名 名称 是否必须 说明
idName 用户姓名 是
idNo 用户身份证号 是
phone 用户手机号 是
platform 平台值 否 默认0 0:其他 1:android(安卓端) 2:ios 3:PCW(PC网页) 4:H5 5:PCA 6:微信小程序 7:android tv 8:UW

# 业务参数

样例如下:

{
  "idName":"张三", //姓名
  "idNo":"********", //身份证
  "phone":"135*******" //手机号
} 

# 返回参数

爱奇艺在收到合作方的下单通知后,返回内容为Json String,其参数如下

字段名 类型 说明
msg String 响应消息
message Object 响应消息(备用字段)
code String 业务状态码A00000 正常业务处理

# 返回示例

{
  "code": "A00000",
  "msg": "处理成功"
}
{
  "code": "Q00616",
  "msg": "学生认证失败"
}

# 返回码定义

返回码code 描述
A00000 成功
Q00340 超出一天的最大实名认证次数,同一个uid没有只能认证5次
Q00301 参数错误
Q00342 系统繁忙,请稍后重试,调用认证接口超时
Q00341 认证失败,各种错误导致,比如身份证和姓名不匹配等
Q00343 当前身份证在爱奇艺侧已有其他uid绑定学生身份
Q00332 未知错误,业务无法处理异常
Q00616 学生认证失败

# 附录

# 生成RSA key命令参考

openssl genrsa -out rsa_private_key.pem 1024

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt > pkcs8_rsa_private_key.pem

openssl rsa -in pkcs8_rsa_private_key.pem -pubout -out pkcs8_rsa_public_key.pem

# AES + RSA加密描述

总体流程:随机生成32位AES密码串 originAesPassword 对请求内容进行AES加密 得到 encryptContent —> 通过爱奇艺公钥对 AES密码串 aesPassword进行RSA 加密得到:encryptAesPassword

采用AES加密业务参数,具体计算方法如下:
1、 随机生成AES 秘钥originAesPassword(不超过64位)
2、 通过AES加密参数
3、 通过RSA使用爱奇艺公钥加密AES密码串

# JAVA版本示例代码如下:

public class Test {

    public static String originAesPassword = "EHgvANZJO8YzTQG4ZJyuGiiXbwU8n58coJDo9t6kg8FiR0I6C22UQPwWWT7clYBW";
    public static String  content = "{\"userId\": \"111111\",\"partnerOrderCode\":\"111111\",\"orderFee\": 1000,\"orderProducts\":[{\"partnerProductCode\": \"1001\",\"totalFee\": 1500,\"pid\":\"123123\"}],\"payTime\": 1589359821000 }";
    public static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYfgx6oYHOOyb4b9Os9zgtKfUaSqFCJSFS1CGRk1YYzuaUioK46nI+FiMY6OI1xgNvgaVEuIKYgM9niYaODVbvLIj8hx/By4nj91VcIg5b5lTj3no+yDewiecoBp3rohAgpfGDYwLmzuB8lL74XMr3GJPA8MDxdNncvtcXeYpohwIDAQAB";

    public static void main(String[] args) throws Exception {

            System.out.println(AES.AESEncode(originAesPassword,content));
            System.out.println("----------------");
            System.out.println(AES.encryptByPublicKey(originAesPassword,publicKey));

    }
}

注意:AES加密参数后会换行,提交时需删掉空格

# 加密工具类

import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.X509EncodedKeySpec;

public class AES {

    public static String AESEncode(String aesPassword,String content) throws NoSuchPaddingException, BadPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException {
        try {
            SecretKey original_key = null;
            try {
                KeyGenerator _generator = KeyGenerator.getInstance( "AES" );
                SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
                secureRandom.setSeed(aesPassword.getBytes());
                _generator.init(128,secureRandom);
                original_key =  _generator.generateKey();
            }  catch (Exception e) {
                throw new RuntimeException( " 初始化密钥出现异常 " );
            }

            byte [] raw=original_key.getEncoded();
            SecretKey key=new SecretKeySpec(raw, "AES");
            Cipher cipher=Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte [] byte_encode=content.getBytes("utf-8");
            byte [] byte_AES=cipher.doFinal(byte_encode);
            String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
            return AES_encode;
        } catch (Exception e){
            e.printStackTrace();
            throw e;
        }

    }

    public static String encryptByPublicKey(String data, String key) throws Exception {
        byte[]byte_publicKey = Base64Util.decode(key);
        byte[]byte_originAesPassword = data.getBytes();
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(byte_publicKey);
        PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        byte[]bytes = cipher.doFinal(byte_originAesPassword);
        return Base64.encodeBase64String(bytes);
    }
}

# AES + RSA解密描述

1、将加密的AES密钥使用合作方私钥解密
2、将加密的业务参数用AES密钥解密得到content

# Java版本代码示例:

public class Test{
        public static void main(String[] args) throws Exception {
            String encryptAesPassword = "";  //加密的AES密钥
            String AESKey = AES.decryptByPrivateKey(encryptAesPassword,privateKey);
            String encryptContent = "";  //加密的业务参数
            String content = AES.AESDecode(AESKey, encryptContent);
            System.out.println(content);
        }
}

# 解密工具类

import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class AES {

        public static String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALbjYMJwIW+PcvzM+k4vSr09IEKbaXWam33bnqDO+Qsj4POHevGe/jvOuUI/bQn/jXD6WHMivk/N+9Q4firmU1IDRl6fZIA1rfn4S0j+U8Z4bIxFURaBfcrRkA8I3cEQnuCMoD3cJXYZ/uuWogFXzIkTipHj7KrbULIOiR2Zp7ePAgMBAAECgYBJFgi+6yyRdpQPLqMAx6logpr3wz+bvdNRsohr3wprR0VITOX21QDoSa6DKPGcQ0H02jaqnEHNhpWSs5jH8A9vU4XwprOLmo21GYqcnBGjMhZqrJ/IetATqoVBl41zfnsAzZwKQw4hZBsdnhQXMUwoCB4rdUyNMGV4itjhZgBm0QJBAOd7f5j7OAkwU/bfkEtacM1/emgZ5a0Ys0J5RcRPrbhkkwiePKr0O+TQ3tDTRT0NY26DWm/U5+OwKEGt/VyNBl0CQQDKQkcKl8l+Ds518DTj3V3Xj6y0glj6eMYNLIYqi0UPPqtY1ZvvU41FYaTCCZDx/hBQQoOkk0ouefVCqqQST/7bAkAlhXguVPJFUwcZKi3aeQN12+b8fs4i27Ea4ktzwbKYA/1tVTDiSQp4UX78fHJprgTjAfmjzO/1kTVFSC2cVeOlAkB78OFXvGvcs3YRD4FZoO1AiupqMvYThq7Wo9ITgARxsxWM+ljz719ChPNRdEs9/1I/3IKO9zMeB94jXC3uitbBAkEAiT0dweF9U/7OyE74DV5tHbVHWbqEMfIzZ+NzfVlXA91wcS6uAhovjOwCk1/ngToudUbLCazTkSOlWl1mhKBA+A==";

        public static String AESDecode(String aesPassword,String content) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, IOException {
            try {
                SecretKey original_key = null;
                try {
                    KeyGenerator _generator = KeyGenerator.getInstance( "AES" );
                    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
                    secureRandom.setSeed(aesPassword.getBytes());
                    _generator.init(128,secureRandom);
                    original_key =  _generator.generateKey();
                }  catch (Exception e) {
                    throw new RuntimeException( " 初始化密钥出现异常 " );
                }
                byte [] raw=original_key.getEncoded();
                SecretKey key=new SecretKeySpec(raw, "AES");
                Cipher cipher=Cipher.getInstance("AES");
                cipher.init(Cipher.DECRYPT_MODE, key);
                byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
                byte [] byte_decode=cipher.doFinal(byte_content);
                String AES_decode=new String(byte_decode,"utf-8");
                return AES_decode;
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
        }
    
        public static String decryptByPrivateKey(String data, String key) throws Exception {
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(key));
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] bytes = cipher.doFinal(Base64.decodeBase64(data));
            String originStr = new String(bytes);
            return originStr;
        }
}

# 在线测试

参数 值 备注
partnerNo toB_common_test

所需密钥:

参数 值
爱奇艺公钥 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYfgx6oYHOOyb4b9Os9zgtKfUaSqFCJSFS1CGRk1YYzuaUioK46nI+FiMY6OI1xgNvgaVEuIKYgM9niYaODVbvLIj8hx/By4nj91VcIg5b5lTj3no+yDewiecoBp3rohAgpfGDYwLmzuB8lL74XMr3GJPA8MDxdNncvtcXeYpohwIDAQAB
合作方私钥 MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALbjYMJwIW+PcvzM+k4vSr09IEKbaXWam33bnqDO+Qsj4POHevGe/jvOuUI/bQn/jXD6WHMivk/N+9Q4firmU1IDRl6fZIA1rfn4S0j+U8Z4bIxFURaBfcrRkA8I3cEQnuCMoD3cJXYZ/uuWogFXzIkTipHj7KrbULIOiR2Zp7ePAgMBAAECgYBJFgi+6yyRdpQPLqMAx6logpr3wz+bvdNRsohr3wprR0VITOX21QDoSa6DKPGcQ0H02jaqnEHNhpWSs5jH8A9vU4XwprOLmo21GYqcnBGjMhZqrJ/IetATqoVBl41zfnsAzZwKQw4hZBsdnhQXMUwoCB4rdUyNMGV4itjhZgBm0QJBAOd7f5j7OAkwU/bfkEtacM1/emgZ5a0Ys0J5RcRPrbhkkwiePKr0O+TQ3tDTRT0NY26DWm/U5+OwKEGt/VyNBl0CQQDKQkcKl8l+Ds518DTj3V3Xj6y0glj6eMYNLIYqi0UPPqtY1ZvvU41FYaTCCZDx/hBQQoOkk0ouefVCqqQST/7bAkAlhXguVPJFUwcZKi3aeQN12+b8fs4i27Ea4ktzwbKYA/1tVTDiSQp4UX78fHJprgTjAfmjzO/1kTVFSC2cVeOlAkB78OFXvGvcs3YRD4FZoO1AiupqMvYThq7Wo9ITgARxsxWM+ljz719ChPNRdEs9/1I/3IKO9zMeB94jXC3uitbBAkEAiT0dweF9U/7OyE74DV5tHbVHWbqEMfIzZ+NzfVlXA91wcS6uAhovjOwCk1/ngToudUbLCazTkSOlWl1mhKBA+A==
点击此处进行接口调试
在线调试

← 用户信息解密接口 福利直充接口 →