# 1. 免密授权登录
# 请求URL
{domain}/open-api/jt/wallet/loginToken
# 请求方式
- POST
# 请求头
| 参数名 | 必选 | 类型 | 说明 |
|---|---|---|---|
| Content-Type | 是 | string | application/json |
| lang | 否 | string | 用于指定访问钱包时的默认语言,可传值:en-US zh-CN th-TH (英文 en-US、中文 zh-CN、泰文 th-TH),不传递默认泰文 th-TH |
# 请求体参数
| 参数名 | 必选 | 类型 | 说明 | 示例(加密前) | 示例(加密后) |
|---|---|---|---|---|---|
| appId | 是 | string | Application APPID | ||
| aesKey | 是 | string | AES Key (RSA加密后) | "{\"key\": \"qwertasdfgzxcvbn\", \"iv\": \"bvcxzgfdsatrewqy\"}" | YDPeqH0+MJiW5Jfi9CQXy/Btz4YkiZCOp5njAy5G5s87HaS/zgmQZBnDeNjFrSduAL1tC329XIJGX+u6SKZtRvtrCx5UhZGRviBBhA575mt99TcUqAVEjXRn+ShpZmg6U8N0IHl8TX8psyWiAzxIBkrDCqIlXODfNdr8/LgZcuQFgwQGurZ8QX9L9BZxBdOH1ksLqP0Dlr5awQYD9LAstA8nzZ9C9qXt7OD+XvE6qK/8pi9YYr02oqdaXyo2ypITz6HkXKibYSv6HDtPIy6h44Qgnc6psmE4bBmH7k6q27u0mqe3zFzXiZlF7NOIkl8inFKaR59jD06L/xbuM+oTOrKHThY7+FaObf1gVSRqrzucuv9gNgI2tZRkG5AzYCMTIER0zXfx2QtVUxmOvkl6+OAVBNnLC+N9KdzXSiUU1zehg3+VrosJqyNTfYT/8iY4NVa2IPzX5CN89lA3zYoDeiyBpzH71H86oU3xzoNQS00QrgWi0tK4WXaU+duPO+wLzfGv9/2G0I5Hgf2XkjFD+Ab8wWiDxJ0YfT1mBHtjkNtlvtrD4Sc48UClxE4vGMp4ekapd6+2yEzMYEVY4o/HUgE6QgeiGcE25yT8RC8yMxw4eHQnE4NTjwowdqm+Vq28iOw2IufRxjfcPyz7f9TgGGwhu/IHwh24exfJx73RKFA= |
| param | 是 | string | Parameter body (AES加密字符) | "{\"timestamp\":1715595802,\"jtUuid\":\"1095595801938341100\",\"mobile\":\"06293874554\",\"centerNo\":\"JT0001\",\"branchNo\":\"JT0001001\"}" | u+wP+tVHRCDT21oIC32X+RogU3x5blBdikNSvRFuM9TkWMtc9WrZKCX6YIS1uezJZXR925qEBR6oVyCQ9tO6t7d0Z3xm/wKlufx2hQEfRbE= |
| sign | 是 | string | Signature (参数-param使用加密前) | EJeMHGDlLu3DdbIK/52aID1soLrD0rfGcEEsAQ8cXFWaXQHioVwfZUD82U5g67NTXP/F/0Mhg6bK7n6rJlC/clYzqZ1kHmO2FbCdujw0ATY+FfM6VkgVT4pXr1jYmg3Xe23RDqhFvkDcOfRvaGPtnf64yrQG32MZps23TsbnafitDbtfqSoDIZkDCw1j1EH3Shhd64xKh9L3O8ivyF2UDOiHSAD8+18JXOxMWMFcR01STKE5B+zlEu5OA98+ClDBdroekBVKDeBeagwwQr+0zDFUvAb+2QIPKA2o0JM3ooituiaKVCgCVfndNjk8wIzKz2QYp+RhjVOC/u+8+Yoqb4KoWjGkMXgDbM1GZpdHG/BmzqXqhnNF0Y0LYS4bkITstlOm30nnHSljT5bxjk2Sq1hp9259SqMdp52OyoznxbRwEva5Wk5YPo+zD8IHOctEjkwWXz9/jo2evK6QcWCOH2LM6cG7EoP6Cg+5P2AUTofSMZsn/ZnAy6h9MXIuirDBiujrKMk85EY74s8i7yCNmjQ5NRbPbKsNTJbkxp2cRSMPzYPzOXXqEgKMmYzVQ5SSAcqFZIj2fAOL/3fG+2aEMn/8AFjJuD3/160BmYCZbAY4A2LJow6SGP/OcifvWPwoziJv0IP5Jff59w0mv6h0+3HnJg5YAcqK7dani1C0cAQ= | |
# param 解密之后参数
| 参数名 | 必选 | 类型 | 长度 | 示例 | 说明 |
|---|---|---|---|---|---|
| timestamp | 是 | long | - | 1677495496979 | 毫秒时间戳 |
| jtUuid | 是 | string | 1-32 | - | 极兔用户uuid唯一标识号 |
| mobile | 是 | string | - | - | 以06,08或09开头 长度为10 |
| centerNo | 是 | string | 200 | - | 中心编码 |
| branchNo | 是 | string | 200 | - | 网点编码 |
| branchNo | 是 | string | 200 | - | 网点编码 |
| terminalType | 否 | string | 20 | Mobile | 设备类型,枚举值:PC、Mobile, 默认值: Mobile |
| isIframe | 否 | string | 20 | N | 是否需要在iframe中打开网页,枚举值:Y、N,当设备类型为PC时该值生效。如果需要设置为Y,否则设置为N。 |
# 请求示例
# 请求体
{
"appId": "733b887a4a784708bb369524db5b6ded",
"aesKey": "YDPeqH0+MJiW5Jfi9CQXy/Btz4YkiZCOp5njAy5G5s87HaS/zgmQZBnDeNjFrSduAL1tC329XIJGX+u6SKZtRvtrCx5UhZGRviBBhA575mt99TcUqAVEjXRn+ShpZmg6U8N0IHl8TX8psyWiAzxIBkrDCqIlXODfNdr8/LgZcuQFgwQGurZ8QX9L9BZxBdOH1ksLqP0Dlr5awQYD9LAstA8nzZ9C9qXt7OD+XvE6qK/8pi9YYr02oqdaXyo2ypITz6HkXKibYSv6HDtPIy6h44Qgnc6psmE4bBmH7k6q27u0mqe3zFzXiZlF7NOIkl8inFKaR59jD06L/xbuM+oTOrKHThY7+FaObf1gVSRqrzucuv9gNgI2tZRkG5AzYCMTIER0zXfx2QtVUxmOvkl6+OAVBNnLC+N9KdzXSiUU1zehg3+VrosJqyNTfYT/8iY4NVa2IPzX5CN89lA3zYoDeiyBpzH71H86oU3xzoNQS00QrgWi0tK4WXaU+duPO+wLzfGv9/2G0I5Hgf2XkjFD+Ab8wWiDxJ0YfT1mBHtjkNtlvtrD4Sc48UClxE4vGMp4ekapd6+2yEzMYEVY4o/HUgE6QgeiGcE25yT8RC8yMxw4eHQnE4NTjwowdqm+Vq28iOw2IufRxjfcPyz7f9TgGGwhu/IHwh24exfJx73RKFA=",
"sign": "EJeMHGDlLu3DdbIK/52aID1soLrD0rfGcEEsAQ8cXFWaXQHioVwfZUD82U5g67NTXP/F/0Mhg6bK7n6rJlC/clYzqZ1kHmO2FbCdujw0ATY+FfM6VkgVT4pXr1jYmg3Xe23RDqhFvkDcOfRvaGPtnf64yrQG32MZps23TsbnafitDbtfqSoDIZkDCw1j1EH3Shhd64xKh9L3O8ivyF2UDOiHSAD8+18JXOxMWMFcR01STKE5B+zlEu5OA98+ClDBdroekBVKDeBeagwwQr+0zDFUvAb+2QIPKA2o0JM3ooituiaKVCgCVfndNjk8wIzKz2QYp+RhjVOC/u+8+Yoqb4KoWjGkMXgDbM1GZpdHG/BmzqXqhnNF0Y0LYS4bkITstlOm30nnHSljT5bxjk2Sq1hp9259SqMdp52OyoznxbRwEva5Wk5YPo+zD8IHOctEjkwWXz9/jo2evK6QcWCOH2LM6cG7EoP6Cg+5P2AUTofSMZsn/ZnAy6h9MXIuirDBiujrKMk85EY74s8i7yCNmjQ5NRbPbKsNTJbkxp2cRSMPzYPzOXXqEgKMmYzVQ5SSAcqFZIj2fAOL/3fG+2aEMn/8AFjJuD3/160BmYCZbAY4A2LJow6SGP/OcifvWPwoziJv0IP5Jff59w0mv6h0+3HnJg5YAcqK7dani1C0cAQ=",
"param": "u+wP+tVHRCDT21oIC32X+RogU3x5blBdikNSvRFuM9TkWMtc9WrZKCX6YIS1uezJZXR925qEBR6oVyCQ9tO6t7d0Z3xm/wKlufx2hQEfRbE="
}
// 解密后
"aesKey": "{\"key\": \"qwertasdfgzxcvbn\", \"iv\": \"bvcxzgfdsatrewqy\"}"
"param": "{\"timestamp\":1715595802,\"jtUuid\":\"1095595801938341100\",\"mobile\":\"06293874554\",\"centerNo\":\"JT0001\",\"branchNo\":\"JT0001001\"}"
# Rsa私钥加密
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RsaEncryptWithPrivateKey {
public static final String PRIVATE_KEY = "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";
public static void main(String[] args) throws Exception {
String aesKeyOriginalStr = "{\"key\": \"qwertasdfgzxcvbn\", \"iv\": \"bvcxzgfdsatrewqy\"}";
byte[] keyBytes = Base64.getDecoder().decode(PRIVATE_KEY);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey =keyFactory.generatePrivate(keySpec);
// 2. 使用 RSA 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedBytes = cipher.doFinal(aesKeyOriginalStr.getBytes());
// 3. 返回 Base64 编码的密文
String aesKeyEncryptStr = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println(aesKeyEncryptStr);
}
}
# Rsa公钥加密
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RsaDecryptWithPublicKey {
public static final String PUBLIC_KEY = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnFPgpmzqcKVGp1Ci/WUPzPkhBnojDwPDBFWbB6RBXKjU8Pdp+n9K7rA0ZP6BD19O4MMJwYxG9n7zf7/IboA+bFfW/jsBGi41g7wBafbJxBKXQeXsdE8aRw7BcvjrTbL6EVUn2kMci2d9BMPMsPHCyDmubVIVVN+0rxft0vw2R5jbD/kg7e0K4+ls505eY8KRv2rpLdElhyYoA+PpFGZ/84FhO0nCGTQZCz4dcIK9axZ8RXKpVZQUotBfbKzzYmC8FQU4MeQp5vTttyEudyO0/9PtZUEEg1sN217YZywHeS274031F8dDC7afD2iVTES1obIoqvwEnD9CDfSbmF0pwLvheLhdGyVnh3FmMvQeturf+cTYZotP7igToL1MkmTIlSJ2q2pzPNaz0dyBorxB28WlxCuPRZuRCNzhdz/H694ytymEpwqXUo5Vbcfe+QgVFKduhnYapY4Ntv8oSdsH2MeKb5dhc1sO+I0fqrIW25zUOH8ECWQbgV50I7QIPOhKuLOkZW/EEG2epwlY83HqNrKhH6Wd+DXEjimz9zRmCNRboA8MswN8TRv6vGnmP8rFbPiIl/pBADFViiF+TP08O2VWb/9RaXils0MJfhMvTZ6PjhScIKtX9q6wT28gHYIdBD5UfrKLPndJMxM9u3HzWYCwhxa4boxu2+3KLwd7zFECAwEAAQ==";
public static void main(String[] args) throws Exception {
String aesKeyEncryptStr = "YDPeqH0+MJiW5Jfi9CQXy/Btz4YkiZCOp5njAy5G5s87HaS/zgmQZBnDeNjFrSduAL1tC329XIJGX+u6SKZtRvtrCx5UhZGRviBBhA575mt99TcUqAVEjXRn+ShpZmg6U8N0IHl8TX8psyWiAzxIBkrDCqIlXODfNdr8/LgZcuQFgwQGurZ8QX9L9BZxBdOH1ksLqP0Dlr5awQYD9LAstA8nzZ9C9qXt7OD+XvE6qK/8pi9YYr02oqdaXyo2ypITz6HkXKibYSv6HDtPIy6h44Qgnc6psmE4bBmH7k6q27u0mqe3zFzXiZlF7NOIkl8inFKaR59jD06L/xbuM+oTOrKHThY7+FaObf1gVSRqrzucuv9gNgI2tZRkG5AzYCMTIER0zXfx2QtVUxmOvkl6+OAVBNnLC+N9KdzXSiUU1zehg3+VrosJqyNTfYT/8iY4NVa2IPzX5CN89lA3zYoDeiyBpzH71H86oU3xzoNQS00QrgWi0tK4WXaU+duPO+wLzfGv9/2G0I5Hgf2XkjFD+Ab8wWiDxJ0YfT1mBHtjkNtlvtrD4Sc48UClxE4vGMp4ekapd6+2yEzMYEVY4o/HUgE6QgeiGcE25yT8RC8yMxw4eHQnE4NTjwowdqm+Vq28iOw2IufRxjfcPyz7f9TgGGwhu/IHwh24exfJx73RKFA=";
byte[] keyBytes = Base64.getDecoder().decode(PUBLIC_KEY);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
// 2. 使用 RSA 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decodedBytes = Base64.getDecoder().decode(aesKeyEncryptStr); // 解码 Base64 密文
// 3. 返回 Base64 编码的密文
String aesKeyOriginalStr = new String(cipher.doFinal(decodedBytes));
System.out.println(aesKeyOriginalStr);
}
}
# AES加密(这里KEY和IV需要随机生成)
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
public class AESEncryptWithPrivateKey {
public static void main(String[] args) throws Exception {
String aesKey = "qwertasdfgzxcvbn";
String aesIV = "bvcxzgfdsatrewqy";
AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, aesKey.getBytes(), aesIV.getBytes());
String aesEncrypt = aes.encryptBase64("{\"timestamp\":1715595802,\"jtUuid\":\"1095595801938341100\",\"mobile\":\"06293874554\",\"centerNo\":\"JT0001\",\"branchNo\":\"JT0001001\"}");
System.out.println(aesEncrypt);
}
}
# AES解密
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;
public class RsaEncryptWithPrivateKey {
public static void main(String[] args) throws Exception {
String aesKey = "qwertasdfgzxcvbn";
String aesIV = "bvcxzgfdsatrewqy";
AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, aesKey.getBytes(), aesIV.getBytes());
String aesDecrypt = aes.decryptStr("u+wP+tVHRCDT21oIC32X+RogU3x5blBdikNSvRFuM9TkWMtc9WrZKCX6YIS1uezJZXR925qEBR6oVyCQ9tO6t7d0Z3xm/wKlufx2hQEfRbE=");
System.out.println(aesDecrypt);
}
}
# 响应参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| code | integer | response code |
| message | string | response message |
| data | Object | data |
# data参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| expireSeconds | int | 3600秒(过期时间) |
| authUrl | string | 免密登录地址 |
| uuid | string | 钱包用户uuid |
| token | string | 钱包用户登录token |
# 响应示例
# 响应数据体
{
"code": 10000,
"message": "Success",
"data": {
"expireSeconds": 3600,
"authUrl": "https://m-uat.bluepay.asia/?token=xxxx",
"uuid": "U1725459133349765120",
"token": "xxxxxxxxx"
}
}
# 失败响应示例
{
"code": 1002,
"message": "merchant white ip forbidden"
}