# 学生身份验证接口
# 简介
# 业务介绍
通过此接口进行用户学生身份认证,调用此接口可能涉及费用结算。
# 接口定义
# 应用场景
对于学生用户优惠售卖的业务,如果合作方侧没有学生认证能力,可使用此接口进行用户学生身份认证,认证通过后,使用特定产品为用户直充会员权益。此接口涉及费用结算,使用前请先与对应商务沟通。
# 接口域名
| 环境 | 域名 |
|---|---|
| 生产 | 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== |
点击此处进行接口调试