@@ -22,6 +22,11 @@ public interface WxMaService { | |||||
*/ | */ | ||||
String GET_PAID_UNION_ID_URL = "https://api.weixin.qq.com/wxa/getpaidunionid"; | String GET_PAID_UNION_ID_URL = "https://api.weixin.qq.com/wxa/getpaidunionid"; | ||||
/** | |||||
* 导入抽样数据 | |||||
*/ | |||||
String SET_DYNAMIC_DATA_URL = "https://api.weixin.qq.com/wxa/setdynamicdata"; | |||||
/** | /** | ||||
* 获取登录后的session信息. | * 获取登录后的session信息. | ||||
* | * | ||||
@@ -29,6 +34,22 @@ public interface WxMaService { | |||||
*/ | */ | ||||
WxMaJscode2SessionResult jsCode2SessionInfo(String jsCode) throws WxErrorException; | WxMaJscode2SessionResult jsCode2SessionInfo(String jsCode) throws WxErrorException; | ||||
/** | |||||
* 导入抽样数据 | |||||
* <pre> | |||||
* 第三方通过调用微信API,将数据写入到setdynamicdata这个API。每个Post数据包不超过5K,若数据过多可开多进(线)程并发导入数据(例如:数据量为十万量级可以开50个线程并行导数据)。 | |||||
* 文档地址:https://wsad.weixin.qq.com/wsad/zh_CN/htmledition/widget-docs-v3/html/custom/quickstart/implement/import/index.html | |||||
* http请求方式:POST http(s)://api.weixin.qq.com/wxa/setdynamicdata?access_token=ACCESS_TOKEN | |||||
* </pre> | |||||
* | |||||
* @param data 推送到微信后台的数据列表,该数据被微信用于流量分配,注意该字段为string类型而不是object | |||||
* @param lifespan 数据有效时间,秒为单位,一般为86400,一天一次导入的频率 | |||||
* @param scene 1代表用于搜索的数据 | |||||
* @param type 用于标识数据所属的服务类目 | |||||
* @throws WxErrorException . | |||||
*/ | |||||
void setDynamicData(int lifespan, String type, int scene, String data) throws WxErrorException; | |||||
/** | /** | ||||
* <pre> | * <pre> | ||||
* 验证消息的确来自微信服务器. | * 验证消息的确来自微信服务器. | ||||
@@ -73,6 +94,8 @@ public interface WxMaService { | |||||
* @param transactionId 非必填 微信支付订单号 | * @param transactionId 非必填 微信支付订单号 | ||||
* @param mchId 非必填 微信支付分配的商户号,和商户订单号配合使用 | * @param mchId 非必填 微信支付分配的商户号,和商户订单号配合使用 | ||||
* @param outTradeNo 非必填 微信支付商户订单号,和商户号配合使用 | * @param outTradeNo 非必填 微信支付商户订单号,和商户号配合使用 | ||||
* @return UnionId. | |||||
* @throws WxErrorException . | |||||
*/ | */ | ||||
String getPaidUnionId(String openid, String transactionId, String mchId, String outTradeNo) throws WxErrorException; | String getPaidUnionId(String openid, String transactionId, String mchId, String outTradeNo) throws WxErrorException; | ||||
@@ -97,6 +120,13 @@ public interface WxMaService { | |||||
* 比{@link #get}和{@link #post}方法更灵活,可以自己构造RequestExecutor用来处理不同的参数和不同的返回类型。 | * 比{@link #get}和{@link #post}方法更灵活,可以自己构造RequestExecutor用来处理不同的参数和不同的返回类型。 | ||||
* 可以参考,{@link MediaUploadRequestExecutor}的实现方法 | * 可以参考,{@link MediaUploadRequestExecutor}的实现方法 | ||||
* </pre> | * </pre> | ||||
* | |||||
* @param <E> . | |||||
* @param <T> . | |||||
* @param data 参数或请求数据 | |||||
* @param executor 执行器 | |||||
* @param uri 接口请求地址 | |||||
* @return . | |||||
*/ | */ | ||||
<T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException; | <T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException; | ||||
@@ -105,6 +135,8 @@ public interface WxMaService { | |||||
* 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试. | * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试. | ||||
* 默认:1000ms | * 默认:1000ms | ||||
* </pre> | * </pre> | ||||
* | |||||
* @param retrySleepMillis 重试等待毫秒数 | |||||
*/ | */ | ||||
void setRetrySleepMillis(int retrySleepMillis); | void setRetrySleepMillis(int retrySleepMillis); | ||||
@@ -113,6 +145,8 @@ public interface WxMaService { | |||||
* 设置当微信系统响应系统繁忙时,最大重试次数. | * 设置当微信系统响应系统繁忙时,最大重试次数. | ||||
* 默认:5次 | * 默认:5次 | ||||
* </pre> | * </pre> | ||||
* | |||||
* @param maxRetryTimes 最大重试次数 | |||||
*/ | */ | ||||
void setMaxRetryTimes(int maxRetryTimes); | void setMaxRetryTimes(int maxRetryTimes); | ||||
@@ -125,6 +159,8 @@ public interface WxMaService { | |||||
/** | /** | ||||
* 注入 {@link WxMaConfig} 的实现. | * 注入 {@link WxMaConfig} 的实现. | ||||
* | |||||
* @param wxConfigProvider config | |||||
*/ | */ | ||||
void setWxMaConfig(WxMaConfig wxConfigProvider); | void setWxMaConfig(WxMaConfig wxConfigProvider); | ||||
@@ -233,18 +269,22 @@ public interface WxMaService { | |||||
/** | /** | ||||
* 请求http请求相关信息. | * 请求http请求相关信息. | ||||
* | |||||
* @return . | |||||
*/ | */ | ||||
RequestHttp getRequestHttp(); | RequestHttp getRequestHttp(); | ||||
/** | /** | ||||
* 获取物流助手接口服务对象 | * 获取物流助手接口服务对象 | ||||
* | * | ||||
* @return | |||||
* @return . | |||||
*/ | */ | ||||
WxMaExpressService getExpressService(); | WxMaExpressService getExpressService(); | ||||
/** | /** | ||||
* 获取云开发接口服务对象 | * 获取云开发接口服务对象 | ||||
* | |||||
* @return . | |||||
*/ | */ | ||||
WxMaCloudService getCloudService(); | WxMaCloudService getCloudService(); | ||||
} | } |
@@ -4,7 +4,9 @@ import cn.binarywang.wx.miniapp.api.*; | |||||
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | ||||
import cn.binarywang.wx.miniapp.config.WxMaConfig; | import cn.binarywang.wx.miniapp.config.WxMaConfig; | ||||
import com.google.common.base.Joiner; | import com.google.common.base.Joiner; | ||||
import com.google.common.collect.ImmutableMap; | |||||
import com.google.gson.Gson; | import com.google.gson.Gson; | ||||
import com.google.gson.JsonObject; | |||||
import com.google.gson.JsonParser; | import com.google.gson.JsonParser; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import me.chanjar.weixin.common.WxType; | import me.chanjar.weixin.common.WxType; | ||||
@@ -183,6 +185,17 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl | |||||
return WxMaJscode2SessionResult.fromJson(result); | return WxMaJscode2SessionResult.fromJson(result); | ||||
} | } | ||||
@Override | |||||
public void setDynamicData(int lifespan, String type, int scene, String data) throws WxErrorException { | |||||
JsonObject jsonObject = new JsonObject(); | |||||
jsonObject.addProperty("lifespan", lifespan); | |||||
jsonObject.addProperty("query", WxGsonBuilder.create().toJson(ImmutableMap.of("type", type))); | |||||
jsonObject.addProperty("data", data); | |||||
jsonObject.addProperty("scene", scene); | |||||
this.post(SET_DYNAMIC_DATA_URL, jsonObject.toString()); | |||||
} | |||||
@Override | @Override | ||||
public boolean checkSignature(String timestamp, String nonce, String signature) { | public boolean checkSignature(String timestamp, String nonce, String signature) { | ||||
try { | try { | ||||
@@ -135,6 +135,15 @@ public class WxMaMessage implements Serializable { | |||||
@XStreamConverter(value = XStreamCDataConverter.class) | @XStreamConverter(value = XStreamCDataConverter.class) | ||||
private String statusCode; | private String statusCode; | ||||
@SerializedName("Scene") | |||||
@XStreamAlias("Scene") | |||||
private Integer scene; | |||||
@SerializedName("Query") | |||||
@XStreamAlias("Query") | |||||
@XStreamConverter(value = XStreamCDataConverter.class) | |||||
private String query; | |||||
public static WxMaMessage fromXml(String xml) { | public static WxMaMessage fromXml(String xml) { | ||||
return XStreamTransformer.fromXml(WxMaMessage.class, xml); | return XStreamTransformer.fromXml(WxMaMessage.class, xml); | ||||
} | } | ||||
@@ -1,16 +1,17 @@ | |||||
package cn.binarywang.wx.miniapp.api.impl; | package cn.binarywang.wx.miniapp.api.impl; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.testng.annotations.*; | |||||
import cn.binarywang.wx.miniapp.api.WxMaService; | import cn.binarywang.wx.miniapp.api.WxMaService; | ||||
import cn.binarywang.wx.miniapp.config.WxMaConfig; | import cn.binarywang.wx.miniapp.config.WxMaConfig; | ||||
import cn.binarywang.wx.miniapp.test.ApiTestModule; | import cn.binarywang.wx.miniapp.test.ApiTestModule; | ||||
import com.google.inject.Inject; | import com.google.inject.Inject; | ||||
import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||
import static org.testng.Assert.*; | |||||
import static org.testng.Assert.assertNotEquals; | |||||
import static org.testng.Assert.assertTrue; | |||||
/** | /** | ||||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | * @author <a href="https://github.com/binarywang">Binary Wang</a> | ||||
@@ -49,4 +50,134 @@ public class WxMaServiceImplTest { | |||||
System.out.println(postResult); | System.out.println(postResult); | ||||
} | } | ||||
@Test | |||||
public void testGetRequestHttpClient() { | |||||
} | |||||
@Test | |||||
public void testGetRequestHttpProxy() { | |||||
} | |||||
@Test | |||||
public void testGetRequestType() { | |||||
} | |||||
@Test | |||||
public void testInitHttp() { | |||||
} | |||||
@Test | |||||
public void testGetRequestHttp() { | |||||
} | |||||
@Test | |||||
public void testGetAccessToken() { | |||||
} | |||||
@Test | |||||
public void testJsCode2SessionInfo() { | |||||
} | |||||
@Test | |||||
public void testSetDynamicData() throws WxErrorException { | |||||
this.wxService.setDynamicData(86400, "1000001", 1, | |||||
"{\"items\":[{\"stock_name\":\"腾讯控股\", \"stock_code\":\"00700\", \"stock_market\":\"hk\"}], \"attribute\":{\"count\":2, \"totalcount\": 100, \"id\": \"XXX\", \"seq\": 0}}"); | |||||
} | |||||
@Test | |||||
public void testCheckSignature() { | |||||
} | |||||
@Test | |||||
public void testTestGetAccessToken() { | |||||
} | |||||
@Test | |||||
public void testGet() { | |||||
} | |||||
@Test | |||||
public void testExecute() { | |||||
} | |||||
@Test | |||||
public void testGetWxMaConfig() { | |||||
} | |||||
@Test | |||||
public void testSetWxMaConfig() { | |||||
} | |||||
@Test | |||||
public void testSetRetrySleepMillis() { | |||||
} | |||||
@Test | |||||
public void testSetMaxRetryTimes() { | |||||
} | |||||
@Test | |||||
public void testGetMsgService() { | |||||
} | |||||
@Test | |||||
public void testGetMediaService() { | |||||
} | |||||
@Test | |||||
public void testGetUserService() { | |||||
} | |||||
@Test | |||||
public void testGetQrcodeService() { | |||||
} | |||||
@Test | |||||
public void testGetTemplateService() { | |||||
} | |||||
@Test | |||||
public void testGetSubscribeService() { | |||||
} | |||||
@Test | |||||
public void testGetAnalysisService() { | |||||
} | |||||
@Test | |||||
public void testGetCodeService() { | |||||
} | |||||
@Test | |||||
public void testGetJsapiService() { | |||||
} | |||||
@Test | |||||
public void testGetSettingService() { | |||||
} | |||||
@Test | |||||
public void testGetShareService() { | |||||
} | |||||
@Test | |||||
public void testGetRunService() { | |||||
} | |||||
@Test | |||||
public void testGetSecCheckService() { | |||||
} | |||||
@Test | |||||
public void testGetPluginService() { | |||||
} | |||||
@Test | |||||
public void testGetExpressService() { | |||||
} | |||||
@Test | |||||
public void testGetCloudService() { | |||||
} | |||||
} | } |