1 【动画验证码】二次验证接口
1.1 接口说明
业务方携带动画验证码校验成功后的validate来调用此接口进行二次验证。validate在一段时间内有效,接口IP需要配置IP白名单。
请求地址:
https://openapi-gy.getui.com/v1/gy/captcha/verify
协议:HTTPS
请求方法:POST+json
1.2 参数说明
"appId"
:
"LLNstWgyGm8UM2SsherlU5"
,
"gyuid"
:
"83f0f7e943484e3ca58fccc2f3d1e48777"
,
"businessId"
:
"20180523"
,
"validate"
:
"6a2cab5c0abc06ea9a1503ff4eb619d1"
,
"timestamp"
:
1529391652123
,
"sign"
:
"9f8ef776b7364c96fc1a7e734976e32b6a5e297a1ddbaea31bf3deab515ab7d1"
"errno"
:
"0"
,
"data"
: {
"result"
:
"20000"
,
"msg"
:
"成功"
,
"data"
: {
"verifyResult"
:
true
,
1.4 返回码说明
接口返回码说明
返回码描述
2 【反欺诈】注册保护、登录保护二次校验
2.1 接口说明
业务方携带反欺诈接口返回的token来调用此接口获取反欺诈结果,进行二次校验。token在一段时间内有效,接口需要配置IP白名单。
请求地址:
https://openapi-gy.getui.com/v1/af/antifraud_query
协议:HTTPS
请求方法:POST+json
2.2 参数说明
"appId"
:
"LLNstWgyGm8UM2SsherlU5"
,
"gyuid"
:
"83f0f7e943484e3ca58fccc2f3d1e48777"
,
"token"
:
"6a2cab5c0abc06ea9a1503ff4eb619d1"
,
"timestamp"
:
1529391652123
,
"sign"
:
"9f8ef776b7364c96fc1a7e734976e32b6a5e297a1ddbaea31bf3deab515ab7d1"
"errno"
:
"0"
,
"data"
: {
"result"
:
"20000"
,
"msg"
:
"成功"
,
"data"
: {
"riskLevel"
:
"1"
,
"riskType"
: [
"1"
],
2.4 返回码说明
接口返回码说明
返回码描述
3 【反欺诈】反欺诈通用查询接口
3.1 接口说明
业务方服务端在获取gyuid后,可通过gyuid定期按需获取设备风险信息。接口需配置IP白名单。
请求地址:
https://openapi-gy.getui.com/v1/af/antifraud
协议:HTTPS
请求方法:POST+json
3.2 参数说明
"appId"
:
"LLNstWgyGm8UM2SsherlU5"
,
"gyuid"
:
"83f0f7e943484e3ca58fccc2f3d1e48777"
,
"scene"
:
1
,
"timestamp"
:
1529391652123
,
"sign"
:
"9f8ef776b7364c96fc1a7e734976e32b6a5e297a1ddbaea31bf3deab515ab7d1"
"errno"
:
"0"
,
"data"
: {
"result"
:
"20000"
,
"msg"
:
"成功"
,
"data"
: {
"riskLevel"
:
"1"
,
"riskType"
: [
"1"
],
3.4 返回码说明
接口返回码说明
返回码描述
4 【APP一键认证】获取手机号接口
4.1 接口说明
业务方调用此接口获取手机号,参数token是来自于SDK端调用一键认证之后返回的用户授权凭证信息。token在一段时间内有效,接口IP需要配置IP白名单。
注
:返回的手机号采用AES加密,密钥为应用对应的masterSecret,算法参考【附录】AES解密说明(直接下载:
Java
、
PHP
、
Python
、
NodeJs
)。
请求地址:
https://openapi-gy.getui.com/v2/gy/ct_login/gy_get_pn
协议:HTTPS
请求方法:POST+json
4.2 参数说明
String
鉴权时的签名。
生成 sign 值:将 appkey、timestamp、mastersecret 对应的字符串按此固定顺序拼接后,使用 SHA256 算法加密。
示例 java 代码格式: String sign = sha256(appkey+timestamp+mastersecret)
token
String
调用SDK上传token返回的凭证 (默认是10分钟的失效时间)
gyuid
String
个验用户唯一标识,客户端CallBack回调方法中获取
"timestamp"
:
1529391652123
,
"gyuid"
:
"12313ssad"
,
"sign"
:
"8f8ef776b7364c96fc1a7e734976e32b6a5e297a1ddbaea31bf3deab517d1"
,
"token"
:
""
"errno"
:
"0"
,
"data"
: {
"result"
:
"20000"
,
"msg"
:
"成功"
,
"data"
: {
"pn"
:
"1fbf2605f954fad3ba18115000735aee"
,
4.4 返回码说明
接口返回码说明
返回码描述
40047
获取号码失败,解决办法:
1,检查客户端生成gyuid的appid 与 服务端appid是否一致。
2,可能调服务端接口取号的token失效了,客户端重新获取一键登入返回的token。
50000
50001
50002
5 【H5一键认证】获取手机号接口
5.1 接口说明
业务方调用此接口获取手机号,参数token是来自于SDK端调用一键认证之后返回的用户授权凭证信息。token在一段时间内有效,接口IP需要配置IP白名单。
注
:返回的手机号采用AES加密,密钥为应用对应的masterSecret,算法参考【附录】AES解密说明(直接下载:
Java
、
PHP
、
Python
、
NodeJs
)。
请求地址:
https://h-gy.getui.net/v2/gy/ct_login/gy_get_pn
协议:HTTPS
请求方法:POST+json
5.2 参数说明
40047
获取号码失败,解决办法:
1,检查客户端生成gyuid的appid 与 服务端appid是否一致。
2,可能调服务端接口取号的token失效了,客户端重新获取一键登入返回的token。
50000
50001
50002
6 【H5本机号码校验】服务端校验本机手机号接口
6.1 接口说明
业务方调用校验本机手机号,参数token是来自于调用SDK返回的凭证。凭证在一段时间内有效,接口IP需要配置IP白名单。
请求地址:
https://h-gy.getui.net/v1/gy/ct_login/server_token_validate
协议:HTTPS
请求方法:POST+json
6.2 参数说明
"gyuid"
:
"3d56d9ee11f64e1bb68741696540821333"
,
"appId"
:
"EsNxapHV5v98pP2Qd704f3"
,
"token"
:
"1f64e1bb68741"
,
"timestamp"
:
1563261119000
,
"sign"
:
"c6c30c460bcf75e4260fd59d942fc03c1205da4c877dbbc32a1b2ed335cea61f"
"errno"
:
"0"
,
"data"
: {
"result"
:
"20000"
,
"msg"
:
"成功"
6.4 返回码说明
接口返回码说明
返回码描述
import java.nio.charset.StandardCharsets;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
* Date: 2019/12/18
* Description: AES解密
public class AESUtil{
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
private static final byte[] IV = "0000000000000000".getBytes();
* AES 解密操作
* @param content 待解密内容
* @param key 加密密钥
* @return 解密数据
public static String decrypt(String content, String key) {
try {
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
IvParameterSpec ivSpec = new IvParameterSpec(IV);
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key), ivSpec);
byte[] result = cipher.doFinal(hex2Bytes(content));
return new String(result, StandardCharsets.UTF_8);
} catch (Exception e) {
return null;
* 获取密钥,取前16位,不足则复制
* @param key 用户密钥
* @return KeySpec对象
private static SecretKeySpec getSecretKey(String key) {
if(key==null || key.isEmpty()){
return null;
StringBuilder s = new StringBuilder(key);
while(s.length() < 16){
s.append(key);
return new SecretKeySpec(s.substring(0,16).getBytes(), KEY_ALGORITHM);
* hex字符串转byte数组
* @param hex 待转换的hex字符串
* @return 转换后的byte数组
private static byte[] hex2Bytes(String hex){
if (hex.length() % 2 == 1){
hex="0" + hex;
byte[] result = new byte[hex.length()/2];
for (int i = 0; i < result.length; i++){
result[i] = (byte)Integer.parseInt(hex.substring(2*i,2*i+2), 16);
return result;
public static void main(String[] args) {
String pn = "1fbf2605f954fad3ba18115000735aee";
String masterSecret = "126781";
System.out.println("解密后:" + AESUtil.decrypt(pn, masterSecret));
PHP AES解密算法示例
$pn = '1fbf2605f954fad3ba18115000735aee';
$masterSecret = '126781';
$encryptMethod = 'aes-128-cbc';
$iv = '0000000000000000';
$key = $masterSecret;
while(strlen($key) < 16){
$key .= $masterSecret;
$key = substr($key, 0, 16);
$result = openssl_decrypt(hex2bin($pn), $encryptMethod, $key, 1, $iv);
echo $result;
Python AES解密算法示例
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
def decrypt(content, secret):
# 参数设置
iv = b'0' * 16
# 取16位密钥
key = secret
while len(key) < 16:
key += secret
key = key[0:16]
cipher = AES.new(key.encode(), AES.MODE_CBC, iv)
result = unpad(cipher.decrypt(bytes.fromhex(content)), 16)
return result.decode()
if __name__ == '__main__':
pn = '1fbf2605f954fad3ba18115000735aee' # 密文
master_secret = '126781' # 密钥
print(decrypt(pn, master_secret))
NodeJs AES解密算法示例
var CryptoJS = require("crypto-js");
function decrypt(content, secret){
var iv = "0000000000000000";
var key = secret;
while(key.length < 16){
key += secret;
key = key.substr(0, 16);
var en = Buffer.from(content, 'hex').toString("base64");
var result = CryptoJS.AES.decrypt(en, CryptoJS.enc.Utf8.parse(key), {
iv:CryptoJS.enc.Utf8.parse(iv),
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
return result.toString(CryptoJS.enc.Utf8);
var pn = "1fbf2605f954fad3ba18115000735aee";
var masterSecret = "126781";
console.log(decrypt(pn, masterSecret));
如需其它语言示例,请联系我们的技术支持:文档中心右侧“技术咨询”。