package com.ruoyi.admin.utils;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.ruoyi.admin.entity.IamConfig;
|
import com.ruoyi.admin.service.IamConfigService;
|
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.exception.ServiceException;
|
import com.ruoyi.common.redis.service.RedisService;
|
import lombok.extern.slf4j.Slf4j;
|
import okhttp3.*;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.StringUtils;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.IOException;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.time.Instant;
|
import java.util.Date;
|
import java.util.concurrent.TimeUnit;
|
|
@Slf4j
|
@Component
|
public class PrivateNumberUtil {
|
|
@Autowired
|
private RedisService redisService;
|
@Autowired
|
private IamConfigService iamConfigService;
|
|
private final String TOKEN_URL = "https://iam.cn-south-1.myhuaweicloud.com/v3/auth/tokens";
|
private final String UPLOAD_NUMBER_FILE_URL = "https://rtc.cn-north-1.myhuaweicloud.com/v1/privatenumber/a-number/files?agree_authorization_statement=true";
|
private final String ADD_A_NUMBER_URL = "https://rtc.cn-north-1.myhuaweicloud.com/v1.0/privatenumber/a-number?agree_authorization_statement=true";
|
|
/**
|
* 获取token
|
* @return
|
*/
|
public String getToken() {
|
String token = redisService.getCacheObject("PRIVATE_NUMBER:");
|
if(StringUtils.hasLength(token)){
|
return token;
|
}
|
IamConfig iamConfig = iamConfigService.getById(1);
|
String userName = iamConfig.getUserName();
|
String account = iamConfig.getAccount();
|
String password = iamConfig.getPassword();
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
.build();
|
MediaType mediaType = MediaType.parse("text/plain");
|
RequestBody body = RequestBody.create(mediaType, "{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":{\"user\":{\"domain\":{\"name\":\""+userName+"\"},\"name\":\""+account+"\",\"password\":\""+password+"\"}}},\"scope\":{\"domain\":{},\"project\":{\"name\":\"cn-north-1\"}}}}");
|
Request request = new Request.Builder()
|
.url(TOKEN_URL)
|
.method("POST", body)
|
.build();
|
Response response = null;
|
try {
|
response = client.newCall(request).execute();
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
// 获取响应头 X-Subject-Token
|
token = response.header("X-Subject-Token");
|
if(StringUtils.hasLength(token)){
|
ResponseBody responseBody = response.body();
|
if(responseBody != null) {
|
try {
|
String string = responseBody.string();
|
log.info("获取token:{}",string);
|
JSONObject jsonObject = JSONObject.parseObject(string);
|
JSONObject tokenJson = jsonObject.getJSONObject("token");
|
// 2025-10-23T07:27:59.224000Z
|
String expiresAt = tokenJson.getString("expires_at");
|
// 将字符串解析为Instant
|
Instant instant = Instant.parse(expiresAt);
|
// 转换为Date
|
Date date = Date.from(instant);
|
// String replace = expiresAt.substring(0, expiresAt.lastIndexOf(".")).replace("T", " ");
|
// Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(replace);
|
redisService.setCacheObject("PRIVATE_NUMBER:",token,date.getTime()-System.currentTimeMillis(), TimeUnit.MILLISECONDS);
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
}
|
return token;
|
}else {
|
return null;
|
}
|
}
|
/**
|
* 获取token
|
* @return
|
*/
|
public static String getTokenTest() {
|
String account = "hsg13437173440";
|
String userName = "denglu";
|
String password = "6!JR8Fn0";
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
.build();
|
MediaType mediaType = MediaType.parse("text/plain");
|
RequestBody body = RequestBody.create(mediaType, "{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":{\"user\":{\"domain\":{\"name\":\""+account+"\"},\"name\":\""+userName+"\",\"password\":\""+password+"\"}}},\"scope\":{\"domain\":{},\"project\":{\"name\":\"cn-north-1\"}}}}");
|
Request request = new Request.Builder()
|
.url("https://iam.cn-south-1.myhuaweicloud.com/v3/auth/tokens")
|
.method("POST", body)
|
.build();
|
Response response = null;
|
try {
|
response = client.newCall(request).execute();
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
// 获取响应头 X-Subject-Token
|
String token = response.header("X-Subject-Token");
|
if(StringUtils.hasLength(token)){
|
return token;
|
}else {
|
return null;
|
}
|
}
|
|
|
/**
|
* 上传号码文件
|
* @param filePath
|
*/
|
public R<String> uploadNumberFile(String filePath) {
|
MultipartFile file = UrlToMultipartFileUtil.urlTransferMultipartFile(filePath);
|
MultipartFile[] files = new MultipartFile[]{file};
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
.build();
|
// 构建multipart/form-data请求体
|
MultipartBody.Builder builder = new MultipartBody.Builder();
|
builder.setType(MultipartBody.FORM);
|
// 添加文件到请求体
|
try {
|
for (MultipartFile multipartFile : files) {
|
if (multipartFile != null && !multipartFile.isEmpty()) {
|
RequestBody fileBody = RequestBody.create(
|
MediaType.parse(multipartFile.getContentType()),
|
multipartFile.getBytes()
|
);
|
builder.addFormDataPart("files", multipartFile.getOriginalFilename(), fileBody);
|
System.err.println("文件名称+"+multipartFile.getOriginalFilename());
|
}
|
}
|
} catch (IOException e) {
|
System.err.println("Error reading multipart file: " + e.getMessage());
|
e.printStackTrace();
|
return R.fail("文件读取失败: " + e.getMessage());
|
}
|
RequestBody body = builder.build();
|
Request request = new Request.Builder()
|
.url(UPLOAD_NUMBER_FILE_URL)
|
.method("POST", body)
|
.addHeader("X-Auth-Token", getToken())
|
.build();
|
Response response = null;
|
try {
|
response = client.newCall(request).execute();
|
ResponseBody responseBody = response.body();
|
if(responseBody != null) {
|
try {
|
String string = responseBody.string();
|
log.info("上传号码文件:{}",string);
|
JSONObject jsonObject = JSONObject.parseObject(string);
|
String result = jsonObject.getString("result");
|
if("Upload Successful.".equals(result)){
|
System.err.println("返回的文件名称+"+file.getOriginalFilename());
|
return R.ok(file.getOriginalFilename(),"");
|
}else {
|
String failReason = jsonObject.getString("failReason");
|
return R.fail(failReason);
|
}
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
}
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
return R.fail();
|
}
|
public static R uploadNumberFileTest(String filePath,String accessToken) {
|
MultipartFile file = UrlToMultipartFileUtil.urlTransferMultipartFile(filePath);
|
MultipartFile[] files = new MultipartFile[]{file};
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
.build();
|
// 构建multipart/form-data请求体
|
MultipartBody.Builder builder = new MultipartBody.Builder();
|
builder.setType(MultipartBody.FORM);
|
// 添加文件到请求体
|
try {
|
for (MultipartFile multipartFile : files) {
|
if (multipartFile != null && !multipartFile.isEmpty()) {
|
RequestBody fileBody = RequestBody.create(
|
MediaType.parse(multipartFile.getContentType()),
|
multipartFile.getBytes()
|
);
|
builder.addFormDataPart("files", multipartFile.getOriginalFilename(), fileBody);
|
}
|
}
|
} catch (IOException e) {
|
System.err.println("Error reading multipart file: " + e.getMessage());
|
e.printStackTrace();
|
return R.fail("文件读取失败: " + e.getMessage());
|
}
|
RequestBody body = builder.build();
|
Request request = new Request.Builder()
|
.url("https://rtc.cn-north-1.myhuaweicloud.com/v1/privatenumber/a-number/files?agree_authorization_statement=true")
|
.method("POST", body)
|
.addHeader("X-Auth-Token", getTokenTest())
|
.build();
|
Response response = null;
|
try {
|
response = client.newCall(request).execute();
|
ResponseBody responseBody = response.body();
|
if(responseBody != null) {
|
try {
|
String string = responseBody.string();
|
System.err.println("body:::::::::::::::::"+string);
|
JSONObject jsonObject = JSONObject.parseObject(string);
|
String result = jsonObject.getString("result");
|
if("Upload Successful.".equals(result)){
|
return R.ok();
|
}else {
|
String failReason = jsonObject.getString("failReason");
|
return R.fail(failReason);
|
}
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
}
|
} catch (IOException e) {
|
throw new RuntimeException(e);
|
}
|
return R.fail();
|
}
|
|
/**
|
* 新增租户级 A 号码报备接口
|
* @param fileName
|
*/
|
public R addANumber(String number, String realName, String idNumber, String fileName) {
|
JSONObject requestBody = new JSONObject();
|
JSONArray numbers = new JSONArray();
|
JSONObject jsonObject = new JSONObject();
|
jsonObject.put("number", "+86"+number); // 手机号码
|
jsonObject.put("numberType", 1); // 号码类型 1=手机号 2=固话
|
jsonObject.put("name", realName); // 真实姓名
|
jsonObject.put("identityCard",idNumber); // 身份证号
|
jsonObject.put("liveFaceImage", fileName); // 号码所属人现场照片文件名
|
numbers.add(jsonObject);
|
requestBody.put("numbers", numbers);
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
.build();
|
// 构建json请求体
|
MediaType mediaType = MediaType.parse("application/json");
|
String requestBodyJson = requestBody.toJSONString();
|
RequestBody body = RequestBody.create(mediaType, requestBodyJson);
|
Request request = new Request.Builder()
|
.url(ADD_A_NUMBER_URL)
|
.method("POST", body)
|
.addHeader("X-Auth-Token", getToken())
|
.addHeader("Content-Type", "application/json")
|
.addHeader("Accept", "application/json")
|
.build();
|
Response response = null;
|
try {
|
response = client.newCall(request).execute();
|
ResponseBody responseBody = response.body();
|
if(responseBody != null) {
|
String string = responseBody.string();
|
log.info("新增租户级 A 号码报备接口:{}",string);
|
// 解析响应JSON
|
JSONObject responseJson = JSONObject.parseObject(string);
|
String result = responseJson.getString("result");
|
if("Add Successful.".equals(result)){
|
return R.ok();
|
}else {
|
String errorMsg = responseJson.getString("error_msg");
|
return R.fail(errorMsg);
|
}
|
}
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
return R.fail();
|
}
|
public static R addANumberTest(String number, String realName, String idNumber, String fileName) {
|
JSONObject requestBody = new JSONObject();
|
JSONArray numbers = new JSONArray();
|
JSONObject jsonObject = new JSONObject();
|
jsonObject.put("number", "+86"+number); // 手机号码
|
jsonObject.put("numberType", 1); // 号码类型 1=手机号 2=固话
|
jsonObject.put("name", realName); // 真实姓名
|
jsonObject.put("identityCard",idNumber); // 身份证号
|
jsonObject.put("liveFaceImage", fileName); // 号码所属人现场照片文件名
|
numbers.add(jsonObject);
|
requestBody.put("numbers", numbers);
|
OkHttpClient client = new OkHttpClient().newBuilder()
|
.build();
|
// 构建json请求体
|
MediaType mediaType = MediaType.parse("application/json");
|
String requestBodyJson = requestBody.toJSONString();
|
RequestBody body = RequestBody.create(mediaType, requestBodyJson);
|
Request request = new Request.Builder()
|
.url("https://rtc.cn-north-1.myhuaweicloud.com/v1.0/privatenumber/a-number?agree_authorization_statement=true")
|
.method("POST", body)
|
.addHeader("X-Auth-Token", getTokenTest())
|
.addHeader("Content-Type", "application/json")
|
.addHeader("Accept", "application/json")
|
.build();
|
Response response = null;
|
try {
|
response = client.newCall(request).execute();
|
ResponseBody responseBody = response.body();
|
if(responseBody != null) {
|
String string = responseBody.string();
|
log.info("新增租户级 A 号码报备接口:{}",string);
|
System.err.println("body:::::::::::::::::+++++++++++"+string);
|
// 解析响应JSON
|
JSONObject responseJson = JSONObject.parseObject(string);
|
String result = responseJson.getString("result");
|
if("Add Successful.".equals(result)){
|
return R.ok();
|
}else {
|
String errorMsg = responseJson.getString("error_msg");
|
return R.fail(errorMsg);
|
}
|
}
|
} catch (IOException e) {
|
throw new ServiceException(e.getMessage());
|
}
|
return R.fail();
|
}
|
|
public static void main(String[] args) {
|
// String token = "MIINawYJKoZIhvcNAQcCoIINXDCCDVgCAQExDTALBglghkgBZQMEAgEwggt9BgkqhkiG9w0BBwGgggtuBIILansidG9rZW4iOnsiZXhwaXJlc19hdCI6IjIwMjUtMTAtMjFUMDI6Mzc6NTAuODE0MDAwWiIsIm1ldGhvZHMiOlsicGFzc3dvcmQiXSwiY2F0YWxvZyI6W10sInJvbGVzIjpbeyJuYW1lIjoib3BfZ2F0ZWRfY3Nic19yZXBfYWNjZWxlcmF0aW9uIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfZWNzX2Rpc2tBY2MiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9kc3NfbW9udGgiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9vYnNfZGVlcF9hcmNoaXZlIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfYV9jbi1zb3V0aC00YyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2RlY19tb250aF91c2VyIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfY2JyX3NlbGxvdXQiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9lY3Nfb2xkX3Jlb3VyY2UiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9ldnNfUm95YWx0eSIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX3dlbGlua2JyaWRnZV9lbmRwb2ludF9idXkiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9jYnJfZmlsZSIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2Rtcy1yb2NrZXRtcTUtYmFzaWMiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9ldnNfRVNpbmdsZV9jb3B5U1NEIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfZG1zLWthZmthMyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX29ic19kZWNfbW9udGgiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9jc2JzX3Jlc3RvcmUiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9jYnJfdm13YXJlIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfaWRtZV9tYm1fZm91bmRhdGlvbiIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX211bHRpX2JpbmQiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9zbW5fY2FsbG5vdGlmeSIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2FfYXAtc291dGhlYXN0LTNkIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfY3Nic19wcm9ncmVzc2JhciIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2Nlc19yZXNvdXJjZWdyb3VwX3RhZyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2Vjc19vZmZsaW5lX2FjNyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2V2c19yZXR5cGUiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9rb29tYXAiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9ldnNfZXNzZDIiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9kbXMtYW1xcC1iYXNpYyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2V2c19wb29sX2NhIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfYV9jbi1zb3V0aHdlc3QtMmIiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9od2NwaCIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2Vjc19vZmZsaW5lX2Rpc2tfNCIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX3Ntbl93ZWxpbmtyZWQiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9odl92ZW5kb3IiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9hX2NuLW5vcnRoLTRlIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfYV9jbi1ub3J0aC00ZCIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2Vjc19oZWNzX3giLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9jYnJfZmlsZXNfYmFja3VwIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfZWNzX2FjNyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2VwcyIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2NzYnNfcmVzdG9yZV9hbGwiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9hX2NuLW5vcnRoLTRmIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfb3BfZ2F0ZWRfcm91bmR0YWJsZSIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2V2c19leHQiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9wZnNfZGVlcF9hcmNoaXZlIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfYV9hcC1zb3V0aGVhc3QtMWUiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9hX3J1LW1vc2Nvdy0xYiIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2FfYXAtc291dGhlYXN0LTFkIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfYXBwc3RhZ2UiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9hX2FwLXNvdXRoZWFzdC0xZiIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX3Ntbl9hcHBsaWNhdGlvbiIsImlkIjoiMCJ9LHsibmFtZSI6Im9wX2dhdGVkX2V2c19jb2xkIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfZWNzX2dwdV9nNXIiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9vcF9nYXRlZF9tZXNzYWdlb3ZlcjVnIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfZWNzX3JpIiwiaWQiOiIwIn0seyJuYW1lIjoib3BfZ2F0ZWRfYV9ydS1ub3J0aHdlc3QtMmMiLCJpZCI6IjAifSx7Im5hbWUiOiJvcF9nYXRlZF9pZWZfcGxhdGludW0iLCJpZCI6IjAifV0sInByb2plY3QiOnsiZG9tYWluIjp7Im5hbWUiOiJoc2cxMzQzNzE3MzQ0MCIsImlkIjoiNDY5ZWU1MzAzMjdlNGYzOTkxMTgyNjg0MmRiY2E3ZTcifSwibmFtZSI6ImNuLW5vcnRoLTEiLCJpZCI6IjY3MDc2YWVjOTAyODQ4Zjc4NGI3YWMxMzk0NzY1NmYzIn0sImlzc3VlZF9hdCI6IjIwMjUtMTAtMjBUMDI6Mzc6NTAuODE0MDAwWiIsInVzZXIiOnsiZG9tYWluIjp7Im5hbWUiOiJoc2cxMzQzNzE3MzQ0MCIsImlkIjoiNDY5ZWU1MzAzMjdlNGYzOTkxMTgyNjg0MmRiY2E3ZTcifSwibmFtZSI6ImRlbmdsdSIsInBhc3N3b3JkX2V4cGlyZXNfYXQiOiIiLCJpZCI6IjMyN2YwNjQ0N2Y1OTRkYzc5M2JjOTg4NTkwOGUwZWRiIn19fTGCAcEwggG9AgEBMIGXMIGJMQswCQYDVQQGEwJDTjESMBAGA1UECAwJR3VhbmdEb25nMREwDwYDVQQHDAhTaGVuWmhlbjEuMCwGA1UECgwlSHVhd2VpIFNvZnR3YXJlIFRlY2hub2xvZ2llcyBDby4sIEx0ZDEOMAwGA1UECwwFQ2xvdWQxEzARBgNVBAMMCmNhLmlhbS5wa2kCCQDcsytdEGFqEDALBglghkgBZQMEAgEwDQYJKoZIhvcNAQEBBQAEggEAbtVzZi6mqzlm1pyXLoQK2jNhfm5hqnjO8LrWK5FK1rtWpQU8ouEFJBfUDor6kcJpetMnf8fnpJF9Lmd+rT8N5-39Cpdr831ooUJufWIzBSt8Y+N+IoFUpQd-Ut5PRl0YpGWf90015EHcY-hhJk6rW-URTPXwC57f8CGkd3gOF7PPlv9TzIYtyjpCCjJah2kGjqfogYIQ9l1EBsZQplYd5OaYaH-dvxFBA8tlNteaEWGRAfhqsu6bbMVXlFG0VwlnQdUFvR6N7dUytmgKxaaHjyH2KUuGwgh6ELevfnYyqoYk-UAarnr3MbrnpmfcL7z3D-4aBOSTmXIOIHFkFRiUCQ==";
|
R r = uploadNumberFileTest("https://huishou-1323682843.cos.ap-nanjing.myqcloud.com/images/38878509-00b7-4fb2-9c3a-b53d8161d84a.jpg","");
|
// System.err.println(r.getMsg());
|
// String tokenTest = getTokenTest();
|
// System.err.println(tokenTest);
|
// R r = addANumberTest("17828262728", "刘杰", "511028200002150816", "avatar6278474701910805124b53d8161d84a.jpg");
|
// System.err.println(r.getMsg());
|
}
|
}
|