| @@ -15,6 +15,7 @@ import chanjarster.weixin.bean.WxMenu; | |||||
| import chanjarster.weixin.bean.result.WxMassSendResult; | import chanjarster.weixin.bean.result.WxMassSendResult; | ||||
| import chanjarster.weixin.bean.result.WxMassUploadResult; | import chanjarster.weixin.bean.result.WxMassUploadResult; | ||||
| import chanjarster.weixin.bean.result.WxMediaUploadResult; | import chanjarster.weixin.bean.result.WxMediaUploadResult; | ||||
| import chanjarster.weixin.bean.result.WxQrCodeTicket; | |||||
| import chanjarster.weixin.bean.result.WxUser; | import chanjarster.weixin.bean.result.WxUser; | ||||
| import chanjarster.weixin.bean.result.WxUserList; | import chanjarster.weixin.bean.result.WxUserList; | ||||
| import chanjarster.weixin.exception.WxErrorException; | import chanjarster.weixin.exception.WxErrorException; | ||||
| @@ -269,7 +270,30 @@ public interface WxService { | |||||
| * @throws WxErrorException | * @throws WxErrorException | ||||
| */ | */ | ||||
| public WxUserList userList(String next_openid) 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} 的实现 | * 注入 {@link WxConfigStorage} 的实现 | ||||
| * @param wxConfigProvider | * @param wxConfigProvider | ||||
| @@ -31,6 +31,7 @@ import chanjarster.weixin.bean.result.WxError; | |||||
| import chanjarster.weixin.bean.result.WxMassSendResult; | import chanjarster.weixin.bean.result.WxMassSendResult; | ||||
| import chanjarster.weixin.bean.result.WxMassUploadResult; | import chanjarster.weixin.bean.result.WxMassUploadResult; | ||||
| import chanjarster.weixin.bean.result.WxMediaUploadResult; | import chanjarster.weixin.bean.result.WxMediaUploadResult; | ||||
| import chanjarster.weixin.bean.result.WxQrCodeTicket; | |||||
| import chanjarster.weixin.bean.result.WxUser; | import chanjarster.weixin.bean.result.WxUser; | ||||
| import chanjarster.weixin.bean.result.WxUserList; | import chanjarster.weixin.bean.result.WxUserList; | ||||
| import chanjarster.weixin.exception.WxErrorException; | import chanjarster.weixin.exception.WxErrorException; | ||||
| @@ -263,6 +264,35 @@ public class WxServiceImpl implements WxService { | |||||
| return WxUserList.fromJson(responseContent); | 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过期时才去刷新,然后重新执行请求,而不是全局定时请求 | * 向微信端发送请求,在这里执行的策略是当发生access_token过期时才去刷新,然后重新执行请求,而不是全局定时请求 | ||||
| * @param executor | * @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.WxMassMessageAPITest" /> | ||||
| <class name="chanjarster.weixin.api.WxMediaAPITest" /> | <class name="chanjarster.weixin.api.WxMediaAPITest" /> | ||||
| <class name="chanjarster.weixin.api.WxMassMessageAPITest" /> | <class name="chanjarster.weixin.api.WxMassMessageAPITest" /> | ||||
| <class name="chanjarster.weixin.api.WxUserAPITest" /> | |||||
| </classes> | </classes> | ||||
| </test> | </test> | ||||