Commit 2e66e257 authored by yanzg's avatar yanzg

Merge branch 'master' of http://192.168.0.204/yzg/yzg-util

parents 170c48f0 e52a7af8

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
<modules> <modules>
<module>yzg-util-base</module> <module>yzg-util-base</module>
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
<module>yzg-util-chinese</module> <module>yzg-util-chinese</module>
<module>yzg-util-file</module> <module>yzg-util-file</module>
<module>yzg-util-redis</module> <module>yzg-util-redis</module>
<module>yzg-util-wxxcx</module>
</modules> </modules>
<properties> <properties>
...@@ -35,7 +36,7 @@ ...@@ -35,7 +36,7 @@
<fastjson.version>1.2.62</fastjson.version> <fastjson.version>1.2.62</fastjson.version>
<mysql.version>6.0.6</mysql.version> <mysql.version>6.0.6</mysql.version>
<poi.version>3.9</poi.version> <poi.version>3.9</poi.version>
<yzg.version>1.1-SNAPSHOT</yzg.version> <yzg.version>1.2-SNAPSHOT</yzg.version>
<swagger.version>2.9.2</swagger.version> <swagger.version>2.9.2</swagger.version>
<guava.version>20.0</guava.version> <guava.version>20.0</guava.version>
<!--<jetcache.version>2.6.1</jetcache.version>--> <!--<jetcache.version>2.6.1</jetcache.version>-->
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
<parent> <parent>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<artifactId>yzg-util-base</artifactId> <artifactId>yzg-util-base</artifactId>
......
...@@ -306,13 +306,24 @@ public class ObjectHelper { ...@@ -306,13 +306,24 @@ public class ObjectHelper {
return toName; return toName;
} }
/**
* 获取字段处理名称
*
* @param fromName 字段名称
* @return 属性名称
*/
private static String getObjectFieldName(String fromName) {
String toName = fromName.replace("_", "");
return toName;
}
/** /**
* 获取实体的字段 * 获取实体的字段
* *
* @param cls 需要获取的类型 * @param cls 需要获取的类型
* @return 获取字段之间的对应关系 * @return 获取字段之间的对应关系
*/ */
private static HashMap<String, MethodField> getInitTypeField(Class<?> cls) { private static HashMap<String, MethodField> getInitTypeField(Class<?> cls, boolean isTableField) {
HashMap<String, MethodField> typeCache = new LinkedHashMap<String, MethodField>(); HashMap<String, MethodField> typeCache = new LinkedHashMap<String, MethodField>();
List<Field> fields = new ArrayList<Field>(); List<Field> fields = new ArrayList<Field>();
...@@ -332,7 +343,13 @@ public class ObjectHelper { ...@@ -332,7 +343,13 @@ public class ObjectHelper {
if (Modifier.isStatic(field.getModifiers())) { if (Modifier.isStatic(field.getModifiers())) {
continue; continue;
} }
String toName = getSimpleFieldName(field.getName()); String toName;
if (isTableField) {
toName = getSimpleFieldName(field.getName());
} else {
toName = getObjectFieldName(field.getName());
}
MethodField obj = getField(typeCache, field.getName(), toName); MethodField obj = getField(typeCache, field.getName(), toName);
if (obj.getField() == null) { if (obj.getField() == null) {
obj.setField(field); obj.setField(field);
...@@ -382,7 +399,24 @@ public class ObjectHelper { ...@@ -382,7 +399,24 @@ public class ObjectHelper {
if (MAP_CACHE.containsKey(type)) { if (MAP_CACHE.containsKey(type)) {
typeCache = MAP_CACHE.get(type); typeCache = MAP_CACHE.get(type);
} else { } else {
typeCache = getInitTypeField(type); typeCache = getInitTypeField(type, true);
MAP_CACHE.put(type, typeCache);
}
return typeCache;
}
/**
* 获取一个表中的字段
*
* @param type
* @return
*/
public static HashMap<String, MethodField> getObjectTypeField(Class<?> type) {
HashMap<String, MethodField> typeCache;
if (MAP_CACHE.containsKey(type)) {
typeCache = MAP_CACHE.get(type);
} else {
typeCache = getInitTypeField(type, false);
MAP_CACHE.put(type, typeCache); MAP_CACHE.put(type, typeCache);
} }
return typeCache; return typeCache;
......
...@@ -184,10 +184,21 @@ public class HttpHelper { ...@@ -184,10 +184,21 @@ public class HttpHelper {
* @return 远程响应结果 * @return 远程响应结果
*/ */
public static String postApplicationJSON(String url, String jsonString) { public static String postApplicationJSON(String url, String jsonString) {
return postApplicationJSON(url, jsonString, "UTF-8");
}
/**
* 发送POST请求,当请求失败时,抛出异常或返回空字符串
*
* @param url 目的地址
* @param jsonString 请求参数,json字符串。
* @return 远程响应结果
*/
public static String postApplicationJSON(String url, String jsonString, String charset) {
try { try {
// 打开URL连接 // 打开URL连接
java.net.HttpURLConnection httpConn = getConn(url, true); java.net.HttpURLConnection httpConn = getConn(url, true);
return post(httpConn, jsonString, "UTF-8"); return post(httpConn, jsonString, charset);
} catch (Exception ex) { } catch (Exception ex) {
throw new RuntimeException(ex); throw new RuntimeException(ex);
} }
...@@ -251,6 +262,47 @@ public class HttpHelper { ...@@ -251,6 +262,47 @@ public class HttpHelper {
return result.toString(); return result.toString();
} }
/**
* 发送POST请求,当请求失败时,抛出异常或返回空字符串
*
* @param httpConn 链接信息
* @param jsonString 请求参数,json字符串。
* @return 远程响应结果
*/
public static byte[] postResultByteArray(HttpURLConnection httpConn, String jsonString) throws IOException {
// 返回的结果
byte[] byteArray;
PrintWriter out = null;
// 处理请求参数
String params = "";
try {
params = jsonString;
// 获取HttpURLConnection对象对应的输出流
out = new PrintWriter(httpConn.getOutputStream());
// 发送请求参数
out.write(params);
// flush输出流的缓冲
out.flush();
int returnCode = httpConn.getResponseCode();
if (returnCode == HttpURLConnection.HTTP_OK) {
byteArray = readByteArray(httpConn.getInputStream());
} else {
throw new HttpCodeException(StringHelper.toString(returnCode), httpConn.getResponseMessage());
}
} catch (HttpCodeException ex) {
throw ex;
} catch (Exception ex) {
byteArray = readByteArray(httpConn.getErrorStream());
throw new HttpCodeException(StringHelper.toString(httpConn.getResponseCode()), ex.getMessage(), ex);
} finally {
if (out != null) {
out.close();
}
}
return byteArray;
}
/** /**
* 发送GET请求,当请求失败时,抛出异常或返回空字符串 * 发送GET请求,当请求失败时,抛出异常或返回空字符串
* *
...@@ -309,6 +361,23 @@ public class HttpHelper { ...@@ -309,6 +361,23 @@ public class HttpHelper {
return in; return in;
} }
/**
* 读取数据流
*
* @param input 流
* @return 读取的缓存流
* @throws IOException IO异常
*/
public static byte[] readByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
return output.toByteArray();
}
/** /**
* 下载文件 * 下载文件
* *
......
...@@ -30,6 +30,9 @@ public class DataDaoVo<T> { ...@@ -30,6 +30,9 @@ public class DataDaoVo<T> {
// 历史数据处理 // 历史数据处理
if (hisitories != null) { if (hisitories != null) {
for (T his : hisitories) { for (T his : hisitories) {
if (his == null) {
continue;
}
String key = keyFunc.getKey(his); String key = keyFunc.getKey(his);
mapHistory.put(key, his); mapHistory.put(key, his);
} }
...@@ -49,6 +52,9 @@ public class DataDaoVo<T> { ...@@ -49,6 +52,9 @@ public class DataDaoVo<T> {
// 返回集 // 返回集
if (nows != null) { if (nows != null) {
for (T now : nows) { for (T now : nows) {
if (now == null) {
continue;
}
String key = keyFunc.getKey(now); String key = keyFunc.getKey(now);
T his = mapHistory.get(key); T his = mapHistory.get(key);
if (his == null) { if (his == null) {
......
...@@ -4,6 +4,8 @@ import com.yanzuoguang.util.helper.StringHelper; ...@@ -4,6 +4,8 @@ import com.yanzuoguang.util.helper.StringHelper;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import java.math.BigDecimal;
public class TestStringHelper { public class TestStringHelper {
@Test @Test
public void testFirstRun() { public void testFirstRun() {
...@@ -38,5 +40,25 @@ public class TestStringHelper { ...@@ -38,5 +40,25 @@ public class TestStringHelper {
System.out.println(StringHelper.trim("1005050103", "1", "0", "3")); System.out.println(StringHelper.trim("1005050103", "1", "0", "3"));
} }
@Test
public void testToString() {
System.out.println(StringHelper.toString(0.0000000));
System.out.println(StringHelper.toString(50.0000001));
System.out.println(StringHelper.toString(0.02));
System.out.println(StringHelper.toString(0.0000001));
System.out.println(StringHelper.toString(50.00050000));
System.out.println(StringHelper.toString(0.00050000));
System.out.println(StringHelper.toString(0.1000000));
System.out.println(StringHelper.toString(5.1000000));
System.out.println(StringHelper.toString(100.1000000));
System.out.println(StringHelper.toString(new BigDecimal("0.0000000")));
System.out.println(StringHelper.toString(new BigDecimal("0.0000001")));
System.out.println(StringHelper.toString(new BigDecimal("0.00050000")));
System.out.println(StringHelper.toString(new BigDecimal("0.1000000")));
System.out.println(StringHelper.toString(new BigDecimal("100.1000000")));
}
} }
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -125,16 +125,24 @@ public class BeanDao { ...@@ -125,16 +125,24 @@ public class BeanDao {
* @return 创建成功的交换器 * @return 创建成功的交换器
*/ */
public TopicExchange createExchange(String exchangeName) { public TopicExchange createExchange(String exchangeName) {
Ref<TopicExchange> ret = new Ref<>(null);
YzgTimeout.timeOut(BeanDao.class, "创建交换器" + exchangeName, () ->
ret.value = createExchangeRun(exchangeName)
);
// 重新获取实体
return ret.value;
}
private TopicExchange createExchangeRun(String exchangeName) {
String key = StringHelper.getId(EXCHANGE, exchangeName); String key = StringHelper.getId(EXCHANGE, exchangeName);
// 判断队列是否存在,不存在则锁定再次判断 // 判断队列是否存在,不存在则锁定再次判断
TopicExchange beanHis = getBean(TopicExchange.class, key); TopicExchange beanHis = getBean(TopicExchange.class, key);
if (beanHis != null) { if (beanHis != null) {
return beanHis; return beanHis;
} }
// 创建实体 // 创建实体
TopicExchange bean = new TopicExchange(exchangeName, true, false); TopicExchange bean = new TopicExchange(exchangeName, true, false);
YzgTimeout.timeOut(BeanDao.class, "创建交换器" + exchangeName, () -> amqpAdmin.declareExchange(bean)); amqpAdmin.declareExchange(bean);
// 将实体注册到上下文中 // 将实体注册到上下文中
register(key, bean); register(key, bean);
...@@ -151,11 +159,20 @@ public class BeanDao { ...@@ -151,11 +159,20 @@ public class BeanDao {
* @return 绑定对象 * @return 绑定对象
*/ */
public Binding createBinding(String exchangeName, String queueName, String routeKey) { public Binding createBinding(String exchangeName, String queueName, String routeKey) {
Ref<Binding> ret = new Ref<>(null);
YzgTimeout.timeOut(BeanDao.class, "创建路由绑定" + routeKey, () ->
ret.value = createBindingRun(exchangeName, queueName, routeKey)
);
return ret.value;
}
public Binding createBindingRun(String exchangeName, String queueName, String routeKey) {
Binding binding = BindingBuilder.bind(getQueue(queueName)).to(getExchange(exchangeName)).with(routeKey); Binding binding = BindingBuilder.bind(getQueue(queueName)).to(getExchange(exchangeName)).with(routeKey);
YzgTimeout.timeOut(BeanDao.class, "创建路由绑定" + routeKey, () -> amqpAdmin.declareBinding(binding)); amqpAdmin.declareBinding(binding);
return binding; return binding;
} }
/** /**
* 获取实体 * 获取实体
* *
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>yzg-util</artifactId> <artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId> <groupId>com.yanzuoguang</groupId>
<version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yzg-util</artifactId>
<groupId>com.yanzuoguang</groupId>
<version>1.2-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yzg-util-wxxcx</artifactId>
<description>微信小程序工具类</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<bouncycastle.version>1.57</bouncycastle.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>com.yanzuoguang</groupId>
<artifactId>yzg-util-base</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<!--微信小程序用户信息解密工具-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package com.yanzuoguang.wxxcx.ad.req;
/***
* 回传广告数据
*
* @author:heyanou
*/
public class WxUserActionDataReq {
}
package com.yanzuoguang.wxxcx.ad.req;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetDataReq {
}
package com.yanzuoguang.wxxcx.ad.req;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetReportsDataReq {
}
package com.yanzuoguang.wxxcx.ad.req;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetsDataReq {
}
package com.yanzuoguang.wxxcx.ad.request;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.ad.req.WxUserActionDataReq;
import com.yanzuoguang.wxxcx.ad.res.WxUserActionDataRes;
import com.yanzuoguang.wxxcx.base.*;
/***
* 回传广告数据
*
* @author:heyanou
*/
public class WxUserActionDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxUserActionDataReq req;
public WxUserActionDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxUserActionDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getAdUserActionDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxUserActionDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxUserActionDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxUserActionDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.ad.request;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.ad.req.WxUserActionDataReq;
import com.yanzuoguang.wxxcx.ad.res.WxUserActionDataRes;
import com.yanzuoguang.wxxcx.ad.res.WxUserActionSetDataRes;
import com.yanzuoguang.wxxcx.base.*;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxUserActionDataReq req;
public WxUserActionSetDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxUserActionDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getAdUserActionSetDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxUserActionSetDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxUserActionSetDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxUserActionSetDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.ad.request;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.ad.req.WxUserActionDataReq;
import com.yanzuoguang.wxxcx.ad.req.WxUserActionSetReportsDataReq;
import com.yanzuoguang.wxxcx.ad.res.WxUserActionDataRes;
import com.yanzuoguang.wxxcx.ad.res.WxUserActionSetReportsDataRes;
import com.yanzuoguang.wxxcx.base.*;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetReportsDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxUserActionSetReportsDataReq req;
public WxUserActionSetReportsDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxUserActionSetReportsDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getAdUserActionSetReportsDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxUserActionSetReportsDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxUserActionSetReportsDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxUserActionSetReportsDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.ad.request;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.ad.req.WxUserActionDataReq;
import com.yanzuoguang.wxxcx.ad.res.WxUserActionDataRes;
import com.yanzuoguang.wxxcx.base.*;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetsDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxUserActionDataReq req;
public WxUserActionSetsDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxUserActionDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getAdUserActionSetDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxUserActionDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxUserActionDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxUserActionDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.ad.res;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
/***
* 回传广告数据
*
* @author:heyanou
*/
public class WxUserActionDataRes extends WxXcxResponseBaseError {
}
package com.yanzuoguang.wxxcx.ad.res;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetDataRes extends WxXcxResponseBaseError {
}
package com.yanzuoguang.wxxcx.ad.res;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetReportsDataRes extends WxXcxResponseBaseError {
}
package com.yanzuoguang.wxxcx.ad.res;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetsDataRes extends WxXcxResponseBaseError {
}
package com.yanzuoguang.wxxcx.ad.service;
/***
* 回传广告数据
*
* @author:heyanou
*/
public interface WxUserActionService {
}
package com.yanzuoguang.wxxcx.ad.service;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public interface WxUserActionSetReportsService {
}
package com.yanzuoguang.wxxcx.ad.service;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public interface WxUserActionSetService {
}
package com.yanzuoguang.wxxcx.ad.service;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public interface WxUserActionSetsService {
}
package com.yanzuoguang.wxxcx.ad.service.impl;
/***
* 回传广告数据
*
* @author:heyanou
*/
public class WxUserActionServiceImpl {
}
package com.yanzuoguang.wxxcx.ad.service.impl;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetReportsServiceImpl {
}
package com.yanzuoguang.wxxcx.ad.service.impl;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetServiceImpl {
}
package com.yanzuoguang.wxxcx.ad.service.impl;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxUserActionSetsServiceImpl {
}
package com.yanzuoguang.wxxcx.base;
/**
* 小程序token
*
* @author 颜佐光
*/
public class WxXcxAccessToken {
private String access_token;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
}
package com.yanzuoguang.wxxcx.base;
/**
* access_token字段
*
* @author 李贤军
*/
public class WxXcxAccessTokenField {
public static final String FIELD_ACCESS_TOKEN = "access_token";
}
package com.yanzuoguang.wxxcx.base;
import com.yanzuoguang.util.exception.CodeTargetException;
/**
* 微信小程序配置
*
* @author 颜佐光
*/
public class WxXcxAssert {
public static final String WX_ERROR_CODE = "WX_XCX.";
public static void assertBaseError(WxXcxResponseBaseError baseError) {
if (baseError.getErrcode() != 0) {
throw new CodeTargetException(String.format("%s%s", WX_ERROR_CODE, baseError.getErrcode()), baseError.getErrmsg(), baseError);
}
}
}
package com.yanzuoguang.wxxcx.base;
/**
* @author 李贤军
*/
public interface WxXcxByteArrayRequest {
/**
* 请求其他
*
* @param req 请求后端实现
* @param convert 转换参数
* @return 返回请求流
*/
byte[] request(WxXcxRequestUrl req, WxXcxResponseArrayByteConvert convert);
}
package com.yanzuoguang.wxxcx.base;
/**
* 请求实现
*
* @author 颜佐光
*/
public interface WxXcxRequest {
/**
* 请求其他
*
* @param req 请求后端实现
* @param convert 转换参数
* @param <T> 返回结果类型
* @return 返回请求结果
*/
<T> T request(WxXcxRequestUrl req, WxXcxResponseConvert<T> convert);
}
package com.yanzuoguang.wxxcx.base;
import com.yanzuoguang.util.helper.HttpHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
/**
* @author 李贤军
*/
@Component
public class WxXcxRequestByteArrayImpl implements WxXcxByteArrayRequest {
@Value("${yzg.wx.xwx.charset:utf-8}")
private String defaultCharSet;
@Override
public byte[] request(WxXcxRequestUrl req, WxXcxResponseArrayByteConvert convert) {
String url = req.getUrl();
// String charSet = defaultCharSet;
String charSet = "utf-8";
Map<String, String> header;
if (req instanceof WxXcxRequestHeader) {
// 设置header信息
header = ((WxXcxRequestHeader) req).getHeader();
} else {
header = new HashMap<>(0);
}
byte[] response = null;
try {
if (req instanceof WxXcxRequestPostFormData) {
WxXcxRequestPostFormData post = (WxXcxRequestPostFormData) req;
HttpURLConnection conn = HttpHelper.getConn(url, header);
response = HttpHelper.postResultByteArray(conn, post.getPost());
} else if (req instanceof WxXcxRequestPostApplication) {
WxXcxRequestPostApplication post = (WxXcxRequestPostApplication) req;
// 打开URL连接
java.net.HttpURLConnection httpConn = HttpHelper.getConn(url, header, true);
response = HttpHelper.postResultByteArray(httpConn, post.getPost());
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
return convert.getResponse(response);
}
}
package com.yanzuoguang.wxxcx.base;
import java.util.Map;
/**
* 设置头文件
*
* @author 颜佐光
*/
public interface WxXcxRequestHeader {
/**
* 头文件信息
*
* @return 投文件信息
*/
Map<String, String> getHeader();
}
package com.yanzuoguang.wxxcx.base;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;
/**
* 微信小程序实现
*
* @author 颜佐光
*/
@Component
public class WxXcxRequestImpl implements WxXcxRequest {
Logger logger = LoggerFactory.getLogger(WxXcxRequestImpl.class);
@Value("${yzg.wx.xwx.charset:utf-8}")
private String defaultCharSet;
@Override
public <T> T request(WxXcxRequestUrl req, WxXcxResponseConvert<T> convert) {
String url = req.getUrl();
// String charSet = defaultCharSet;
String charSet = "utf-8";
Map<String, String> header;
if (req instanceof WxXcxRequestHeader) {
// 设置header信息
header = ((WxXcxRequestHeader) req).getHeader();
} else {
header = new HashMap<>(0);
}
String response;
try {
if (req instanceof WxXcxRequestPostFormData) {
WxXcxRequestPostFormData post = (WxXcxRequestPostFormData) req;
HttpURLConnection conn = HttpHelper.getConn(url, header);
response = HttpHelper.post(conn, post.getPost(), charSet);
} else if (req instanceof WxXcxRequestPostApplication) {
WxXcxRequestPostApplication post = (WxXcxRequestPostApplication) req;
// 打开URL连接
java.net.HttpURLConnection httpConn = HttpHelper.getConn(url, header, true);
response = HttpHelper.post(httpConn, post.getPost(), charSet);
} else {
HttpURLConnection conn = HttpHelper.getConn(url, header);
response = HttpHelper.get(conn);
}
} catch (Exception ex) {
throw new RuntimeException(url + StringHelper.getFirst(ex.getMessage()), ex);
}
return convert.getResponse(response);
}
}
package com.yanzuoguang.wxxcx.base;
/**
* 获取请求地址
*
* @author 颜佐光
*/
public interface WxXcxRequestPostApplication {
/**
* 获取请求地址
*
* @return 请求地址
*/
String getPost();
}
package com.yanzuoguang.wxxcx.base;
/**
* 获取请求地址
*
* @author 颜佐光
*/
public interface WxXcxRequestPostFormData {
/**
* 获取请求地址
*
* @return 请求地址
*/
String getPost();
}
package com.yanzuoguang.wxxcx.base;
/**
* 获取请求地址
*
* @author 颜佐光
*/
public interface WxXcxRequestUrl {
/**
* 获取请求地址
*
* @return 请求地址
*/
String getUrl();
}
package com.yanzuoguang.wxxcx.base;
/**
* 获取请求地址
*
* @author 颜佐光
*/
public interface WxXcxRequestUrlPara {
/**
* 获取请求地址
*
* @return 请求地址
*/
String getUrlPara();
}
package com.yanzuoguang.wxxcx.base;
/**
* @author 李贤军
*/
public interface WxXcxResponseArrayByteConvert {
/**
* 将字符串转换为结果
*
* @param response 字符串
* @return 实体结果
*/
byte[] getResponse(byte[] response);
}
package com.yanzuoguang.wxxcx.base;
import com.yanzuoguang.util.vo.BaseVo;
public class WxXcxResponseBaseError extends BaseVo {
/**
* 错误码
*/
public int errcode;
/**
* 错误信息
*/
public String errmsg;
public int getErrcode() {
return errcode;
}
public void setErrcode(int errcode) {
this.errcode = errcode;
}
public String getErrmsg() {
return errmsg;
}
public void setErrmsg(String errmsg) {
this.errmsg = errmsg;
}
}
package com.yanzuoguang.wxxcx.base;
/**
* 将字符串转换为结果
*
* @param <T>
* @author 颜佐光
*/
public interface WxXcxResponseConvert<T> {
/**
* 将字符串转换为结果
*
* @param response 字符串
* @return 实体结果
*/
T getResponse(String response);
}
package com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction;
/***
* 延时调用云函数
*
* @author:heyanou
*/
public class WxAddDelayedFunctionTaskDataReq {
/**
* <p>
* 是否必填:是
* 描述:接口调用凭证
* </p>
*/
private String access_token;
/**
* <p>
* 是否必填:是
* 描述:环境ID
* </p>
*/
private String env;
/**
* <p>
* 是否必填:是
* 描述:函数名称
* </p>
*/
private String function_name;
/**
* <p>
* 是否必填:是
* 描述:延迟时间,单位:秒,合法范围:6s-30天
* </p>
*/
private Long delay_time;
/**
* <p>
* 是否必填:是
* 描述:发送的数据包,格式必须为JSONString
* </p>
*/
private String data;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getEnv() {
return env;
}
public void setEnv(String env) {
this.env = env;
}
public String getFunction_name() {
return function_name;
}
public void setFunction_name(String function_name) {
this.function_name = function_name;
}
public Long getDelay_time() {
return delay_time;
}
public void setDelay_time(Long delay_time) {
this.delay_time = delay_time;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
package com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.base.*;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataRes;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataReq;
/***
* 延时调用云函数
*
* @author:heyanou
*/
public class WxAddDelayedFunctionTaskDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxAddDelayedFunctionTaskDataReq req;
public WxAddDelayedFunctionTaskDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getCloudbaseAdddelayedfunctiontaskDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxAddDelayedFunctionTaskDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxAddDelayedFunctionTaskDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxAddDelayedFunctionTaskDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
/***
* 返回结果
*
* @author:heyanou
*/
public class WxAddDelayedFunctionTaskDataRes extends WxXcxResponseBaseError {
}
云开发 /addDelayedFunctionTask
# cloudbase.addDelayedFunctionTask
> 本接口应在服务器端调用,详细说明参见[服务端API](https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/backend-api.html)。
> 本接口支持[云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)。需开发者工具版本 >= `1.02.1904090`(最新[稳定版下载](https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html)),`wx-server-sdk` >= `0.4.0`
延时调用云函数
调用方式:
- [HTTPS 调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.addDelayedFunctionTask.html#method-http)
- [云调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.addDelayedFunctionTask.html#method-cloud)
## HTTPS 调用
### 请求地址
```text
POST https://api.weixin.qq.com/tcb/adddelayedfunctiontask?access_token=TOKEN
```
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------------------------------------ | :----- | :----- | :--- | :----------------------------------------------------------- |
| access_token / cloudbase_access_token | string | | 是 | [接口调用凭证](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html) |
| env | string | | 是 | 环境ID |
| function_name | string | | 是 | 函数名称 |
| delay_time | number | | 是 | 延迟时间,单位:秒,合法范围:6s-30天 |
| data | string | | 是 | 发送的数据包,格式必须为JSONString |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errcode | string | 错误码 |
| errmsg | string | 错误信息 |
### 请求数据示例
```json
{
"env": "test-env-6gni9ity244a6ea3",
"function_name": "echo",
"delay_time": 10,
"data": "{\"test\":true}"
}
```
### 返回数据示例
```json
{
"errcode": 0,
"errmsg": "ok"
}
```
## 云调用
> [云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)是微信云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 `wx-server-sdk` 使用。
### 接口方法
```js
openapi.cloudbase.addDelayedFunctionTask
```
> 需在 `config.json` 中配置 `cloudbase.addDelayedFunctionTask` API 的权限,[详情](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html#usage-3)
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :----------- | :----- | :----- | :--- | :------------------------------------ |
| env | string | | 是 | 环境ID |
| functionName | string | | 是 | 函数名称 |
| delayTime | number | | 是 | 延迟时间,单位:秒,合法范围:6s-30天 |
| data | string | | 是 | 发送的数据包,格式必须为JSONString |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errCode | string | 错误码 |
| errMsg | string | 错误信息 |
### 异常
### Object
抛出的异常
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errCode | string | 错误码 |
| errMsg | string | 错误信息 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :--- | :--- | :------- |
| | | |
### 请求数据示例
```js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.cloudbase.addDelayedFunctionTask({
"env": 'test-env-6gni9ity244a6ea3',
"data": '{\'test\":true}",
"functionName": 'echo',
"delayTime": 10
})
return result
} catch (err) {
return err
}
}
```
### 返回数据示例
```json
{
"errCode": 0,
"errMsg": "openapi.cloudbase.addDelayedFunctionTask:ok"
}
```
\ No newline at end of file
package com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.service;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataRes;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataReq;
/***
* 延时调用云函数
*
* @author:heyanou
*/
public interface WxAddDelayedFunctionTaskService {
/**
*<b>延时调用云函数</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
WxAddDelayedFunctionTaskDataRes addDelayedFunctionTask(WxXcxAccessToken accessToken, WxAddDelayedFunctionTaskDataReq req);
}
package com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.service.impl;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.base.WxXcxConfig;
import com.yanzuoguang.wxxcx.base.WxXcxRequest;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataReq;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.WxAddDelayedFunctionTaskDataRes;
import com.yanzuoguang.wxxcx.cloudbase.addDelayedFunction.service.WxAddDelayedFunctionTaskService;
import org.springframework.stereotype.Component;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
@Component
public class WxAddDelayedFunctionTaskServiceImpl implements WxAddDelayedFunctionTaskService {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
public WxAddDelayedFunctionTaskServiceImpl(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
}
/**
*<b>延时调用云函数</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
@Override
public WxAddDelayedFunctionTaskDataRes addDelayedFunctionTask(WxXcxAccessToken accessToken, WxAddDelayedFunctionTaskDataReq req) {
WxAddDelayedFunctionTaskDataRequest addDelayedFunctionTaskDataRequest = new WxAddDelayedFunctionTaskDataRequest(wxXcxConfig, wxXcxRequest, accessToken, req);
return addDelayedFunctionTaskDataRequest.getResponse();
}
}
- [云开发]
- [延时调用]
- [延时调用云函数](./addDelayedFunctionTask/addDelayedFunctionTask.md)
- [上传文件]
- [上传文件信息](./describeExtension/describeExtension.md)
- [短信记录]
- [查询 2 个月内的短信记录](./describeSmsRecords/describeSmsRecords.md)
- [开放数据]
- [换取 cloudID ](./getopen/getOpenData.md)
- [获取云开发]
- [获取云开发数据接口](./getstatistics/getStatistics.md)
- [获取实时语音签名]
- [获取实时语音签名](./getVoIPSign/getVoIPSign.md)
- [导入]
- [云开发通用上报接口](./report/report.md)
- [短信]
- [发送短信](./sendSms/sendSms.md)
- [发送短信V2](./sendSmsV2/sendSmsV2.md)
- [创建发短信任务]
- [创建发短信任务](./sendSmsTask/createSendSmsTask.md)
\ No newline at end of file
package com.yanzuoguang.wxxcx.cloudbase.describeExtension;
import com.yanzuoguang.wxxcx.cloudbase.vo.ExtensionFiles;
import java.util.List;
/***
* 描述扩展上传文件信息
*
* @author:heyanou
*/
public class WxDescribeExtensionUploadInfoDataReq {
/**
* <p>
* 是否必填:是
* 描述:接口调用凭证
* </p>
*/
private String access_token;
/**
* <p>
* 是否必填:是
* 描述:待上传的文件列表
* </p>
*/
private List<ExtensionFiles> ExtensionFiles;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public List<com.yanzuoguang.wxxcx.cloudbase.vo.ExtensionFiles> getExtensionFiles() {
return ExtensionFiles;
}
public void setExtensionFiles(List<com.yanzuoguang.wxxcx.cloudbase.vo.ExtensionFiles> extensionFiles) {
ExtensionFiles = extensionFiles;
}
}
package com.yanzuoguang.wxxcx.cloudbase.describeExtension;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.base.*;
/***
* 广告请求
*
* @author:heyanou
*/
public class WxDescribeExtensionUploadInfoDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxDescribeExtensionUploadInfoDataReq req;
public WxDescribeExtensionUploadInfoDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxDescribeExtensionUploadInfoDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getCloudbaseDescribeextensionuploadinfoDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxDescribeExtensionUploadInfoDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxDescribeExtensionUploadInfoDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxDescribeExtensionUploadInfoDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.cloudbase.describeExtension;
import com.yanzuoguang.wxxcx.base.*;
import java.util.ArrayList;
/***
* 广告请求
*
* @author:heyanou
*/
public class WxDescribeExtensionUploadInfoDataRes extends WxXcxResponseBaseError {
/***
* <b>待上传文件的信息数组</b>
*/
private ArrayList<Object> FilesData;
/***
* <p>唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。</p>
*/
private String RequestId;
public ArrayList<Object> getFilesData() {
return FilesData;
}
public void setFilesData(ArrayList<Object> filesData) {
FilesData = filesData;
}
public String getRequestId() {
return RequestId;
}
public void setRequestId(String requestId) {
RequestId = requestId;
}
}
云开发 /describeExtensionUploadInfo
# cloudbase.describeExtensionUploadInfo
> 本接口应在服务器端调用,详细说明参见[服务端API](https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/backend-api.html)。
> 本接口支持[云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)。需开发者工具版本 >= `1.02.1904090`(最新[稳定版下载](https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html)),`wx-server-sdk` >= `0.4.0`
描述扩展上传文件信息
调用方式:
- [HTTPS 调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.describeExtensionUploadInfo.html#method-http)
- [云调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.describeExtensionUploadInfo.html#method-cloud)
## HTTPS 调用
### 请求地址
```text
POST https://api.weixin.qq.com/tcb/describeextensionuploadinfo?access_token=TOKEN
```
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------------------------------------ | :------------- | :----- | :--- | :----------------------------------------------------------- |
| access_token / cloudbase_access_token | string | | 是 | [接口调用凭证](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html) |
| ExtensionFiles | Array.<Object> | | 是 | 待上传的文件列表 |
**ExtensionFiles 的结构**
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------- | :----- | :----- | :--- | :----------------------------------------------------------- |
| FileType | string | | 是 | 文件类型。枚举值 FUNCTION:函数代码 STATIC:静态托管代码 SMS:短信文件 |
| FileName | string | | 是 | 文件名,长度不超过24 |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :-------- | :------------- | :----------------------------------------------------------- |
| errcode | number | 错误码 |
| errmsg | string | 错误信息 |
| FilesData | Array.<Object> | 待上传文件的信息数组 |
| RequestId | string | 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 |
**errcode 的合法值**
| 值 | 说明 | 最低版本 |
| :------ | :----------------------------- | :------- |
| 0 | 请求成功 | |
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| -501007 | 参数有误,具体原因参考 errmsg | |
**FilesData 的结构**
| 属性 | 类型 | 说明 |
| :-------- | :----- | :----------------------------------------------------------- |
| CodeUri | string | 模板里使用的地址 |
| UploadUrl | string | 上传文件的临时地址,含签名 |
| CustomKey | string | 自定义密钥。如果为空,则表示不需要加密 |
| MaxSize | number | 文件大小限制,单位M,客户端上传前需要主动检查文件大小,超过限制的文件会被删除。 |
### 请求数据示例
```json
{
"PostData": {
"ExtensionFiles": [{
"FileType":"SMS",
"FileName":"gongzi.csv"
}]
}
}
```
### 返回数据示例
```json
{
"Response":{
"FilesData":[
{
"CodeUri":"extension://xxx.zip",
"UploadUrl":"https://xxx",
"CustomKey":"",
"MaxSize":30
}
],
"RequestId":"83793d78-b90b-4b1e-9454-d7b4f5317f01"
}
}
```
## 云调用
> [云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)是微信云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 `wx-server-sdk` 使用。
### 接口方法
```js
openapi.cloudbase.describeExtensionUploadInfo
```
> 需在 `config.json` 中配置 `cloudbase.describeExtensionUploadInfo` API 的权限,[详情](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html#usage-3)
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------------- | :------------- | :----- | :--- | :--------------- |
| ExtensionFiles | Array.<Object> | | 是 | 待上传的文件列表 |
**ExtensionFiles 的结构**
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------- | :----- | :----- | :--- | :----------------------------------------------------------- |
| FileType | string | | 是 | 文件类型。枚举值 FUNCTION:函数代码 STATIC:静态托管代码 SMS:短信文件 |
| FileName | string | | 是 | 文件名,长度不超过24 |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :-------- | :------------- | :----------------------------------------------------------- |
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
| FilesData | Array.<Object> | 待上传文件的信息数组 |
| RequestId | string | 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :--- | :--- | :------- |
| 0 | 成功 | |
**FilesData 的结构**
| 属性 | 类型 | 说明 |
| :-------- | :----- | :----------------------------------------------------------- |
| CodeUri | string | 模板里使用的地址 |
| UploadUrl | string | 上传文件的临时地址,含签名 |
| CustomKey | string | 自定义密钥。如果为空,则表示不需要加密 |
| MaxSize | number | 文件大小限制,单位M,客户端上传前需要主动检查文件大小,超过限制的文件会被删除。 |
### 异常
### Object
抛出的异常
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :------ | :----------------------------- | :------- |
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| -501007 | 参数有误,具体原因参考 errmsg | |
### 请求数据示例
```js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi({ convertCase: false }).cloudbase.describeExtensionUploadInfo({
"PostData": {
"ExtensionFiles": [
{
"FileType": 'SMS',
"FileName": 'gongzi.csv'
}
]
}
})
return result
} catch (err) {
return err
}
}
```
### 返回数据示例
```json
{
"Response": {
"FilesData": [
{
"CodeUri": "extension://xxx.zip",
"UploadUrl": "https://xxx",
"CustomKey": "",
"MaxSize": 30
}
],
"RequestId": "83793d78-b90b-4b1e-9454-d7b4f5317f01"
},
"errMsg": "openapi.cloudbase.describeExtensionUploadInfo:ok"
}
```
\ No newline at end of file
package com.yanzuoguang.wxxcx.cloudbase.describeExtension.service;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataReq;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataRes;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataReq;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataRes;
/***
* 描述扩展上传文件信息
*
* @author:heyanou
*/
public interface WxDescribeExtensionUploadInfoService {
/**
*<b>描述扩展上传文件信息</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
WxDescribeExtensionUploadInfoDataRes describeExtensionUploadInfo(WxXcxAccessToken accessToken, WxDescribeExtensionUploadInfoDataReq req);
}
package com.yanzuoguang.wxxcx.cloudbase.describeExtension.service.impl;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.base.WxXcxConfig;
import com.yanzuoguang.wxxcx.base.WxXcxRequest;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataReq;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataRes;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.service.WxDescribeExtensionUploadInfoService;
import org.springframework.stereotype.Component;
/***
* 延时调用云函数
*
* @author:heyanou
*/
@Component
public class WxDescribeExtensionUploadInfoServiceImpl implements WxDescribeExtensionUploadInfoService {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
public WxDescribeExtensionUploadInfoServiceImpl(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
}
/**
*<b>描述扩展上传文件信息</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
@Override
public WxDescribeExtensionUploadInfoDataRes describeExtensionUploadInfo(WxXcxAccessToken accessToken, WxDescribeExtensionUploadInfoDataReq req){
WxDescribeExtensionUploadInfoDataRequest extensionuploadInfoRequest = new WxDescribeExtensionUploadInfoDataRequest(wxXcxConfig, wxXcxRequest, accessToken, req);
return extensionuploadInfoRequest.getResponse();
}
}
package com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords;
/***
* 查询 2 个月内的短信记录
*
* @author:heyanou
*/
public class WxDescribeSmsRecordsDataReq {
/**
* <p>
* 是否必填:是
* 描述:接口调用凭证
* </p>
*/
private String access_token;
/**
* <p>
* 是否必填:是
* 描述:环境ID
* </p>
*/
private String EnvId;
/**
* <p>
* 是否必填:是
* 描述:开始日期, 如:2021-01-01
* </p>
*/
private String StartDate;
/**
* <p>
* 是否必填:是
* 描述:结束日期, 如2021-01-07
* </p>
*/
private String EndDate;
/**
* <p>
* 是否必填:否
* 描述:电话号码
* </p>
*/
private String Mobile;
/**
* <p>
* 是否必填:否
* 描述:查询ID
* </p>
*/
private String QueryId;
/**
* <p>
* 是否必填:否
* 描述:页码(1开始)
* </p>
*/
private int PageNumber;
/**
* <p>
* 是否必填:否
* 描述:每页条目数
* </p>
*/
private int PageSize;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getEnvId() {
return EnvId;
}
public void setEnvId(String envId) {
EnvId = envId;
}
public String getStartDate() {
return StartDate;
}
public void setStartDate(String startDate) {
StartDate = startDate;
}
public String getEndDate() {
return EndDate;
}
public void setEndDate(String endDate) {
EndDate = endDate;
}
public String getMobile() {
return Mobile;
}
public void setMobile(String mobile) {
Mobile = mobile;
}
public String getQueryId() {
return QueryId;
}
public void setQueryId(String queryId) {
QueryId = queryId;
}
public int getPageNumber() {
return PageNumber;
}
public void setPageNumber(int pageNumber) {
PageNumber = pageNumber;
}
public int getPageSize() {
return PageSize;
}
public void setPageSize(int pageSize) {
PageSize = pageSize;
}
}
package com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords;
import com.yanzuoguang.wxxcx.cloudbase.vo.SmsRecords;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
import java.util.List;
/***
* 返回的 JSON 数据包
*
* @author:heyanou
*/
public class WxDescribeSmsRecordsDataRes extends WxXcxResponseBaseError {
/***
* <p>发送记录列表</p>
*/
private List<SmsRecords> SmsRecords;
/***
* <p>记录总数</p>
*/
private int TotalCount;
/***
* <p>唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。</p>
*/
private String RequestId;
public List<SmsRecords> getSmsRecords() {
return SmsRecords;
}
public void setSmsRecords(List<SmsRecords> smsRecords) {
SmsRecords = smsRecords;
}
public int getTotalCount() {
return TotalCount;
}
public void setTotalCount(int totalCount) {
TotalCount = totalCount;
}
public String getRequestId() {
return RequestId;
}
public void setRequestId(String requestId) {
RequestId = requestId;
}
}
package com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.base.*;
/***
* 广告请求
*
* @author:heyanou
*/
public class WxDescribeSmsRecordsRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxDescribeSmsRecordsDataReq req;
public WxDescribeSmsRecordsRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxDescribeSmsRecordsDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getCloudbaseDescribesmsrecordsDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxDescribeSmsRecordsDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxDescribeSmsRecordsDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxDescribeSmsRecordsDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
云开发 /describeSmsRecords
# cloudbase.describeSmsRecords
> 本接口应在服务器端调用,详细说明参见[服务端API](https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/backend-api.html)。
> 本接口支持[云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)。需开发者工具版本 >= `1.02.1904090`(最新[稳定版下载](https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html)),`wx-server-sdk` >= `0.4.0`
查询 2 个月内的短信记录
调用方式:
- [HTTPS 调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.describeSmsRecords.html#method-http)
- [云调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.describeSmsRecords.html#method-cloud)
## HTTPS 调用
### 请求地址
```text
POST https://api.weixin.qq.com/tcb/describesmsrecords?access_token=TOKEN
```
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------------------------------------ | :----- | :----- | :--- | :----------------------------------------------------------- |
| access_token / cloudbase_access_token | string | | 是 | [接口调用凭证](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html) |
| EnvId | string | | 是 | [环境 ID](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/quickstart.html#_2-开通云开发、创建环境) |
| StartDate | string | | 是 | 开始日期, 如:2021-01-01 |
| EndDate | string | | 是 | 结束日期, 如2021-01-07 |
| Mobile | string | | 否 | 电话号码 |
| QueryId | string | | 否 | 查询ID |
| PageNumber | number | | 否 | 页码(1开始) |
| PageSize | number | | 否 | 每页条目数 |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :--------- | :------------- | :----------------------------------------------------------- |
| errcode | number | 错误码 |
| errmsg | string | 错误信息 |
| SmsRecords | Array.<Object> | 发送记录列表 |
| TotalCount | number | 记录总数 |
| RequestId | string | 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 |
**errcode 的合法值**
| 值 | 说明 | 最低版本 |
| :------ | :----------------------------- | :------- |
| 0 | 请求成功 | |
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| -501007 | 参数有误,具体原因参考 errmsg | |
**SmsRecords 的结构**
| 属性 | 类型 | 说明 |
| :----------- | :----- | :---------------------- |
| Mobile | string | 手机号码 |
| Content | string | 短信内容 |
| ContentSize | number | 短信内容长度 |
| Fee | number | 计费条数 |
| CreateTime | string | 发送时间 |
| ReceivedTime | string | 用户接收时间 |
| Status | string | sent(成功), error(失败) |
| Remarks | string | 备注 |
### 请求数据示例
```json
{
"PostData": {
"StartDate":"2021-03-01",
"EndDate":"2021-03-23",
"EnvId":"xxx",
"QueryId":"xxx",
"PageNumber":1,
"PageSize":20
}
}
```
### 返回数据示例
```json
{
"Response":{
"SmsRecords":[
{
"Content":"【XXX】XXX,跳转小程序 https://xxx/xxx 回 T 退订",
"ContentSize":51,
"CreateTime":"2021-03-22 17:18:37",
"Fee":1,
"Mobile":"+86xxxxxxxxxxx",
"ReceivedTime":"2021-03-22 17:18:43",
"Remarks":"用户短信接收成功",
"Status":"sent"
}
],
"TotalCount":1,
"RequestId":"bf34127a-35bd-48a2-86bb-ae583d2ff9ff"
}
}
```
## 云调用
> [云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)是微信云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 `wx-server-sdk` 使用。
### 接口方法
```js
openapi.cloudbase.describeSmsRecords
```
> 需在 `config.json` 中配置 `cloudbase.describeSmsRecords` API 的权限,[详情](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html#usage-3)
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :--------- | :----- | :----- | :--- | :----------------------------------------------------------- |
| EnvId | string | | 是 | [环境 ID](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/quickstart.html#_2-开通云开发、创建环境) |
| StartDate | string | | 是 | 开始日期, 如:2021-01-01 |
| EndDate | string | | 是 | 结束日期, 如2021-01-07 |
| Mobile | string | | 否 | 电话号码 |
| QueryId | string | | 否 | 查询ID |
| PageNumber | number | | 否 | 页码(1开始) |
| PageSize | number | | 否 | 每页条目数 |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :--------- | :------------- | :----------------------------------------------------------- |
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
| SmsRecords | Array.<Object> | 发送记录列表 |
| TotalCount | number | 记录总数 |
| RequestId | string | 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :--- | :--- | :------- |
| 0 | 成功 | |
**SmsRecords 的结构**
| 属性 | 类型 | 说明 |
| :----------- | :----- | :---------------------- |
| Mobile | string | 手机号码 |
| Content | string | 短信内容 |
| ContentSize | number | 短信内容长度 |
| Fee | number | 计费条数 |
| CreateTime | string | 发送时间 |
| ReceivedTime | string | 用户接收时间 |
| Status | string | sent(成功), error(失败) |
| Remarks | string | 备注 |
### 异常
### Object
抛出的异常
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :------ | :----------------------------- | :------- |
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| -501007 | 参数有误,具体原因参考 errmsg | |
### 请求数据示例
```js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi({ convertCase: false }).cloudbase.describeSmsRecords({
"PostData": {
"StartDate": '2021-03-01',
"EndDate": '2021-03-23',
"EnvId": 'xxx',
"QueryId": 'xxx',
"PageNumber": 1,
"PageSize": 20
}
})
return result
} catch (err) {
return err
}
}
```
### 返回数据示例
```json
{
"Response": {
"SmsRecords": [
{
"Content": "【XXX】XXX,跳转小程序 https://xxx/xxx 回 T 退订",
"ContentSize": 51,
"CreateTime": "2021-03-22 17:18:37",
"Fee": 1,
"Mobile": "+86xxxxxxxxxxx",
"ReceivedTime": "2021-03-22 17:18:43",
"Remarks": "用户短信接收成功",
"Status": "sent"
}
],
"TotalCount": 1,
"RequestId": "bf34127a-35bd-48a2-86bb-ae583d2ff9ff"
},
"errMsg": "openapi.cloudbase.describeSmsRecords:ok"
}
```
\ No newline at end of file
package com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.service;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.WxDescribeSmsRecordsDataRes;
import com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.WxDescribeSmsRecordsDataReq;
/***
* 查询 2 个月内的短信记录
*
* @author:heyanou
*/
public interface WxDescribeSmsRecordsService {
/**
*<b>查询 2 个月内的短信记录</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
public WxDescribeSmsRecordsDataRes describeSmsRecords(WxXcxAccessToken accessToken, WxDescribeSmsRecordsDataReq req);
}
package com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.service.impl;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.base.WxXcxConfig;
import com.yanzuoguang.wxxcx.base.WxXcxRequest;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataReq;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.describeExtension.WxDescribeExtensionUploadInfoDataRes;
import com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.WxDescribeSmsRecordsDataReq;
import com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.WxDescribeSmsRecordsDataRes;
import com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.WxDescribeSmsRecordsRequest;
import com.yanzuoguang.wxxcx.cloudbase.describeSmsRecords.service.WxDescribeSmsRecordsService;
import org.springframework.stereotype.Component;
/***
* 延时调用云函数
*
* @author:heyanou
*/
@Component
public class WxDescribeSmsRecordsServiceImpl implements WxDescribeSmsRecordsService {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
public WxDescribeSmsRecordsServiceImpl(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
}
/**
*<b>查询 2 个月内的短信记录</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
@Override
public WxDescribeSmsRecordsDataRes describeSmsRecords(WxXcxAccessToken accessToken, WxDescribeSmsRecordsDataReq req){
WxDescribeSmsRecordsRequest smsRecordsRequest = new WxDescribeSmsRecordsRequest(wxXcxConfig, wxXcxRequest, accessToken, req);
return smsRecordsRequest.getResponse();
}
}
package com.yanzuoguang.wxxcx.cloudbase.getVoIPSign;
/***
* 获取实时语音签名
*
* @author:heyanou
*/
public class WxGetVoIPSignDataReq {
/**
* <p>
* 是否必填:是
* 描述:用户唯一标识符
* </p>
*/
private String openid;
/**
* <p>
* 是否必填:是
* 描述:接口调用凭证
* </p>
*/
private String access_token;
/**
* <p>
* 是否必填:是
* 描述:游戏房间的标识
* </p>
*/
private String group_id;
/**
* <p>
* 是否必填:是
* 描述:随机字符串,长度应小于 128
* </p>
*/
private String nonce;
/**
* <p>
* 是否必填:是
* 描述:生成这个随机字符串的 UNIX 时间戳(精确到秒)
* </p>
*/
private String timestamp;
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getGroup_id() {
return group_id;
}
public void setGroup_id(String group_id) {
this.group_id = group_id;
}
public String getNonce() {
return nonce;
}
public void setNonce(String nonce) {
this.nonce = nonce;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
}
package com.yanzuoguang.wxxcx.cloudbase.getVoIPSign;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.base.*;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxGetVoIPSignDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxGetVoIPSignDataReq req;
public WxGetVoIPSignDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxGetVoIPSignDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getCloudbaseGetVoIPSignDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxGetVoIPSignDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxGetVoIPSignDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxGetVoIPSignDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.cloudbase.getVoIPSign;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
import java.util.List;
/***
* 返回的 JSON 数据包
*
* @author:heyanou
*/
public class WxGetVoIPSignDataRes extends WxXcxResponseBaseError {
/***
* <p>签名</p>
*/
private String signature;
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
}
云开发 /getVoIPSign
# cloudbase.getVoIPSign
> 本接口应在服务器端调用,详细说明参见[服务端API](https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/backend-api.html)。
> 本接口支持[云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)。需开发者工具版本 >= `1.02.1904090`(最新[稳定版下载](https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html)),`wx-server-sdk` >= `0.4.0`
获取实时语音签名
调用方式:
- [HTTPS 调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.getVoIPSign.html#method-http)
- [云调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.getVoIPSign.html#method-cloud)
## HTTPS 调用
### 请求地址
```text
POST https://api.weixin.qq.com/wxa/getvoipsign?openid=OPENID&access_token=TOKEN
```
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------------------------------------ | :----- | :----- | :--- | :----------------------------------------------------------- |
| openid | string | | 是 | 用户唯一标识符 |
| access_token / cloudbase_access_token | string | | 是 | [接口调用凭证](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html) |
| group_id | string | | 是 | 游戏房间的标识 |
| nonce | string | | 是 | 随机字符串,长度应小于 128 |
| timestamp | string | | 是 | 生成这个随机字符串的 UNIX 时间戳(精确到秒) |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :-------- | :----- | :------- |
| errcode | string | 错误码 |
| errmsg | string | 错误信息 |
| signature | string | 签名 |
### 请求数据示例
```json
{
"group_id": "xxx",
"nonce": "yyy",
"timestamp": 12312312312
}
```
### 返回数据示例
```json
{
"errcode": 0,
"errmsg": "ok",
"signature": "xxxx"
}
```
## 云调用
> [云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)是微信云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 `wx-server-sdk` 使用。
### 接口方法
```js
openapi.cloudbase.getVoIPSign
```
> 需在 `config.json` 中配置 `cloudbase.getVoIPSign` API 的权限,[详情](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html#usage-3)
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :-------- | :----- | :----- | :--- | :------------------------------------------- |
| openid | string | | 是 | 用户唯一标识符 |
| groupId | string | | 是 | 游戏房间的标识 |
| nonce | string | | 是 | 随机字符串,长度应小于 128 |
| timestamp | string | | 是 | 生成这个随机字符串的 UNIX 时间戳(精确到秒) |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :-------- | :----- | :------- |
| errCode | string | 错误码 |
| errMsg | string | 错误信息 |
| signature | string | 签名 |
### 异常
### Object
抛出的异常
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errCode | string | 错误码 |
| errMsg | string | 错误信息 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :--- | :--- | :------- |
| | | |
### 请求数据示例
```js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.cloudbase.getVoIPSign({
"nonce": 'yyy',
"timestamp": 12312312312,
"groupId": 'xxx'
})
return result
} catch (err) {
return err
}
}
```
### 返回数据示例
```json
{
"errCode": 0,
"errMsg": "openapi.cloudbase.getVoIPSign:ok",
"signature": "xxxx"
}
```
\ No newline at end of file
package com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.service;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.WxGetVoIPSignDataReq;
import com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.WxGetVoIPSignDataRes;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataReq;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataRes;
/***
* 获取实时语音签名
*
* @author:heyanou
*/
public interface WxGetVoIPSignService {
/**
*<b>获取实时语音签名</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
WxGetVoIPSignDataRes getVoIPSign(WxXcxAccessToken accessToken, WxGetVoIPSignDataReq req);
}
package com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.service.impl;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.base.WxXcxConfig;
import com.yanzuoguang.wxxcx.base.WxXcxRequest;
import com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.WxGetVoIPSignDataReq;
import com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.WxGetVoIPSignDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.WxGetVoIPSignDataRes;
import com.yanzuoguang.wxxcx.cloudbase.getVoIPSign.service.WxGetVoIPSignService;
import org.springframework.stereotype.Component;
/***
* 获取实时语音签名
*
* @author:heyanou
*/
@Component
public class WxGetVoIPSignServiceImpl implements WxGetVoIPSignService {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
public WxGetVoIPSignServiceImpl(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
}
/**
*<b>获取实时语音签名</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
@Override
public WxGetVoIPSignDataRes getVoIPSign(WxXcxAccessToken accessToken, WxGetVoIPSignDataReq req){
WxGetVoIPSignDataRequest voIPSignDataRequest = new WxGetVoIPSignDataRequest(wxXcxConfig, wxXcxRequest, accessToken, req);
return voIPSignDataRequest.getResponse();
}
}
package com.yanzuoguang.wxxcx.cloudbase.getopen;
import java.util.List;
/***
* 换取 cloudID 对应的开放数据
*
* @author:heyanou
*/
public class WxGetOpenDataReq {
/**
* <p>
* 是否必填:是
* 描述:接口调用凭证
* </p>
*/
private String access_token;
/**
* <p>
* 是否必填:是
* 描述:用户唯一标识符
* </p>
*/
private String openid;
/**
* <p>
* 是否必填:是
* 描述:CloudID 列表
* </p>
*/
private List<String> cloudid_list;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public List<String> getCloudid_list() {
return cloudid_list;
}
public void setCloudid_list(List<String> cloudid_list) {
this.cloudid_list = cloudid_list;
}
}
package com.yanzuoguang.wxxcx.cloudbase.getopen;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.base.*;
/***
* 广告请求
*
* @author:heyanou
*/
public class WxGetOpenDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxGetOpenDataReq req;
public WxGetOpenDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxGetOpenDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getCloudbaseGetopendataDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxGetOpenDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxGetOpenDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxGetOpenDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.cloudbase.getopen;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
import java.util.List;
import java.util.ArrayList;
/***
* 返回的 JSON 数据包
*
* @author:heyanou
*/
public class WxGetOpenDataRes extends WxXcxResponseBaseError {
/***
* <p>开放数据列表</p>
*/
private List<String> data_list=new ArrayList<>();
public List<String> getData_list() {
return data_list;
}
public void setData_list(List<String> data_list) {
this.data_list = data_list;
}
}
云开发 /getOpenData
# cloudbase.getOpenData
> 本接口应在服务器端调用,详细说明参见[服务端API](https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/backend-api.html)。
> 本接口支持[云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)。需开发者工具版本 >= `1.02.1904090`(最新[稳定版下载](https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html)),`wx-server-sdk` >= `0.4.0`
换取 cloudID 对应的开放数据
调用方式:
- [HTTPS 调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.getOpenData.html#method-http)
- [云调用](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/cloudbase/cloudbase.getOpenData.html#method-cloud)
## HTTPS 调用
### 请求地址
```text
POST https://api.weixin.qq.com/wxa/getopendata?openid=OPENID&access_token=TOKEN
```
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :------------------------------------ | :------------- | :----- | :--- | :----------------------------------------------------------- |
| openid | string | | 是 | 用户唯一标识符 |
| access_token / cloudbase_access_token | string | | 是 | [接口调用凭证](https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html) |
| cloudid_list | Array.<string> | | 是 | CloudID 列表 |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :-------- | :------------- | :----------- |
| errcode | number | 错误码 |
| errmsg | string | 错误信息 |
| data_list | Array.<Object> | 开放数据列表 |
**errcode 的合法值**
| 值 | 说明 | 最低版本 |
| :---- | :----------------------------- | :------- |
| 0 | 请求成功 | |
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| 40003 | openid无效 | |
### 请求数据示例
```json
{
"cloudid_list": ["xxx"]
}
```
### 返回数据示例
假设获取了微信运动数据
```json
{
"errcode": 0,
"errmsg": "ok",
"data_list": [{
"cloud_id": "xxx",
"json": {
"cloudID": "xxx",
"data": {
"stepInfoList": [{
"timestamp": 1603641600,
"step": 1234
}]
}
}
}]
}
```
## 云调用
> [云调用](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html)是微信云开发提供的在云函数中调用微信开放接口的能力,需要在云函数中通过 `wx-server-sdk` 使用。
### 接口方法
```js
openapi.cloudbase.getOpenData
```
> 需在 `config.json` 中配置 `cloudbase.getOpenData` API 的权限,[详情](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/openapi/openapi.html#usage-3)
### 请求参数
| 属性 | 类型 | 默认值 | 必填 | 说明 |
| :---------- | :------------- | :----- | :--- | :------------- |
| openid | string | | 是 | 用户唯一标识符 |
| cloudidList | Array.<string> | | 是 | CloudID 列表 |
### 返回值
### Object
返回的 JSON 数据包
| 属性 | 类型 | 说明 |
| :------- | :------------- | :----------- |
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
| dataList | Array.<Object> | 开放数据列表 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :--- | :--- | :------- |
| 0 | 成功 | |
### 异常
### Object
抛出的异常
| 属性 | 类型 | 说明 |
| :------ | :----- | :------- |
| errCode | number | 错误码 |
| errMsg | string | 错误信息 |
**errCode 的合法值**
| 值 | 说明 | 最低版本 |
| :---- | :----------------------------- | :------- |
| -1 | 系统繁忙,此时请开发者稍候再试 | |
| 40003 | openid无效 | |
### 请求数据示例
```js
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.cloudbase.getOpenData({
"cloudidList": [
"xxx"
]
})
return result
} catch (err) {
return err
}
}
```
### 返回数据示例
假设获取了微信运动数据
```json
{
"errCode": 0,
"errMsg": "openapi.cloudbase.getOpenData:ok",
"dataList": [
{
"json": {
"cloudID": "xxx",
"data": {
"stepInfoList": [
{
"timestamp": 1603641600,
"step": 1234
}
]
}
},
"cloudId": "xxx"
}
]
}
```
\ No newline at end of file
package com.yanzuoguang.wxxcx.cloudbase.getopen.service;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.cloudbase.getopen.WxGetOpenDataReq;
import com.yanzuoguang.wxxcx.cloudbase.getopen.WxGetOpenDataRes;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataReq;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataRes;
/***
* 换取 cloudID 对应的开放数据
*
* @author:heyanou
*/
public interface WxGetOpenService {
/**
*<b>查询 2 个月内的短信记录</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
WxGetOpenDataRes getOpenData(WxXcxAccessToken accessToken, WxGetOpenDataReq req);
}
package com.yanzuoguang.wxxcx.cloudbase.getopen.service.impl;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.base.WxXcxConfig;
import com.yanzuoguang.wxxcx.base.WxXcxRequest;
import com.yanzuoguang.wxxcx.cloudbase.getopen.WxGetOpenDataReq;
import com.yanzuoguang.wxxcx.cloudbase.getopen.WxGetOpenDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.getopen.WxGetOpenDataRes;
import com.yanzuoguang.wxxcx.cloudbase.getopen.service.WxGetOpenService;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataReq;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.sendSmsTask.WxCreateSendSmsTaskDataRes;
import org.springframework.stereotype.Component;
/***
* 查询 2 个月内的短信记录
*
* @author:heyanou
*/
@Component
public class WxGetOpenServiceImpl implements WxGetOpenService {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
public WxGetOpenServiceImpl(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
}
/**
*<b>查询 2 个月内的短信记录</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
@Override
public WxGetOpenDataRes getOpenData(WxXcxAccessToken accessToken, WxGetOpenDataReq req){
WxGetOpenDataRequest getOpenDataRequest = new WxGetOpenDataRequest(wxXcxConfig, wxXcxRequest, accessToken, req);
return getOpenDataRequest.getResponse();
}
}
package com.yanzuoguang.wxxcx.cloudbase.getstatistics;
import com.yanzuoguang.wxxcx.cloudbase.vo.Condition;
/***
* 获取云开发数据接口
*
* @author:heyanou
*/
public class WxGetStatisticsDataReq {
/**
* <p>
* 是否必填:是
* 描述:接口调用凭证
* </p>
*/
private String access_token;
/**
* <p>
* 是否必填:是
* 描述:获取动作,目前支持(smsMarketingOverviewData:短信营销概览数据;smsMarketingConversionData:短信营销转化数据;smsMarketingRealTimeData:短信营销实时数据)
* </p>
*/
private String action;
/**
* <p>
* 是否必填:是
* 描述:开始时间戳
* </p>
*/
private Long begin_date;
/**
* <p>
* 是否必填:是
* 描述:结束时间戳
* </p>
*/
private Long end_date;
/**
* <p>
* 是否必填:是
* 描述:分页 offset【action 取 smsMarketingOverviewData、smsMarketingConversionData 时必填】
* </p>
*/
private Integer page_offset;
/**
* <p>
* 是否必填:是
* 描述:分页 limit【action 取 smsMarketingOverviewData、smsMarketingConversionData 时必填】
* </p>
*/
private Integer page_limit;
/**
* <p>
* 是否必填:是
* 描述:查询条件
* </p>
*/
private Condition condition;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public Long getBegin_date() {
return begin_date;
}
public void setBegin_date(Long begin_date) {
this.begin_date = begin_date;
}
public Long getEnd_date() {
return end_date;
}
public void setEnd_date(Long end_date) {
this.end_date = end_date;
}
public Integer getPage_offset() {
return page_offset;
}
public void setPage_offset(Integer page_offset) {
this.page_offset = page_offset;
}
public Integer getPage_limit() {
return page_limit;
}
public void setPage_limit(Integer page_limit) {
this.page_limit = page_limit;
}
public Condition getCondition() {
return condition;
}
public void setCondition(Condition condition) {
this.condition = condition;
}
}
package com.yanzuoguang.wxxcx.cloudbase.getstatistics;
import com.alibaba.fastjson.TypeReference;
import com.yanzuoguang.util.helper.HttpHelper;
import com.yanzuoguang.util.helper.JsonHelper;
import com.yanzuoguang.wxxcx.base.*;
/***
* @description:对该类的描述(该类的功能)
*
* @author:heyanou
*/
public class WxGetStatisticsDataRequest implements WxXcxRequestUrl, WxXcxRequestUrlPara, WxXcxRequestPostFormData {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
private final WxXcxAccessToken accessToken;
private final WxGetStatisticsDataReq req;
public WxGetStatisticsDataRequest(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest, WxXcxAccessToken accessToken, WxGetStatisticsDataReq req) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
this.accessToken = accessToken;
this.req = req;
}
@Override
public String getPost() {
return HttpHelper.getUrlParameter(req);
}
@Override
public String getUrlPara() {
return HttpHelper.getUrlParameter(accessToken);
}
@Override
public String getUrl() {
return wxXcxConfig.getBaseUrl() + wxXcxConfig.getCloudbaseGetStatisticsDataUrl() + "?" + this.getUrlPara();
}
/***
* <b>response返回结果集检测</b>
* @return 返回类对象
*/
public WxGetStatisticsDataRes getResponse() {
// todo: 检测参数是否合法
return this.wxXcxRequest.request(this, response -> {
WxGetStatisticsDataRes ret = JsonHelper.deserialize(response, new TypeReference<WxGetStatisticsDataRes>() {
});
WxXcxAssert.assertBaseError(ret);
return ret;
});
}
}
package com.yanzuoguang.wxxcx.cloudbase.getstatistics;
import com.yanzuoguang.wxxcx.cloudbase.vo.DataColumn;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
import java.util.List;
/***
* 返回的 JSON 数据包
*
* @author:heyanou
*/
public class WxGetStatisticsDataRes extends WxXcxResponseBaseError {
/***
* <p>环境 ID</p>
*/
private String env_id;
/***
* <p>活动 ID</p>
*/
private String activity_id;
/***
* <p>是否按渠道划分(0:返回概览数据;1:返回各个渠道的数据,可以用于饼图)【action 取 smsMarketingOverviewData 时必填】</p>
*/
private String by_channel_id;
/***
* <p>渠道 ID(云开发 CMS 使用 _cms_sms_)【action 取 smsMarketingConversionData、smsMarketingRealTimeData 时必填】</p>
*/
private String channel_id;
/***
* <p>行为数据(h5:打开 H5;wxapp:跳转小程序)【action == smsMarketingRealTimeData 时必填】</p>
*/
private String act_type;
/***
* <p>数据列定义</p>
*/
private List<DataColumn> data_column;
/***
* <p>数据行</p>
*/
private List<String> data_value;
/***
* <p>总行数</p>
*/
private int total_num;
public String getEnv_id() {
return env_id;
}
public void setEnv_id(String env_id) {
this.env_id = env_id;
}
public String getActivity_id() {
return activity_id;
}
public void setActivity_id(String activity_id) {
this.activity_id = activity_id;
}
public String getBy_channel_id() {
return by_channel_id;
}
public void setBy_channel_id(String by_channel_id) {
this.by_channel_id = by_channel_id;
}
public String getChannel_id() {
return channel_id;
}
public void setChannel_id(String channel_id) {
this.channel_id = channel_id;
}
public String getAct_type() {
return act_type;
}
public void setAct_type(String act_type) {
this.act_type = act_type;
}
public List<DataColumn> getData_column() {
return data_column;
}
public void setData_column(List<DataColumn> data_column) {
this.data_column = data_column;
}
public List<String> getData_value() {
return data_value;
}
public void setData_value(List<String> data_value) {
this.data_value = data_value;
}
public int getTotal_num() {
return total_num;
}
public void setTotal_num(int total_num) {
this.total_num = total_num;
}
}
package com.yanzuoguang.wxxcx.cloudbase.getstatistics.service;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.cloudbase.getstatistics.WxGetStatisticsDataReq;
import com.yanzuoguang.wxxcx.cloudbase.getstatistics.WxGetStatisticsDataRes;
/***
* 获取云开发数据接口
*
* @author:heyanou
*/
public interface WxGetStatisticsService {
/**
*<b>获取云开发数据接口</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
WxGetStatisticsDataRes getStatistics(WxXcxAccessToken accessToken, WxGetStatisticsDataReq req);
}
package com.yanzuoguang.wxxcx.cloudbase.getstatistics.service.impl;
import com.yanzuoguang.wxxcx.base.WxXcxAccessToken;
import com.yanzuoguang.wxxcx.base.WxXcxConfig;
import com.yanzuoguang.wxxcx.base.WxXcxRequest;
import com.yanzuoguang.wxxcx.cloudbase.getstatistics.WxGetStatisticsDataRequest;
import com.yanzuoguang.wxxcx.cloudbase.getstatistics.service.WxGetStatisticsService;
import org.springframework.stereotype.Component;
import com.yanzuoguang.wxxcx.cloudbase.getstatistics.WxGetStatisticsDataReq;
import com.yanzuoguang.wxxcx.cloudbase.getstatistics.WxGetStatisticsDataRes;
/***
* 获取云开发数据接口
*
* @author:heyanou
*/
@Component
public class WxGetStatisticsServiceImpl implements WxGetStatisticsService {
private final WxXcxConfig wxXcxConfig;
private final WxXcxRequest wxXcxRequest;
public WxGetStatisticsServiceImpl(WxXcxConfig wxXcxConfig, WxXcxRequest wxXcxRequest) {
this.wxXcxConfig = wxXcxConfig;
this.wxXcxRequest = wxXcxRequest;
}
/**
*<b>获取云开发数据接口</b>
* @param accessToken 传输带的指令牌
* @param req 请求数据
* @return 返回结果集
*/
@Override
public WxGetStatisticsDataRes getStatistics(WxXcxAccessToken accessToken, WxGetStatisticsDataReq req){
WxGetStatisticsDataRequest statisticsDataRequest = new WxGetStatisticsDataRequest(wxXcxConfig, wxXcxRequest, accessToken, req);
return statisticsDataRequest.getResponse();
}
}
package com.yanzuoguang.wxxcx.cloudbase.report;
import com.yanzuoguang.wxxcx.base.WxXcxResponseBaseError;
/***
* 返回结果
*
* @author:heyanou
*/
public class WxReportDataRes extends WxXcxResponseBaseError {
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment