Commit b7bfbfe9 authored by yanzg's avatar yanzg

Merge remote-tracking branch 'origin/master'

parents 7546b302 12e8c6a1

Too many changes to show.

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

...@@ -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>
......
...@@ -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();
}
/** /**
* 下载文件 * 下载文件
* *
......
...@@ -5,23 +5,41 @@ import java.util.HashMap; ...@@ -5,23 +5,41 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/**
* 映射处理
*
* @author 颜佐光
*/
public class MapHelper { public class MapHelper {
/** /**
* 将一个对象列表转换为HashMap * 将一个对象列表转换为HashMap
* *
* @param list 需要转换的列表 * @param list 需要转换的列表
* @param <T> * @param <T> 泛型
* @return * @return 泛型处理
*/ */
public static <T extends MapKey> Map<String, T> getMap(List<T> list) { public static <T extends MapKey<T>> Map<String, T> getMap(List<T> list) {
Map<String, T> map = new HashMap<>(); return getMap(list, (item) -> item.getKey(item));
if (list != null) { }
/**
* 将一个对象列表转换为HashMap
*
* @param list 需要转换的列表
* @param proxy 获取主键的函数
* @param <T> 泛型
* @return 泛型处理
*/
public static <T extends Object> Map<String, T> getMap(List<T> list, MapKey<T> proxy) {
if (list == null) {
return new HashMap<>(0);
}
Map<String, T> map = new HashMap<>(list.size());
for (T item : list) { for (T item : list) {
String key = item.getKey(item); String key = proxy.getKey(item);
map.put(key, item); map.put(key, item);
} }
}
return map; return map;
} }
...@@ -30,17 +48,19 @@ public class MapHelper { ...@@ -30,17 +48,19 @@ public class MapHelper {
* *
* @param list 需要转换的列表 * @param list 需要转换的列表
* @param proxy 获取主键的函数 * @param proxy 获取主键的函数
* @param <T> * @param <T> 类型
* @return * @param <M> 关键字类型
* @return 映射结果
*/ */
public static <T extends Object> Map<String, T> getMap(List<T> list, MapKey<T> proxy) { public static <T, M> Map<M, T> getMapType(List<T> list, MapKeyType<T, M> proxy) {
Map<String, T> map = new HashMap<>(); if (list == null) {
if (list != null) { return new HashMap<>(0);
}
Map<M, T> map = new HashMap<>(list.size());
for (T item : list) { for (T item : list) {
String key = proxy.getKey(item); M key = proxy.getKey(item);
map.put(key, item); map.put(key, item);
} }
}
return map; return map;
} }
...@@ -48,19 +68,20 @@ public class MapHelper { ...@@ -48,19 +68,20 @@ public class MapHelper {
* 将一个对象列表转换为HashMap * 将一个对象列表转换为HashMap
* *
* @param list 需要转换的列表 * @param list 需要转换的列表
* @param <T> * @param <T> 泛型
* @return * @return 泛型处理
*/ */
public static <T extends MapKey> List<String> getKeys(List<T> list) { public static <T extends MapKey<T>> List<String> getKeys(List<T> list) {
List<String> to = new ArrayList<>(); if (list == null) {
if (list != null) { return new ArrayList<>();
}
List<String> to = new ArrayList<>(list.size());
for (T item : list) { for (T item : list) {
String key = item.getKey(item); String key = item.getKey(item);
if (!to.contains(key)) { if (!to.contains(key)) {
to.add(key); to.add(key);
} }
} }
}
return to; return to;
} }
...@@ -69,8 +90,8 @@ public class MapHelper { ...@@ -69,8 +90,8 @@ public class MapHelper {
* *
* @param list 需要转换的列表 * @param list 需要转换的列表
* @param proxy 获取主键的函数 * @param proxy 获取主键的函数
* @param <T> * @param <T> 泛型
* @return * @return 泛型处理
*/ */
public static <T extends Object> List<String> getKeys(List<T> list, MapKey<T> proxy) { public static <T extends Object> List<String> getKeys(List<T> list, MapKey<T> proxy) {
List<String> to = new ArrayList<>(); List<String> to = new ArrayList<>();
...@@ -85,24 +106,15 @@ public class MapHelper { ...@@ -85,24 +106,15 @@ public class MapHelper {
return to; return to;
} }
/**
* 一个获取对象关键字的处理函数
*
* @param <T>
*/
public interface MapKey<T> {
String getKey(T from);
}
/** /**
* 将建添加到子数组中 * 将建添加到子数组中
* *
* @param mapList * @param mapList 列表
* @param key * @param key 关键字
* @param item * @param item 对象
* @param <T> * @param <T> 关键字类型
* @param <M> * @param <M> 关键字对象
* @return * @return 最终结果
*/ */
public static <T, M> List<M> addMapList(Map<T, List<M>> mapList, T key, M item) { public static <T, M> List<M> addMapList(Map<T, List<M>> mapList, T key, M item) {
if (!mapList.containsKey(key)) { if (!mapList.containsKey(key)) {
...@@ -112,4 +124,28 @@ public class MapHelper { ...@@ -112,4 +124,28 @@ public class MapHelper {
ret.add(item); ret.add(item);
return ret; return ret;
} }
/**
* 一个获取对象关键字的处理函数
*
* @param <T> 泛型
*/
public interface MapKey<T> extends MapKeyType<T, String> {
}
/**
* 一个获取对象关键字的处理函数
*
* @param <T> 泛型
* @param <M> 泛型
*/
public interface MapKeyType<T, M> {
/**
* 获取关键字
*
* @param from 来源数据
* @return 关键字
*/
M getKey(T from);
}
} }
...@@ -5,9 +5,11 @@ import com.yanzuoguang.util.base.ObjectHelper; ...@@ -5,9 +5,11 @@ import com.yanzuoguang.util.base.ObjectHelper;
import com.yanzuoguang.util.exception.ExceptionHelper; import com.yanzuoguang.util.exception.ExceptionHelper;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
...@@ -444,7 +446,16 @@ public class StringHelper { ...@@ -444,7 +446,16 @@ public class StringHelper {
} }
} }
private static boolean isBaseType(String clsName, Class<?> cls, Class<?> fromCls, Object fromValue) { /**
* 是否属于基础类型
*
* @param clsName 基础类型名称
* @param cls 基础类型
* @param fromCls 来源类型
* @param fromValue 基础类型值
* @return 是否属于基础类型
*/
public static boolean isBaseType(String clsName, Class<?> cls, Class<?> fromCls, Object fromValue) {
if (clsName.equals(fromCls.getName())) { if (clsName.equals(fromCls.getName())) {
return true; return true;
} }
...@@ -461,9 +472,34 @@ public class StringHelper { ...@@ -461,9 +472,34 @@ public class StringHelper {
* @return 转换成功的字符串 * @return 转换成功的字符串
*/ */
public static String toString(Object obj) { public static String toString(Object obj) {
Class<?> fromCls = obj != null ? obj.getClass() : Object.class;
boolean isDouble = StringHelper.isBaseType(StringHelper.TYPE_DOUBLE, Double.class, fromCls, obj);
boolean isFromDouble = obj instanceof BigDecimal || isDouble;
if (isFromDouble) {
// 格式化设置(显示所有整数部分,小数点保留2位)
DecimalFormat decimalFormat = new DecimalFormat("#.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
String to = decimalFormat.format(obj);
String[] split = to.split("\\.");
StringBuilder sb = new StringBuilder(split[0]);
if (sb.length() == 0) {
sb.append("0");
}
if (split.length > 1) {
// 去掉右边的0
String right = StringHelper.trimRight(split[1], "0");
if (!right.isEmpty()) {
sb.append(".");
sb.append(right);
}
}
return sb.toString();
} else {
return obj == null ? null : obj.toString(); return obj == null ? null : obj.toString();
} }
}
/** /**
* 将字符串转换为 bool ,当不能转换时,则默认为false * 将字符串转换为 bool ,当不能转换时,则默认为false
* *
......
...@@ -4,10 +4,7 @@ import com.yanzuoguang.util.log.Log; ...@@ -4,10 +4,7 @@ import com.yanzuoguang.util.log.Log;
import com.yanzuoguang.util.thread.ThreadHelper; import com.yanzuoguang.util.thread.ThreadHelper;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
/** /**
...@@ -19,8 +16,7 @@ public class YzgTimeout { ...@@ -19,8 +16,7 @@ public class YzgTimeout {
public static final int TIME_OUT_DEFAULT = 15 * 1000; public static final int TIME_OUT_DEFAULT = 15 * 1000;
public static final int TIME_OUT_TIP = 10 * 1000; public static final int TIME_OUT_TIP = 10 * 1000;
private static ExecutorService executorService; private static Queue<TimeInfo> queueInfos = null;
private static final Queue<TimeInfo> queueInfos = new ArrayBlockingQueue<>(500);
/** /**
...@@ -74,53 +70,73 @@ public class YzgTimeout { ...@@ -74,53 +70,73 @@ public class YzgTimeout {
try { try {
runnable.run(); runnable.run();
} finally { } finally {
synchronized (timeInfo) {
timeInfo.setRun(true); timeInfo.setRun(true);
} }
} }
}
private static TimeInfo getTimeInfo(int tipOutDefault, int timeOutTip, YzgTimeoutHeart heart) { private static TimeInfo getTimeInfo(int tipOutDefault, int timeOutTip, YzgTimeoutHeart heart) {
init(); init();
TimeInfo timeInfo = new TimeInfo(tipOutDefault, timeOutTip, heart); TimeInfo timeInfo = new TimeInfo(tipOutDefault, timeOutTip, heart);
synchronized (queueInfos) {
queueInfos.add(timeInfo); queueInfos.add(timeInfo);
}
return timeInfo; return timeInfo;
} }
private static void init() { private static void init() {
synchronized (YzgTimeout.class) { if (queueInfos != null) {
if (executorService == null) { return;
executorService = new ThreadPoolExecutor(1, 10, 1000,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
} }
synchronized (YzgTimeout.class) {
if (queueInfos != null) {
return;
} }
queueInfos = new ConcurrentLinkedQueue<>();
ThreadHelper.runThread(() -> { ThreadHelper.runThread(() -> {
while (true) { while (true) {
try {
runItem(); runItem();
ThreadHelper.sleep(1000); } catch (Exception ex) {
ex.printStackTrace();
}
ThreadHelper.sleep(200);
} }
}); });
} }
}
private static void runItem() { private static void runItem() {
int size = queueInfos.size(); int size;
synchronized (queueInfos) {
size = queueInfos.size();
}
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
TimeInfo poll = queueInfos.poll(); TimeInfo poll;
synchronized (queueInfos) {
poll = queueInfos.poll();
}
if (poll == null) {
return;
}
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
long time = end - poll.getStart(); long time = end - poll.getStart();
if (time > poll.getTimeMax()) { if (time > poll.getTimeMax()) {
try { try {
poll.setTimeMax(poll.getTimeMax() + poll.getTimeOutTip()); poll.setTimeMax(poll.getTimeMax() + poll.getTimeOutTip());
executorService.submit(() -> poll.getHeart().heart(time)); ThreadHelper.runThread(() -> poll.getHeart().heart(time));
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
if (!poll.isRun()) { if (!poll.isRun()) {
synchronized (queueInfos) {
queueInfos.add(poll); queueInfos.add(poll);
} }
} }
} }
}
} }
class TimeInfo { class TimeInfo {
......
...@@ -4,8 +4,7 @@ import com.yanzuoguang.util.exception.ExceptionHelper; ...@@ -4,8 +4,7 @@ import com.yanzuoguang.util.exception.ExceptionHelper;
import com.yanzuoguang.util.helper.DateHelper; import com.yanzuoguang.util.helper.DateHelper;
import java.util.Date; import java.util.Date;
import java.util.concurrent.ExecutorService; import java.util.concurrent.*;
import java.util.concurrent.Executors;
import java.util.function.Predicate; import java.util.function.Predicate;
/** /**
...@@ -98,10 +97,7 @@ public class ThreadHelper { ...@@ -98,10 +97,7 @@ public class ThreadHelper {
* 监控线程的方法,防止线程执行死机 * 监控线程的方法,防止线程执行死机
*/ */
private static void startMonitor() { private static void startMonitor() {
runThread(new Runnable() { runThread(() -> {
@Override
public void run() {
do { do {
if (threadIsRun && ((System.currentTimeMillis() - threadDate.getTime()) / SECOND_UNIT) > NEXT_SECOND) { if (threadIsRun && ((System.currentTimeMillis() - threadDate.getTime()) / SECOND_UNIT) > NEXT_SECOND) {
try { try {
...@@ -116,7 +112,6 @@ public class ThreadHelper { ...@@ -116,7 +112,6 @@ public class ThreadHelper {
} }
sleep(1000 * 60); sleep(1000 * 60);
} while (true); } while (true);
}
}); });
} }
...@@ -210,12 +205,7 @@ public class ThreadHelper { ...@@ -210,12 +205,7 @@ public class ThreadHelper {
* @param run * @param run
*/ */
public static void runThread(final Runnable run) { public static void runThread(final Runnable run) {
executeService.execute(new Runnable() { executeService.execute(() -> executeCatch(run));
@Override
public void run() {
executeCatch(run);
}
});
} }
/** /**
...@@ -224,9 +214,7 @@ public class ThreadHelper { ...@@ -224,9 +214,7 @@ public class ThreadHelper {
* @param run * @param run
*/ */
public static void runThread(final RunInterval run) { public static void runThread(final RunInterval run) {
runThread(new Runnable() { runThread(() -> {
@Override
public void run() {
while (!run.isBreakFlag()) { while (!run.isBreakFlag()) {
try { try {
run.getCode().run(); run.getCode().run();
...@@ -235,7 +223,6 @@ public class ThreadHelper { ...@@ -235,7 +223,6 @@ public class ThreadHelper {
} }
sleep(run.getTime()); sleep(run.getTime());
} }
}
}); });
} }
......
...@@ -11,7 +11,7 @@ package com.yanzuoguang.util.vo; ...@@ -11,7 +11,7 @@ package com.yanzuoguang.util.vo;
* @author 颜佐光 * @author 颜佐光
*/ */
public class Ref<T> extends BaseVo { public class Ref<T> extends BaseVo {
public T value; public volatile T value;
public Ref(T value) { public Ref(T value) {
this.value = value; this.value = value;
......
...@@ -44,7 +44,7 @@ public class ResponseResult<T> extends BaseVo { ...@@ -44,7 +44,7 @@ public class ResponseResult<T> extends BaseVo {
* 是否是code错误 * 是否是code错误
*/ */
@ApiModelProperty(value = "异常数据", notes = "当抛出异常时的数据,通常和code进行组合", required = true) @ApiModelProperty(value = "异常数据", notes = "当抛出异常时的数据,通常和code进行组合", required = true)
private boolean codeError = false; private boolean codeError = true;
/** /**
* 构造函数 * 构造函数
......
...@@ -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")));
}
} }
...@@ -6,17 +6,24 @@ import org.junit.Test; ...@@ -6,17 +6,24 @@ import org.junit.Test;
public class TestTimeout { public class TestTimeout {
public static final int WAIT_TIME = 1 * 60 * 1000;
@Test @Test
public void test() { public void test() {
YzgTimeout.timeOut(TestTimeout.class, "消息", new Runnable() { YzgTimeout.timeOut(TestTimeout.class, "消息", () -> {
@Override
public void run() {
System.out.println("开始运行"); System.out.println("开始运行");
ThreadHelper.sleep(1 * 60 * 1000); ThreadHelper.sleep(WAIT_TIME);
System.out.println("结束运行"); System.out.println("结束运行");
}
}, (time) -> { }, (time) -> {
// System.err.println("已经等待" + time); // System.err.println("已经等待" + time);
}); });
} }
@Test
public void testQueue() {
for (int i = 0; i < 5000; i++) {
ThreadHelper.runThread(() -> test());
}
ThreadHelper.sleep(WAIT_TIME * 2);
}
} }
...@@ -51,7 +51,7 @@ public class DbExecuteImpl implements DbExecute { ...@@ -51,7 +51,7 @@ public class DbExecuteImpl implements DbExecute {
SqlInfo sqlInfo = new SqlInfo(targetClass, sqlName, sql, paras); SqlInfo sqlInfo = new SqlInfo(targetClass, sqlName, sql, paras);
Ref<Integer> ret = new Ref<>(0); Ref<Integer> ret = new Ref<>(0);
executeSql(sqlInfo, (row, start) -> executeSql(sqlInfo, (row, start) ->
ret.value = getJdbc().update(sqlInfo.getSql(), sqlInfo.getParas()) row.value = ret.value = getJdbc().update(sqlInfo.getSql(), sqlInfo.getParas())
); );
return ret.value; return ret.value;
} }
......
...@@ -48,9 +48,8 @@ public class MessageDaoImpl extends BaseDaoImpl implements MessageDao, Initializ ...@@ -48,9 +48,8 @@ public class MessageDaoImpl extends BaseDaoImpl implements MessageDao, Initializ
.add("batchId", "AND a.batchId=?") .add("batchId", "AND a.batchId=?")
; ;
table.add(UPDATE_BATCH_SQL, "UPDATE Queue_Message AS a " + table.add(UPDATE_BATCH_SQL, "UPDATE (SELECT * FROM Queue_Message WHERE (HandleTime IS NULL OR HandleTime < NOW()) ORDER BY HandleTime ASC,MessageId ASC {LIMIT} ) AS b " +
"INNER JOIN ( SELECT * FROM Queue_Message WHERE (HandleTime IS NULL OR HandleTime < NOW()) " + "INNER JOIN Queue_Message AS a ON a.MessageId = b.MessageId " +
"ORDER BY HandleTime ASC,MessageId ASC {LIMIT} ) AS b ON a.MessageId = b.MessageId " +
"SET a.BatchId = ?,a.HandleTime=DATE_ADD(NOW(),INTERVAL 5 MINUTE) ", "batchId"); "SET a.BatchId = ?,a.HandleTime=DATE_ADD(NOW(),INTERVAL 5 MINUTE) ", "batchId");
} }
......
<?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.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.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);
}
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