@@ -15,6 +15,7 @@ import chanjarster.weixin.bean.WxMenu; | |||
import chanjarster.weixin.bean.result.WxMassSendResult; | |||
import chanjarster.weixin.bean.result.WxMassUploadResult; | |||
import chanjarster.weixin.bean.result.WxMediaUploadResult; | |||
import chanjarster.weixin.bean.result.WxQrCodeTicket; | |||
import chanjarster.weixin.bean.result.WxUser; | |||
import chanjarster.weixin.bean.result.WxUserList; | |||
import chanjarster.weixin.exception.WxErrorException; | |||
@@ -269,7 +270,30 @@ public interface WxService { | |||
* @throws WxErrorException | |||
*/ | |||
public WxUserList userList(String next_openid) throws WxErrorException; | |||
/** | |||
* <pre> | |||
* 换取临时二维码ticket | |||
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=生成带参数的二维码 | |||
* </pre> | |||
* @param scene_id 参数。目前只支持1--100000 | |||
* @param expire_seconds 过期秒数,默认60秒,最小60秒,最大1800秒 | |||
* @return | |||
* @throws WxErrorException | |||
*/ | |||
public WxQrCodeTicket qrCodeCreateTmpTicket(int scene_id, Integer expire_seconds) throws WxErrorException; | |||
/** | |||
* <pre> | |||
* 换取永久二维码ticket | |||
* 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=生成带参数的二维码 | |||
* </pre> | |||
* @param scene_id 参数。目前只支持1--100000 | |||
* @return | |||
* @throws WxErrorException | |||
*/ | |||
public WxQrCodeTicket qrCodeCreateLastTicket(int scene_id) throws WxErrorException; | |||
/** | |||
* 注入 {@link WxConfigStorage} 的实现 | |||
* @param wxConfigProvider | |||
@@ -31,6 +31,7 @@ import chanjarster.weixin.bean.result.WxError; | |||
import chanjarster.weixin.bean.result.WxMassSendResult; | |||
import chanjarster.weixin.bean.result.WxMassUploadResult; | |||
import chanjarster.weixin.bean.result.WxMediaUploadResult; | |||
import chanjarster.weixin.bean.result.WxQrCodeTicket; | |||
import chanjarster.weixin.bean.result.WxUser; | |||
import chanjarster.weixin.bean.result.WxUserList; | |||
import chanjarster.weixin.exception.WxErrorException; | |||
@@ -263,6 +264,35 @@ public class WxServiceImpl implements WxService { | |||
return WxUserList.fromJson(responseContent); | |||
} | |||
public WxQrCodeTicket qrCodeCreateTmpTicket(int scene_id, Integer expire_seconds) throws WxErrorException { | |||
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create"; | |||
JsonObject json = new JsonObject(); | |||
json.addProperty("action_name", "QR_SCENE"); | |||
if(expire_seconds != null) { | |||
json.addProperty("expire_seconds", expire_seconds); | |||
} | |||
JsonObject actionInfo = new JsonObject(); | |||
JsonObject scene = new JsonObject(); | |||
scene.addProperty("scene_id", scene_id); | |||
actionInfo.add("scene", scene); | |||
json.add("action_info", actionInfo); | |||
String responseContent = execute(new SimplePostRequestExecutor(), url, json.toString()); | |||
return WxQrCodeTicket.fromJson(responseContent); | |||
} | |||
public WxQrCodeTicket qrCodeCreateLastTicket(int scene_id) throws WxErrorException { | |||
String url = "https://api.weixin.qq.com/cgi-bin/qrcode/create"; | |||
JsonObject json = new JsonObject(); | |||
json.addProperty("action_name", "QR_LIMIT_SCENE"); | |||
JsonObject actionInfo = new JsonObject(); | |||
JsonObject scene = new JsonObject(); | |||
scene.addProperty("scene_id", scene_id); | |||
actionInfo.add("scene", scene); | |||
json.add("action_info", actionInfo); | |||
String responseContent = execute(new SimplePostRequestExecutor(), url, json.toString()); | |||
return WxQrCodeTicket.fromJson(responseContent); | |||
} | |||
/** | |||
* 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | |||
* @param executor | |||
@@ -0,0 +1,46 @@ | |||
package chanjarster.weixin.bean.result; | |||
import chanjarster.weixin.util.json.WxGsonBuilder; | |||
/** | |||
* 换取二维码的Ticket | |||
* | |||
* @author chanjarster | |||
*/ | |||
public class WxQrCodeTicket { | |||
protected String ticket; | |||
protected int expire_seconds = -1; | |||
protected String url; | |||
public String getTicket() { | |||
return ticket; | |||
} | |||
public void setTicket(String ticket) { | |||
this.ticket = ticket; | |||
} | |||
/** | |||
* 如果返回-1说明是永久 | |||
*/ | |||
public int getExpire_seconds() { | |||
return expire_seconds; | |||
} | |||
public void setExpire_seconds(int expire_seconds) { | |||
this.expire_seconds = expire_seconds; | |||
} | |||
public String getUrl() { | |||
return url; | |||
} | |||
public void setUrl(String url) { | |||
this.url = url; | |||
} | |||
public static WxQrCodeTicket fromJson(String json) { | |||
return WxGsonBuilder.INSTANCE.create().fromJson(json, WxQrCodeTicket.class); | |||
} | |||
} |
@@ -0,0 +1,39 @@ | |||
package chanjarster.weixin.api; | |||
import org.testng.Assert; | |||
import org.testng.annotations.Guice; | |||
import org.testng.annotations.Test; | |||
import chanjarster.weixin.bean.result.WxQrCodeTicket; | |||
import chanjarster.weixin.exception.WxErrorException; | |||
import com.google.inject.Inject; | |||
/** | |||
* 测试用户相关的接口 | |||
* @author chanjarster | |||
* | |||
*/ | |||
@Test(groups = "qrCodeAPI", dependsOnGroups = { "baseAPI" }) | |||
@Guice(modules = ApiTestModule.class) | |||
public class WxQrCodeAPITest { | |||
@Inject | |||
protected WxServiceImpl wxService; | |||
public void testQrCodeCreateTmpTicket() throws WxErrorException { | |||
WxQrCodeTicket ticket = wxService.qrCodeCreateTmpTicket(1, null); | |||
Assert.assertNotNull(ticket.getUrl()); | |||
Assert.assertNotNull(ticket.getTicket()); | |||
Assert.assertTrue(ticket.getExpire_seconds() != -1); | |||
} | |||
public void testQrCodeCreateLastTicket() throws WxErrorException { | |||
WxQrCodeTicket ticket = wxService.qrCodeCreateLastTicket(1); | |||
Assert.assertNotNull(ticket.getUrl()); | |||
Assert.assertNotNull(ticket.getTicket()); | |||
Assert.assertTrue(ticket.getExpire_seconds() == -1); | |||
} | |||
} |
@@ -10,6 +10,7 @@ | |||
<class name="chanjarster.weixin.api.WxMassMessageAPITest" /> | |||
<class name="chanjarster.weixin.api.WxMediaAPITest" /> | |||
<class name="chanjarster.weixin.api.WxMassMessageAPITest" /> | |||
<class name="chanjarster.weixin.api.WxUserAPITest" /> | |||
</classes> | |||
</test> | |||