WxMpService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. package me.chanjar.weixin.mp.api;
  2. import me.chanjar.weixin.common.bean.WxJsapiSignature;
  3. import me.chanjar.weixin.common.exception.WxErrorException;
  4. import me.chanjar.weixin.common.util.http.RequestExecutor;
  5. import me.chanjar.weixin.mp.bean.*;
  6. import me.chanjar.weixin.mp.bean.result.*;
  7. import org.apache.http.HttpHost;
  8. /**
  9. * 微信API的Service
  10. */
  11. public interface WxMpService {
  12. /**
  13. * <pre>
  14. * 验证消息的确来自微信服务器
  15. * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319&token=&lang=zh_CN
  16. * </pre>
  17. */
  18. boolean checkSignature(String timestamp, String nonce, String signature);
  19. /**
  20. * 获取access_token, 不强制刷新access_token
  21. *
  22. * @see #getAccessToken(boolean)
  23. */
  24. String getAccessToken() throws WxErrorException;
  25. /**
  26. * <pre>
  27. * 获取access_token,本方法线程安全
  28. * 且在多线程同时刷新时只刷新一次,避免超出2000次/日的调用次数上限
  29. *
  30. * 另:本service的所有方法都会在access_token过期是调用此方法
  31. *
  32. * 程序员在非必要情况下尽量不要主动调用此方法
  33. *
  34. * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183&token=&lang=zh_CN
  35. * </pre>
  36. *
  37. * @param forceRefresh 强制刷新
  38. */
  39. String getAccessToken(boolean forceRefresh) throws WxErrorException;
  40. /**
  41. * 获得jsapi_ticket,不强制刷新jsapi_ticket
  42. *
  43. * @see #getJsapiTicket(boolean)
  44. */
  45. String getJsapiTicket() throws WxErrorException;
  46. /**
  47. * <pre>
  48. * 获得jsapi_ticket
  49. * 获得时会检查jsapiToken是否过期,如果过期了,那么就刷新一下,否则就什么都不干
  50. *
  51. * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
  52. * </pre>
  53. *
  54. * @param forceRefresh 强制刷新
  55. */
  56. String getJsapiTicket(boolean forceRefresh) throws WxErrorException;
  57. /**
  58. * <pre>
  59. * 创建调用jsapi时所需要的签名
  60. *
  61. * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
  62. * </pre>
  63. */
  64. WxJsapiSignature createJsapiSignature(String url) throws WxErrorException;
  65. /**
  66. * <pre>
  67. * 上传群发用的图文消息,上传后才能群发图文消息
  68. *
  69. * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
  70. * </pre>
  71. *
  72. * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassTagMessage)
  73. * @see #massOpenIdsMessageSend(me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage)
  74. */
  75. WxMpMassUploadResult massNewsUpload(WxMpMassNews news) throws WxErrorException;
  76. /**
  77. * <pre>
  78. * 上传群发用的视频,上传后才能群发视频消息
  79. * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
  80. * </pre>
  81. *
  82. * @see #massGroupMessageSend(me.chanjar.weixin.mp.bean.WxMpMassTagMessage)
  83. * @see #massOpenIdsMessageSend(me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage)
  84. */
  85. WxMpMassUploadResult massVideoUpload(WxMpMassVideo video) throws WxErrorException;
  86. /**
  87. * <pre>
  88. * 分组群发消息
  89. * 如果发送图文消息,必须先使用 {@link #massNewsUpload(me.chanjar.weixin.mp.bean.WxMpMassNews)} 获得media_id,然后再发送
  90. * 如果发送视频消息,必须先使用 {@link #massVideoUpload(me.chanjar.weixin.mp.bean.WxMpMassVideo)} 获得media_id,然后再发送
  91. * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
  92. * </pre>
  93. */
  94. WxMpMassSendResult massGroupMessageSend(WxMpMassTagMessage message) throws WxErrorException;
  95. /**
  96. * <pre>
  97. * 按openId列表群发消息
  98. * 如果发送图文消息,必须先使用 {@link #massNewsUpload(me.chanjar.weixin.mp.bean.WxMpMassNews)} 获得media_id,然后再发送
  99. * 如果发送视频消息,必须先使用 {@link #massVideoUpload(me.chanjar.weixin.mp.bean.WxMpMassVideo)} 获得media_id,然后再发送
  100. * 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
  101. * </pre>
  102. */
  103. WxMpMassSendResult massOpenIdsMessageSend(WxMpMassOpenIdsMessage message) throws WxErrorException;
  104. /**
  105. * <pre>
  106. * 群发消息预览接口
  107. * 开发者可通过该接口发送消息给指定用户,在手机端查看消息的样式和排版。为了满足第三方平台开发者的需求,在保留对openID预览能力的同时,增加了对指定微信号发送预览的能力,但该能力每日调用次数有限制(100次),请勿滥用。
  108. * 接口调用请求说明
  109. * http请求方式: POST
  110. * https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=ACCESS_TOKEN
  111. * 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140549&token=&lang=zh_CN
  112. * </pre>
  113. *
  114. * @return wxMpMassSendResult
  115. */
  116. WxMpMassSendResult massMessagePreview(WxMpMassPreviewMessage wxMpMassPreviewMessage) throws Exception;
  117. /**
  118. * <pre>
  119. * 长链接转短链接接口
  120. * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=长链接转短链接接口
  121. * </pre>
  122. *
  123. */
  124. String shortUrl(String long_url) throws WxErrorException;
  125. /**
  126. * <pre>
  127. * 语义查询接口
  128. * 详情请见:http://mp.weixin.qq.com/wiki/index.php?title=语义理解
  129. * </pre>
  130. */
  131. WxMpSemanticQueryResult semanticQuery(WxMpSemanticQuery semanticQuery) throws WxErrorException;
  132. /**
  133. * <pre>
  134. * 构造第三方使用网站应用授权登录的url
  135. * 详情请见: <a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN">网站应用微信登录开发指南</a>
  136. * URL格式为:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
  137. * </pre>
  138. *
  139. * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
  140. * @param scope 应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
  141. * @param state 非必填,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验
  142. * @return url
  143. */
  144. String buildQrConnectUrl(String redirectURI, String scope, String state);
  145. /**
  146. * <pre>
  147. * 构造oauth2授权的url连接
  148. * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
  149. * </pre>
  150. *
  151. * @param redirectURI 用户授权完成后的重定向链接,无需urlencode, 方法内会进行encode
  152. * @return url
  153. */
  154. String oauth2buildAuthorizationUrl(String redirectURI, String scope, String state);
  155. /**
  156. * <pre>
  157. * 用code换取oauth2的access token
  158. * 详情请见: http://mp.weixin.qq.com/wiki/index.php?title=网页授权获取用户基本信息
  159. * </pre>
  160. */
  161. WxMpOAuth2AccessToken oauth2getAccessToken(String code) throws WxErrorException;
  162. /**
  163. * <pre>
  164. * 刷新oauth2的access token
  165. * </pre>
  166. */
  167. WxMpOAuth2AccessToken oauth2refreshAccessToken(String refreshToken) throws WxErrorException;
  168. /**
  169. * <pre>
  170. * 用oauth2获取用户信息, 当前面引导授权时的scope是snsapi_userinfo的时候才可以
  171. * </pre>
  172. *
  173. * @param lang zh_CN, zh_TW, en
  174. */
  175. WxMpUser oauth2getUserInfo(WxMpOAuth2AccessToken oAuth2AccessToken, String lang) throws WxErrorException;
  176. /**
  177. * <pre>
  178. * 验证oauth2的access token是否有效
  179. * </pre>
  180. *
  181. */
  182. boolean oauth2validateAccessToken(WxMpOAuth2AccessToken oAuth2AccessToken);
  183. /**
  184. * <pre>
  185. * 获取微信服务器IP地址
  186. * http://mp.weixin.qq.com/wiki/0/2ad4b6bfd29f30f71d39616c2a0fcedc.html
  187. * </pre>
  188. */
  189. String[] getCallbackIP() throws WxErrorException;
  190. /**
  191. * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求
  192. */
  193. String get(String url, String queryParam) throws WxErrorException;
  194. /**
  195. * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的POST请求
  196. */
  197. String post(String url, String postData) throws WxErrorException;
  198. /**
  199. * <pre>
  200. * Service没有实现某个API的时候,可以用这个,
  201. * 比{@link #get}和{@link #post}方法更灵活,可以自己构造RequestExecutor用来处理不同的参数和不同的返回类型。
  202. * 可以参考,{@link me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor}的实现方法
  203. * </pre>
  204. */
  205. <T, E> T execute(RequestExecutor<T, E> executor, String uri, E data) throws WxErrorException;
  206. /**
  207. * 获取代理对象
  208. */
  209. HttpHost getHttpProxy();
  210. /**
  211. * 注入 {@link WxMpConfigStorage} 的实现
  212. */
  213. void setWxMpConfigStorage(WxMpConfigStorage wxConfigProvider);
  214. /**
  215. * <pre>
  216. * 设置当微信系统响应系统繁忙时,要等待多少 retrySleepMillis(ms) * 2^(重试次数 - 1) 再发起重试
  217. * 默认:1000ms
  218. * </pre>
  219. */
  220. void setRetrySleepMillis(int retrySleepMillis);
  221. /**
  222. * <pre>
  223. * 设置当微信系统响应系统繁忙时,最大重试次数
  224. * 默认:5次
  225. * </pre>
  226. */
  227. void setMaxRetryTimes(int maxRetryTimes);
  228. /**
  229. * 获取WxMpConfigStorage 对象
  230. *
  231. * @return WxMpConfigStorage
  232. */
  233. WxMpConfigStorage getWxMpConfigStorage();
  234. /**
  235. * 返回客服接口方法实现类,以方便调用其各个接口
  236. *
  237. * @return WxMpKefuService
  238. */
  239. WxMpKefuService getKefuService();
  240. /**
  241. * 返回素材相关接口方法的实现类对象,以方便调用其各个接口
  242. *
  243. * @return WxMpMaterialService
  244. */
  245. WxMpMaterialService getMaterialService();
  246. /**
  247. * 返回菜单相关接口方法的实现类对象,以方便调用其各个接口
  248. *
  249. * @return WxMpMenuService
  250. */
  251. WxMpMenuService getMenuService();
  252. /**
  253. * 返回用户相关接口方法的实现类对象,以方便调用其各个接口
  254. *
  255. * @return WxMpUserService
  256. */
  257. WxMpUserService getUserService();
  258. /**
  259. * 返回用户标签相关接口方法的实现类对象,以方便调用其各个接口
  260. *
  261. * @return WxMpUserTagService
  262. */
  263. WxMpUserTagService getUserTagService();
  264. /**
  265. * 返回二维码相关接口方法的实现类对象,以方便调用其各个接口
  266. *
  267. * @return WxMpQrcodeService
  268. */
  269. WxMpQrcodeService getQrcodeService();
  270. /**
  271. * 返回卡券相关接口方法的实现类对象,以方便调用其各个接口
  272. *
  273. * @return WxMpCardService
  274. */
  275. WxMpCardService getCardService();
  276. /**
  277. * 返回微信支付相关接口方法的实现类对象,以方便调用其各个接口
  278. *
  279. * @return WxMpPayService
  280. */
  281. WxMpPayService getPayService();
  282. /**
  283. * 返回数据分析统计相关接口方法的实现类对象,以方便调用其各个接口
  284. *
  285. * @return WxMpDataCubeService
  286. */
  287. WxMpDataCubeService getDataCubeService();
  288. /**
  289. * 返回用户黑名单管理相关接口方法的实现类对象,以方便调用其各个接口
  290. *
  291. * @return WxMpUserBlacklistService
  292. */
  293. WxMpUserBlacklistService getBlackListService();
  294. /**
  295. * 返回门店管理相关接口方法的实现类对象,以方便调用其各个接口
  296. *
  297. * @return WxMpStoreService
  298. */
  299. WxMpStoreService getStoreService();
  300. /**
  301. * 返回模板消息相关接口方法的实现类对象,以方便调用其各个接口
  302. *
  303. * @return WxMpTemplateMsgService
  304. */
  305. WxMpTemplateMsgService getTemplateMsgService();
  306. /**
  307. * 返回硬件平台相关接口方法的实现类对象,以方便调用其各个接口
  308. *
  309. * @return WxMpDeviceService
  310. */
  311. WxMpDeviceService getDeviceService();
  312. }