You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1099 lines
51 KiB

  1. package com.iformall.controller;
  2. import cn.binarywang.wx.miniapp.api.WxMaService;
  3. import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.github.pagehelper.PageInfo;
  8. import com.google.gson.Gson;
  9. import com.google.gson.GsonBuilder;
  10. import com.google.gson.reflect.TypeToken;
  11. import com.iformall.common.ErrorCode;
  12. import com.iformall.common.Result;
  13. import com.iformall.common.ResultData;
  14. import com.iformall.controller.base.BaseController;
  15. import com.iformall.domain.po.*;
  16. import com.iformall.domain.vo.WxWeappAuditStatusVo;
  17. import com.iformall.domain.vo.WxWeappCodeStatusVo;
  18. import com.iformall.domain.vo.WxWeappInfo;
  19. import com.iformall.domain.vo.WxWeappReleaseStatusVo;
  20. import com.iformall.enums.*;
  21. import com.iformall.service.*;
  22. import com.iformall.service.toutiao.FmTtOpenService;
  23. import com.iformall.service.toutiao.api.TtOpenMaService;
  24. import com.iformall.service.toutiao.api.bean.TtOpenResult;
  25. import com.iformall.service.toutiao.miniapp.TtMaService;
  26. import com.iformall.service.wechat.FmOpenService;
  27. import com.iformall.utils.Constant;
  28. import com.iformall.utils.OpenConstant;
  29. import io.swagger.annotations.Api;
  30. import io.swagger.annotations.ApiImplicitParam;
  31. import io.swagger.annotations.ApiImplicitParams;
  32. import io.swagger.annotations.ApiOperation;
  33. import me.chanjar.weixin.common.error.WxErrorException;
  34. import me.chanjar.weixin.open.api.WxOpenMaService;
  35. import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
  36. import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
  37. import me.chanjar.weixin.open.bean.result.WxOpenMaDomainResult;
  38. import me.chanjar.weixin.open.bean.result.WxOpenMaQueryAuditResult;
  39. import me.chanjar.weixin.open.bean.result.WxOpenMaSubmitAuditResult;
  40. import me.chanjar.weixin.open.bean.result.WxOpenResult;
  41. import org.apache.commons.lang3.StringUtils;
  42. import org.slf4j.Logger;
  43. import org.slf4j.LoggerFactory;
  44. import org.springframework.beans.factory.annotation.Autowired;
  45. import org.springframework.stereotype.Controller;
  46. import org.springframework.web.bind.annotation.*;
  47. import javax.servlet.ServletOutputStream;
  48. import javax.servlet.http.HttpServletRequest;
  49. import javax.servlet.http.HttpServletResponse;
  50. import java.io.File;
  51. import java.io.FileInputStream;
  52. import java.io.IOException;
  53. import java.io.InputStream;
  54. import java.net.URLEncoder;
  55. import java.util.*;
  56. /**
  57. * Stormeye Wu
  58. */
  59. @Controller
  60. @RequestMapping("/weapp")
  61. @Api(description = "小程序")
  62. public class WxWeappInfoController extends BaseController {
  63. private final Logger logger = LoggerFactory.getLogger(getClass());
  64. @Autowired
  65. private Integer getFmDeploy;
  66. @Autowired
  67. private WxAuthorizerInfoService authorizerInfoService;
  68. @Autowired
  69. private WxWeappBasicSetService weappBasicSetService;
  70. @Autowired
  71. private WxWeappExtSetService weappExtSetService;
  72. @Autowired
  73. private WxWeappCodeStatusService weappCodeStatusService;
  74. @Autowired
  75. private WxWeappAuditStatusService weappAuditStatusService;
  76. @Autowired
  77. private WxWeappReleaseStatusService weappReleaseStatusService;
  78. @Autowired
  79. private FmTtOpenService openService;
  80. @Autowired
  81. private WxAppinfoService appinfoService;
  82. @Autowired
  83. private WxTemplateMsgService templateMsgService;
  84. @ApiOperation(value = "小程序分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
  85. @GetMapping("list")
  86. @ApiImplicitParams({
  87. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  88. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  89. public ResultData list(@ModelAttribute WxWeappInfo weappInfo, Integer pageNum, Integer pageSize) {
  90. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list");
  91. if (null == weappInfo) {
  92. weappInfo = new WxWeappInfo();
  93. } else {
  94. if(StringUtils.isBlank(weappInfo.getName())) {
  95. weappInfo.setName(null);
  96. }
  97. }
  98. weappInfo.setPlat(EnumAppPlat.TOUTIAO.getCode());
  99. weappInfo.setSortColumns(BaseEntity.SortField.TenantId_ASC,BaseEntity.SortField.Type_ASC,BaseEntity.SortField.Name_ASC);
  100. final PageInfo<WxWeappInfo> page = authorizerInfoService.listVoAsPage(weappInfo, pageNum, pageSize);
  101. return new ResultData(page);
  102. }
  103. @ApiOperation("小程序列表接口")
  104. @GetMapping("allist")
  105. public ResultData getList(@ModelAttribute WxWeappInfo weappInfo) {
  106. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list");
  107. if (null == weappInfo) {
  108. weappInfo = new WxWeappInfo();
  109. } else {
  110. if(StringUtils.isBlank(weappInfo.getName())) {
  111. weappInfo.setName(null);
  112. }
  113. }
  114. weappInfo.setSortColumns(BaseEntity.SortField.CurrentVersion_DESC);
  115. final List<WxWeappInfo> list = authorizerInfoService.getList(weappInfo);
  116. return new ResultData(list);
  117. }
  118. @ApiOperation(value = "APPs基础设置(服务器域名、业务域名、基础版本、微信模板)", notes = "{\"apps\":\"appid,appid\",\"type\":\"String\"}")
  119. @PostMapping("batchBasicSet")
  120. public ResultData batchSet(@RequestBody Map<String, String> params) {
  121. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchBasicSet");
  122. String appsStr = params.get(OpenConstant.APPS);
  123. String typeStr = params.get(OpenConstant.TYPE);
  124. if(StringUtils.isBlank(typeStr)) {
  125. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空");
  126. }
  127. Integer type = 0;
  128. try {
  129. type = Integer.parseInt(typeStr);
  130. } catch (Exception e) {
  131. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
  132. }
  133. // 检查基础配置参数
  134. WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet();
  135. weappBasicSetQ.setType(type);
  136. weappBasicSetQ.setDeploy(getFmDeploy);
  137. WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ);
  138. if(weappBasicSet == null) {
  139. logger.error("未找到相关的基础设置参数");
  140. return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR);
  141. }
  142. JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl());
  143. if(domainObj == null) {
  144. logger.error("未找到相关的基础设置参数");
  145. return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR);
  146. }
  147. JSONObject templeObj = JSON.parseObject(weappBasicSet.getTemplateInfo());
  148. logger.info(templeObj.toJSONString());
  149. if(StringUtils.isBlank(appsStr)) {
  150. WxWeappInfo weappInfoQ = new WxWeappInfo();
  151. weappInfoQ.setType(type);
  152. List<WxWeappInfo> list = authorizerInfoService.getList(weappInfoQ);
  153. for(WxWeappInfo info: list) {
  154. appsStr += info.getAuthorizerAppid() + ",";
  155. }
  156. appsStr = appsStr.substring(0, appsStr.length() - 1);
  157. }
  158. // 逐一设置app配置
  159. String [] apps = appsStr.split(",");
  160. for(String appId: apps) {
  161. // 检查appId是否已授权
  162. WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
  163. if(authorizerInfo == null) {
  164. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  165. }
  166. if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
  167. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  168. }
  169. ResultData openRet = setBasicForAppId(appId, weappBasicSet, domainObj, templeObj);
  170. if (openRet != null) return openRet;
  171. }
  172. return new ResultData();
  173. }
  174. @ApiOperation(value = "APP清除域名", notes = "{\"weappId\":\"weappId\",\"type\":\"String\"}")
  175. @PostMapping("cleanDomain")
  176. public ResultData cleanDomain(@RequestBody Map<String, String> params) {
  177. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::cleanDomain");
  178. String appId = params.get(OpenConstant.WE_APPID);
  179. String typeStr = params.get(OpenConstant.TYPE);
  180. if(StringUtils.isBlank(typeStr)) {
  181. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空");
  182. }
  183. if(StringUtils.isBlank(appId)) {
  184. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "weappId参数不能为空");
  185. }
  186. Integer type = 0;
  187. try {
  188. type = Integer.parseInt(typeStr);
  189. } catch (Exception e) {
  190. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
  191. }
  192. // 检查基础配置参数
  193. WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet();
  194. weappBasicSetQ.setType(type);
  195. weappBasicSetQ.setDeploy(getFmDeploy);
  196. WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ);
  197. if(weappBasicSet == null) {
  198. logger.error("未找到相关的基础设置参数");
  199. return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR);
  200. }
  201. JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl());
  202. if(domainObj == null) {
  203. logger.error("未找到相关的基础设置参数");
  204. return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR);
  205. }
  206. // 检查appId是否已授权
  207. WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
  208. if(authorizerInfo == null) {
  209. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  210. }
  211. if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
  212. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  213. }
  214. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId);
  215. try {
  216. modifyDomainUrl(OpenConstant.DEL, domainObj, authorizerInfo, openMaService);
  217. } catch (WxErrorException e) {
  218. logger.error(e.getMessage());
  219. return new ResultData(Result.ERROR, e.getMessage());
  220. }
  221. return new ResultData();
  222. }
  223. private ResultData setBasicForAppId(String appId, WxWeappBasicSet weappBasicSet, JSONObject domainObj, JSONObject templeObj) {
  224. WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
  225. if(authorizerInfo == null) {
  226. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  227. }
  228. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId);
  229. try {
  230. setBasicVersion(weappBasicSet, authorizerInfo, openMaService);
  231. modifyDomainUrl(OpenConstant.SET, domainObj, authorizerInfo, openMaService);
  232. } catch (WxErrorException e) {
  233. logger.error(e.getMessage());
  234. return new ResultData(Result.ERROR, e.getMessage());
  235. }
  236. // // 设置微信模板
  237. // if(weappBasicSet.getType().equals(EnumAppType.C.getCode())) {
  238. // if(authorizerInfo.getTemplateStatus() == null ||
  239. // !authorizerInfo.getTemplateStatus().equals(EnumWxAuthotizationTemplateStatus.SUCCESS.getCode())) {
  240. // // 模板未设置或者设置失败
  241. // // 获取模板
  242. // WxAppinfo appinfo = appinfoService.getByAppId(appId);
  243. // TtMaService maService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId);
  244. //
  245. // try {
  246. //// setBasicTemplateMsgVerifySuccess(templeObj, appinfo, maService);
  247. //// setBasicTemplateMsgVerifyFail(templeObj, appinfo, maService);
  248. //// setBasicTemplateMsgPressSuccess(templeObj, appinfo, maService);
  249. //
  250. // // 更新状态
  251. // authorizerInfo.setTemplateStatus(EnumWxAuthotizationTemplateStatus.SUCCESS.getCode());
  252. // authorizerInfo.setTemplateTime(new Date());
  253. // authorizerInfo.setUpdateTime(new Date());
  254. // authorizerInfoService.updateTemplate(authorizerInfo);
  255. // } catch (WxErrorException e) {
  256. // logger.error(e.getMessage());
  257. // // 更新状态
  258. // authorizerInfo.setTemplateStatus(EnumWxAuthotizationTemplateStatus.Fail.getCode());
  259. // authorizerInfo.setTemplateTime(new Date());
  260. // authorizerInfo.setUpdateTime(new Date());
  261. // authorizerInfoService.updateTemplate(authorizerInfo);
  262. // return new ResultData(Result.ERROR, e.getMessage());
  263. // }
  264. // }
  265. // }
  266. // 设置成功返回null
  267. return null;
  268. }
  269. // private void setBasicTemplateMsg(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService, Integer msgCode, String msgTypeStr) throws WxErrorException {
  270. // JSONObject msgObj;
  271. // try {
  272. // msgObj = templeObj.getJSONObject(msgTypeStr);
  273. // } catch (Exception e) {
  274. // logger.error(e.getMessage());
  275. // return;
  276. // }
  277. // logger.info(msgObj.toJSONString());
  278. // String id = msgObj.getString(OpenConstant.ID);
  279. // JSONArray keyidlist = msgObj.getJSONArray(OpenConstant.KEY_ID_LIST);
  280. // String customParam = msgObj.getString(OpenConstant.CUSTOM_PARAM);
  281. // logger.info(customParam);
  282. // JSONObject customParamObj = JSON.parseObject(customParam);
  283. // List<Integer> keyArr1 = getIdList(keyidlist);
  284. // if (appinfo != null) {
  285. // // wx_template_msg
  286. // WxTemplateMsg templateMsgQ = new WxTemplateMsg();
  287. // templateMsgQ.setTenantId(appinfo.getTenantId());
  288. // logger.info(msgCode.toString());
  289. // templateMsgQ.setType(msgCode);
  290. // WxTemplateMsg templateMsg = templateMsgService.getByObj(templateMsgQ);
  291. // if (templateMsg != null) {
  292. // templateMsg.setCustomParam(customParamObj.toJSONString());
  293. // templateMsgService.saveOrUpdate(templateMsg);
  294. // } else {
  295. // WxMaTemplateAddResult ret = maService.getTemplateService().addTemplate(id, keyArr1);
  296. // logger.info(ret.toString());
  297. // templateMsgQ.setTemplateId(ret.getTemplateId());
  298. // templateMsgQ.setCustomParam(customParamObj.toJSONString());
  299. // templateMsgService.saveOrUpdate(templateMsgQ);
  300. // }
  301. // }
  302. // }
  303. // private void setBasicTemplateMsgVerifySuccess(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService) throws WxErrorException {
  304. // // 核销成功消息
  305. // setBasicTemplateMsg(templeObj, appinfo, maService, EnumTemplateType.VERIFY_SUCCESS.getCode(), OpenConstant.VERIFY_SUCC);
  306. // }
  307. //
  308. // private void setBasicTemplateMsgVerifyFail(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService) throws WxErrorException {
  309. // // 核销失败消息
  310. // setBasicTemplateMsg(templeObj, appinfo, maService, EnumTemplateType.VERIFY_FAIL.getCode(), OpenConstant.VERIFY_FAIL);
  311. // }
  312. //
  313. // private void setBasicTemplateMsgPressSuccess(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService) throws WxErrorException {
  314. // // 砍价成功消息
  315. // logger.info("setBasicTemplateMsgPressSuccess begin..");
  316. // /// EnumTemplateType.PRESS_PRICE_SUCCESS.getCode()
  317. // setBasicTemplateMsg(templeObj, appinfo, maService, 3, "press_success");
  318. // logger.info("setBasicTemplateMsgPressSuccess end.");
  319. // }
  320. private void modifyDomainUrl(String action, JSONObject domainObj, WxAuthorizerInfo authorizerInfo, TtOpenMaService openMaService) throws WxErrorException {
  321. // 服务器域名
  322. JSONObject urlObj = domainObj.getJSONObject(OpenConstant.URL);
  323. List<String> requestDomain = getUrlList(urlObj.getJSONArray(OpenConstant.REQ_DOMAIN));
  324. List<String> wsrequestDomain = getUrlList(urlObj.getJSONArray(OpenConstant.WS_DOMAIN));
  325. List<String> uploadDomain = getUrlList(urlObj.getJSONArray(OpenConstant.UPLOAD_DOMAIN));
  326. List<String> downloadDomain = getUrlList(urlObj.getJSONArray(OpenConstant.DOWNLOAD_DOMAIN));
  327. logger.info(downloadDomain.toString());
  328. WxOpenMaDomainResult openRet = openMaService.modifyDomain(action,
  329. requestDomain, wsrequestDomain,
  330. uploadDomain, downloadDomain);
  331. logger.info(openRet.toString());
  332. if(openRet.isSuccess()) {
  333. logger.info("设置服务器域名成功");
  334. authorizerInfo.setDomainStatus(EnumEnableType.SUCC.getCode());
  335. authorizerInfo.setDomainTime(new Date());
  336. authorizerInfo.setUpdateTime(new Date());
  337. } else {
  338. logger.info("设置服务器域名成功");
  339. authorizerInfo.setDomainStatus(EnumEnableType.FAIL.getCode());
  340. authorizerInfo.setDomainTime(new Date());
  341. authorizerInfo.setUpdateTime(new Date());
  342. }
  343. authorizerInfoService.updateDomainUrl(authorizerInfo);
  344. // 业务域名
  345. JSONObject webObj = domainObj.getJSONObject(OpenConstant.WEB);
  346. List<String> urlList = getUrlList(webObj.getJSONArray(OpenConstant.WEB_DOMAIN));
  347. String openRet1 = openMaService.setWebViewDomain(action, urlList);
  348. logger.info(openRet1);
  349. JSONObject webRetObj = JSON.parseObject(openRet1);
  350. if(webRetObj.getInteger(OpenConstant.ERRCODE).equals(0)) {
  351. logger.info("设置服务器业务域名成功");
  352. authorizerInfo.setWebdomainStatus(EnumEnableType.SUCC.getCode());
  353. authorizerInfo.setWebdomainTime(new Date());
  354. authorizerInfo.setUpdateTime(new Date());
  355. } else {
  356. logger.info("设置服务器业务域名失败");
  357. authorizerInfo.setWebdomainStatus(EnumEnableType.FAIL.getCode());
  358. authorizerInfo.setWebdomainTime(new Date());
  359. authorizerInfo.setUpdateTime(new Date());
  360. }
  361. authorizerInfoService.updateWebDomainUrl(authorizerInfo);
  362. }
  363. private void setBasicVersion(WxWeappBasicSet weappBasicSet, WxAuthorizerInfo authorizerInfo, TtOpenMaService openMaService) throws WxErrorException {
  364. // 设置基础版本
  365. String versionRet = openMaService.setSupportVersion(weappBasicSet.getVersion());
  366. logger.info(versionRet);
  367. JSONObject verObj = JSON.parseObject(versionRet);
  368. if(verObj.getInteger(OpenConstant.ERRCODE).equals(OpenConstant.SUCC)) {
  369. authorizerInfo.setBaseStatus(EnumEnableType.SUCC.getCode());
  370. } else {
  371. authorizerInfo.setBaseStatus(EnumEnableType.FAIL.getCode());
  372. }
  373. authorizerInfo.setBaseTime(new Date());
  374. authorizerInfo.setUpdateTime(new Date());
  375. authorizerInfoService.updateBaseVersion(authorizerInfo);
  376. }
  377. private List<Integer> getIdList(JSONArray keyidlist) {
  378. List<Integer> keyArr = new ArrayList<Integer>();
  379. for (int i = 0; i < keyidlist.size(); i++) {
  380. keyArr.add(keyidlist.getIntValue(i));
  381. }
  382. return keyArr;
  383. }
  384. private List<String> getUrlList(JSONArray urlList) {
  385. List<String> keyArr = new ArrayList<String>();
  386. for (int i = 0; i < urlList.size(); i++) {
  387. keyArr.add(urlList.getString(i));
  388. }
  389. return keyArr;
  390. }
  391. @ApiOperation(value = "批量授权的小程序code提交", notes = "{\"apps\":\"appid,appid\",\"templateId\":\"String\",\"type\":\"String\",\"userVersion\":\"String\",\"userDesc\":\"String\"}")
  392. @PostMapping("batchCodeCommit")
  393. public ResultData batchCodeCommit(@RequestBody Map<String, String> params) {
  394. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet");
  395. String appsStr = params.get(OpenConstant.APPS);
  396. String templateIdStr = params.get(OpenConstant.TEMPLATE_ID);
  397. String typeStr = params.get(OpenConstant.TYPE);
  398. String userVersion = params.get(OpenConstant.USER_VERSION);
  399. String userDesc = params.get(OpenConstant.USER_DESC);
  400. Integer type = null;
  401. Long templateId = null;
  402. try {
  403. templateId = Long.parseLong(templateIdStr);
  404. } catch (Exception e) {
  405. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
  406. }
  407. try {
  408. type = Integer.parseInt(typeStr);
  409. } catch (Exception e) {
  410. logger.error("type为null");
  411. }
  412. if(StringUtils.isBlank(appsStr)) {
  413. if(type == null) {
  414. logger.error("type为null");
  415. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR);
  416. }
  417. WxWeappInfo authQ = new WxWeappInfo();
  418. authQ.setType(type);
  419. List<WxWeappInfo> appList = authorizerInfoService.getList(authQ);
  420. appsStr = "";
  421. StringBuilder sb = new StringBuilder();
  422. boolean bfirst = true;
  423. for(WxWeappInfo app: appList) {
  424. if(bfirst) {
  425. sb.append(app.getAuthorizerAppid());
  426. bfirst = false;
  427. } else {
  428. sb.append(app.getAuthorizerAppid()).append(",");
  429. }
  430. }
  431. }
  432. String [] apps = appsStr.split(",");
  433. // 逐一检查app的设置
  434. for(String appId: apps) {
  435. WxWeappExtSet extSetQ = new WxWeappExtSet();
  436. extSetQ.setAppId(appId);
  437. WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
  438. if(extSet == null) {
  439. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  440. }
  441. if(StringUtils.isBlank(extSet.getExtJson())) {
  442. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  443. }
  444. if(StringUtils.isBlank(extSet.getReleaseJson())) {
  445. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  446. }
  447. }
  448. // 逐一设置app配置
  449. for(String appId: apps) {
  450. // 检查appId是否已授权
  451. WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
  452. if(authorizerInfo == null) {
  453. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  454. }
  455. if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
  456. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  457. }
  458. codeCommit(appId, userVersion, userDesc, templateId);
  459. }
  460. return new ResultData();
  461. }
  462. private void codeCommit(String appId, String userVersion, String userDesc, Long templateId) {
  463. WxAppinfo appinfo = appinfoService.getByAppId(appId);
  464. // int iAppType = 0;
  465. // String appTypeStr = userVersion.substring(0, 1);
  466. // if(appTypeStr.equalsIgnoreCase(Constant.C))
  467. // iAppType = EnumAppType.C.getCode();
  468. // else if(appTypeStr.equalsIgnoreCase(Constant.B))
  469. // iAppType = EnumAppType.B.getCode();
  470. //
  471. // if(!appinfo.getType().equals(iAppType)) {
  472. // // 如果版本号与小程序的类型不一致,不提交版本
  473. // return;
  474. // }
  475. // get ext json
  476. WxWeappExtSet extSetQ = new WxWeappExtSet();
  477. extSetQ.setAppId(appId);
  478. WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
  479. WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId);
  480. if(extSet != null) {
  481. boolean codeCommitStatus = false;
  482. if(codeStatus != null && codeStatus.getCodeStatus().equals(0) && codeStatus.getUserVersion().equals(userVersion)) {
  483. codeCommitStatus = true;
  484. }
  485. if(!codeCommitStatus) {
  486. codeCommitStatus = doCodeCommit(userVersion, userDesc, templateId, appinfo, extSet, codeStatus);
  487. }
  488. }
  489. }
  490. @ApiOperation(value = "小程序批量提交审核", notes = "{\"type\":\"String\",\"userVersion\":\"String\",\"apps\":\"appid,appid\"}")
  491. @PostMapping("batchCodeAudit")
  492. public ResultData batchCodeAudit(@RequestBody Map<String, String> params) {
  493. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet");
  494. String appsStr = params.get(OpenConstant.APPS);
  495. String typeStr = params.get(OpenConstant.TYPE);
  496. String userVersion = params.get(OpenConstant.USER_VERSION);
  497. Integer type = null;
  498. try {
  499. type = Integer.parseInt(typeStr);
  500. } catch (Exception e) {
  501. logger.error("小程序类型");
  502. }
  503. if(StringUtils.isBlank(appsStr)) {
  504. if(type == null) {
  505. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  506. }
  507. WxWeappInfo authQ = new WxWeappInfo();
  508. authQ.setType(type);
  509. List<WxWeappInfo> appList = authorizerInfoService.getList(authQ);
  510. appsStr = "";
  511. StringBuilder sb = new StringBuilder();
  512. boolean bfirst = true;
  513. for(WxWeappInfo app: appList) {
  514. if(bfirst) {
  515. sb.append(app.getAuthorizerAppid());
  516. bfirst = false;
  517. } else {
  518. sb.append(app.getAuthorizerAppid()).append(",");
  519. }
  520. }
  521. }
  522. String [] apps = appsStr.split(",");
  523. // 逐一检查app的设置
  524. for(String appId: apps) {
  525. WxWeappExtSet extSetQ = new WxWeappExtSet();
  526. extSetQ.setAppId(appId);
  527. WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
  528. if(extSet == null) {
  529. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  530. }
  531. if(StringUtils.isBlank(extSet.getExtJson())) {
  532. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  533. }
  534. if(StringUtils.isBlank(extSet.getReleaseJson())) {
  535. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  536. }
  537. }
  538. // 逐一设置app配置
  539. for(String appId: apps) {
  540. // 检查appId是否已授权
  541. WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId);
  542. if(authorizerInfo == null) {
  543. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  544. }
  545. if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) {
  546. return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH);
  547. }
  548. codeAudit(appId, userVersion);
  549. }
  550. return new ResultData();
  551. }
  552. private void codeAudit(String appId, String userVersion) {
  553. // get ext json
  554. WxWeappExtSet extSetQ = new WxWeappExtSet();
  555. extSetQ.setAppId(appId);
  556. WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ);
  557. WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId);
  558. if(extSet != null) {
  559. boolean codeCommitStatus = false;
  560. if(codeStatus != null
  561. && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode())
  562. && codeStatus.getUserVersion().equals(userVersion)) {
  563. codeCommitStatus = true;
  564. }
  565. if(codeCommitStatus) {
  566. WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId);
  567. if(auditStatus != null && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
  568. logger.error("审核中不能再提交审核");
  569. return;
  570. }
  571. doCodeAudit(codeStatus, auditStatus, extSet);
  572. } else {
  573. logger.error("CODE提交失败");
  574. }
  575. }
  576. }
  577. private boolean doCodeCommit(String userVersion, String userDesc, Long templateId, WxAppinfo appinfo, WxWeappExtSet extSet, WxWeappCodeStatus codeStatus) {
  578. Gson gson = new GsonBuilder().create();
  579. // code提交
  580. boolean codeCommitStatus = false;
  581. String codeErrCode = "";
  582. try {
  583. WxMaOpenCommitExtInfo extInfo = gson.fromJson(extSet.getExtJson(), new TypeToken<WxMaOpenCommitExtInfo>() {}.getType());
  584. logger.info("OLD: " + extInfo.toString());
  585. // 自动修改提交的版本
  586. if(extInfo.getExtMap().containsKey(OpenConstant.APP_VERSION)) {
  587. extInfo.getExtMap().put(OpenConstant.APP_VERSION, userVersion);
  588. }
  589. logger.info("NEW: " + extInfo.toString());
  590. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appinfo.getAppId());
  591. TtOpenResult openRet = openMaService.codeCommit(templateId, userVersion, userDesc, extInfo);
  592. logger.info(openRet.toString());
  593. if (openRet.isSuccess()) {
  594. codeCommitStatus = true;
  595. }
  596. codeErrCode = gson.toJson(openRet);
  597. } catch (WxErrorException e) {
  598. codeCommitStatus = false;
  599. codeErrCode = e.getMessage();
  600. logger.error(codeErrCode);
  601. }
  602. if (codeStatus == null) {
  603. codeStatus = new WxWeappCodeStatus();
  604. codeStatus.setId(appinfo.getId());
  605. codeStatus.setTenantId(appinfo.getTenantId());
  606. codeStatus.setAppId(appinfo.getAppId());
  607. if (appinfo != null) {
  608. codeStatus.setType(appinfo.getType());
  609. codeStatus.setPlat(appinfo.getPlat());
  610. }
  611. codeStatus.setUserVersion(userVersion);
  612. codeStatus.setVersionDesc(userDesc);
  613. if(codeCommitStatus) {
  614. codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode());
  615. } else {
  616. codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
  617. }
  618. codeStatus.setCodeErrCode(codeErrCode);
  619. codeStatus.setCodeTime(new Date());
  620. weappCodeStatusService.saveStatus(codeStatus);
  621. } else {
  622. codeStatus.setUserVersion(userVersion);
  623. codeStatus.setVersionDesc(userDesc);
  624. if(codeCommitStatus) {
  625. codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode());
  626. } else {
  627. codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode());
  628. }
  629. codeStatus.setCodeErrCode(codeErrCode);
  630. codeStatus.setCodeTime(new Date());
  631. weappCodeStatusService.updateStatus(codeStatus);
  632. }
  633. return codeCommitStatus;
  634. }
  635. private void doCodeAudit(WxWeappCodeStatus codeStatus, WxWeappAuditStatus auditStatus, WxWeappExtSet extSet) {
  636. Gson gson = new GsonBuilder().create();
  637. boolean submitStatus = false;
  638. Long auditid = null;
  639. String codeErrCode = "";
  640. try {
  641. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(codeStatus.getAppId());
  642. TtOpenResult openRet = openMaService.submitAudit();
  643. logger.info(openRet.toString());
  644. if(openRet.isSuccess()) {
  645. submitStatus = true;
  646. } else {
  647. submitStatus = false;
  648. }
  649. codeErrCode = gson.toJson(openRet);
  650. } catch (WxErrorException e) {
  651. logger.error(e.getMessage());
  652. submitStatus = false;
  653. codeErrCode = e.getMessage();
  654. }
  655. if (auditStatus == null) {
  656. auditStatus = new WxWeappAuditStatus();
  657. auditStatus.setId(codeStatus.getId());
  658. auditStatus.setTenantId(codeStatus.getTenantId());
  659. auditStatus.setAppId(codeStatus.getAppId());
  660. auditStatus.setType(codeStatus.getType());
  661. auditStatus.setPlat(codeStatus.getPlat());
  662. auditStatus.setUserVersion(codeStatus.getUserVersion());
  663. auditStatus.setVersionDesc(codeStatus.getVersionDesc());
  664. auditStatus.setAuditid(auditid);
  665. if(submitStatus) {
  666. auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
  667. } else {
  668. auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
  669. }
  670. auditStatus.setAuditErrCode(codeErrCode);
  671. auditStatus.setAuditTime(new Date());
  672. weappAuditStatusService.saveStatus(auditStatus);
  673. } else {
  674. auditStatus.setAuditid(auditid);
  675. if(!submitStatus) {
  676. if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion())
  677. && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) {
  678. // 当前审核中的数据不能替换
  679. return;
  680. }
  681. auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
  682. } else {
  683. auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
  684. }
  685. auditStatus.setUserVersion(codeStatus.getUserVersion());
  686. auditStatus.setVersionDesc(codeStatus.getVersionDesc());
  687. auditStatus.setAuditErrCode(codeErrCode);
  688. auditStatus.setAuditTime(new Date());
  689. weappAuditStatusService.updateStatus(auditStatus);
  690. }
  691. }
  692. @ApiOperation(value = "批量审核查询", notes = "{\"type\":\"string\",\"version\":\"string\"}")
  693. @PostMapping("batchAuditQuery")
  694. public ResultData batchAuditQuery(@RequestBody Map<String, String> params) {
  695. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditQuery");
  696. Gson gson = new GsonBuilder().create();
  697. String typeStr = params.get(OpenConstant.TYPE);
  698. String version = params.get(OpenConstant.VERSION);
  699. Integer type = null;
  700. try {
  701. type = Integer.parseInt(typeStr);
  702. } catch (Exception e) {
  703. logger.error(e.getMessage());
  704. }
  705. WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo();
  706. if(StringUtils.isNotBlank(typeStr)) {
  707. queryVo.setType(type);
  708. }
  709. if(StringUtils.isNotBlank(version)) {
  710. queryVo.setUserVersion(version);
  711. }
  712. queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
  713. List<WxWeappAuditStatusVo> apps = weappAuditStatusService.getList(queryVo);
  714. apps.stream().forEach( auditStatus -> {
  715. // 审核中,可以发起审核查询
  716. try {
  717. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(auditStatus.getAppId());
  718. WxOpenMaQueryAuditResult openResult = openMaService.getLatestAuditStatus();
  719. logger.info(openResult.toString());
  720. if (openResult.isSuccess()) {
  721. // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回
  722. switch (openResult.getStatus().intValue()) {
  723. case 0:
  724. auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode());
  725. break;
  726. case 1:
  727. auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode());
  728. break;
  729. case 2:
  730. auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
  731. break;
  732. case 3:
  733. auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
  734. break;
  735. default:
  736. auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
  737. break;
  738. }
  739. auditStatus.setAuditErrCode(gson.toJson(openResult));
  740. auditStatus.setAuditid(openResult.getAuditId());
  741. auditStatus.setAuditTime(new Date());
  742. weappAuditStatusService.updateStatus(auditStatus);
  743. }
  744. } catch (WxErrorException e) {
  745. logger.error(e.getMessage());
  746. }
  747. });
  748. return new ResultData();
  749. }
  750. @ApiOperation(value = "批量审核撤回", notes = "{\"type\":\"string\",\"version\":\"string\"}")
  751. @PostMapping("batchAuditCancel")
  752. public ResultData batchAuditCancel(@RequestBody Map<String, String> params) {
  753. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditCancel");
  754. Gson gson = new GsonBuilder().create();
  755. String typeStr = params.get(OpenConstant.TYPE);
  756. String version = params.get(OpenConstant.VERSION);
  757. Integer type = null;
  758. try {
  759. type = Integer.parseInt(typeStr);
  760. } catch (Exception e) {
  761. logger.error(e.getMessage());
  762. }
  763. WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo();
  764. if(StringUtils.isNotBlank(typeStr)) {
  765. queryVo.setType(type);
  766. }
  767. if(StringUtils.isNotBlank(version)) {
  768. queryVo.setUserVersion(version);
  769. }
  770. queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode());
  771. List<WxWeappAuditStatusVo> apps = weappAuditStatusService.getList(queryVo);
  772. apps.stream().forEach( auditStatus -> {
  773. // 审核通过,已发布不可撤回
  774. try {
  775. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(auditStatus.getAppId());
  776. WxOpenResult openResult = openMaService.undoCodeAudit();
  777. logger.info(openResult.toString());
  778. if(openResult.isSuccess()) {
  779. auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode());
  780. auditStatus.setAuditErrCode(gson.toJson(openResult));
  781. auditStatus.setAuditTime(new Date());
  782. weappAuditStatusService.updateStatus(auditStatus);
  783. }
  784. } catch (WxErrorException e) {
  785. logger.error(e.getMessage());
  786. }
  787. });
  788. return new ResultData();
  789. }
  790. @ApiOperation(value = "批量发布", notes = "{\"type\":\"string\", \"version\":\"string\"}")
  791. @PostMapping("batchRelease")
  792. public ResultData batchRelease(@RequestBody Map<String, String> params) {
  793. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchRelease");
  794. Gson gson = new GsonBuilder().create();
  795. String typeStr = params.get(OpenConstant.TYPE);
  796. String version = params.get(OpenConstant.VERSION);
  797. Integer type = null;
  798. try {
  799. type = Integer.parseInt(typeStr);
  800. } catch (Exception e) {
  801. logger.error(e.getMessage());
  802. }
  803. WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo();
  804. if(StringUtils.isNotBlank(typeStr)) {
  805. queryVo.setType(type);
  806. }
  807. if(StringUtils.isNotBlank(version)) {
  808. queryVo.setUserVersion(version);
  809. }
  810. queryVo.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode());
  811. List<WxWeappAuditStatusVo> apps = weappAuditStatusService.getList(queryVo);
  812. apps.stream().forEach( auditStatus -> {
  813. boolean isUpdate = false;
  814. WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(auditStatus.getAppId());
  815. if(releaseStatus != null) {
  816. // 当前版本已发布成功,跳过
  817. if(releaseStatus.getUserVersion().equals(version)
  818. && releaseStatus.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) {
  819. return;
  820. }
  821. releaseStatus.setUserVersion(auditStatus.getUserVersion());
  822. releaseStatus.setVersionDesc(auditStatus.getVersionDesc());
  823. isUpdate = true;
  824. } else {
  825. releaseStatus = new WxWeappReleaseStatus();
  826. releaseStatus.setId(auditStatus.getId());
  827. releaseStatus.setTenantId(auditStatus.getTenantId());
  828. releaseStatus.setAppId(auditStatus.getAppId());
  829. releaseStatus.setType(auditStatus.getType());
  830. releaseStatus.setPlat(auditStatus.getPlat());
  831. releaseStatus.setUserVersion(auditStatus.getUserVersion());
  832. releaseStatus.setVersionDesc(auditStatus.getVersionDesc());
  833. }
  834. try {
  835. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(auditStatus.getAppId());
  836. TtOpenResult openRet = openMaService.releaesAudited();
  837. logger.info(openRet.toString());
  838. boolean releaseSuccess = false;
  839. if(openRet.isSuccess()) {
  840. releaseSuccess = true;
  841. }
  842. if(releaseSuccess) {
  843. releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
  844. } else {
  845. releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode());
  846. }
  847. releaseStatus.setReleaseErrCode(gson.toJson(openRet));
  848. releaseStatus.setReleaseTime(new Date());
  849. if(isUpdate) {
  850. weappReleaseStatusService.updateStatus(releaseStatus);
  851. } else {
  852. weappReleaseStatusService.saveStatus(releaseStatus);
  853. }
  854. } catch (WxErrorException e) {
  855. logger.error(e.getMessage());
  856. if(e.getError().getErrorCode() == OpenConstant.ERR_APP_IS_RELEASED) {
  857. releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode());
  858. } else {
  859. releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode());
  860. }
  861. releaseStatus.setReleaseErrCode(e.getMessage());
  862. releaseStatus.setReleaseTime(new Date());
  863. if(isUpdate) {
  864. weappReleaseStatusService.updateStatus(releaseStatus);
  865. } else {
  866. weappReleaseStatusService.saveStatus(releaseStatus);
  867. }
  868. }
  869. });
  870. return new ResultData();
  871. }
  872. @ApiOperation(value = "小程序code提交状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
  873. @GetMapping("codeStatusList")
  874. @ApiImplicitParams({
  875. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  876. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  877. public ResultData codeStatusList(@ModelAttribute WxWeappCodeStatusVo weappCodeStatusVo, Integer pageNum, Integer pageSize) {
  878. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::codeStatusList");
  879. if (null == weappCodeStatusVo) {
  880. weappCodeStatusVo = new WxWeappCodeStatusVo();
  881. } else {
  882. if(StringUtils.isBlank(weappCodeStatusVo.getAppId())) {
  883. weappCodeStatusVo.setAppId(null);
  884. }
  885. if(StringUtils.isBlank(weappCodeStatusVo.getName())) {
  886. weappCodeStatusVo.setName(null);
  887. }
  888. }
  889. weappCodeStatusVo.setPlat(EnumAppPlat.TOUTIAO.getCode());
  890. weappCodeStatusVo.setSortColumns(BaseEntity.SortField.CodeTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC, BaseEntity.SortField.UserVersion_DESC);
  891. final PageInfo<WxWeappCodeStatusVo> page = weappCodeStatusService.listAsPage(weappCodeStatusVo, pageNum, pageSize);
  892. return new ResultData(page);
  893. }
  894. @ApiOperation(value = "小程序审核状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
  895. @GetMapping("auditStatusList")
  896. @ApiImplicitParams({
  897. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  898. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  899. public ResultData auditStatusList(@ModelAttribute WxWeappAuditStatusVo weappAuditStatusVo, Integer pageNum, Integer pageSize) {
  900. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::auditStatusList");
  901. if (null == weappAuditStatusVo) {
  902. weappAuditStatusVo = new WxWeappAuditStatusVo();
  903. } else {
  904. if(StringUtils.isBlank(weappAuditStatusVo.getAppId())) {
  905. weappAuditStatusVo.setAppId(null);
  906. }
  907. if(StringUtils.isBlank(weappAuditStatusVo.getName())) {
  908. weappAuditStatusVo.setName(null);
  909. }
  910. }
  911. weappAuditStatusVo.setPlat(EnumAppPlat.TOUTIAO.getCode());
  912. weappAuditStatusVo.setSortColumns(BaseEntity.SortField.AuditTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC, BaseEntity.SortField.UserVersion_DESC);
  913. final PageInfo<WxWeappAuditStatusVo> page = weappAuditStatusService.listAsPage(weappAuditStatusVo, pageNum, pageSize);
  914. return new ResultData(page);
  915. }
  916. @ApiOperation(value = "小程序发布状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version")
  917. @GetMapping("releaseStatusList")
  918. @ApiImplicitParams({
  919. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  920. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  921. public ResultData releaseStatusList(@ModelAttribute WxWeappReleaseStatusVo weappReleaseStatusVo, Integer pageNum, Integer pageSize) {
  922. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::releaseStatusList");
  923. if (null == weappReleaseStatusVo) {
  924. weappReleaseStatusVo = new WxWeappReleaseStatusVo();
  925. } else {
  926. if(StringUtils.isBlank(weappReleaseStatusVo.getAppId())) {
  927. weappReleaseStatusVo.setAppId(null);
  928. }
  929. if(StringUtils.isBlank(weappReleaseStatusVo.getName())) {
  930. weappReleaseStatusVo.setName(null);
  931. }
  932. }
  933. weappReleaseStatusVo.setPlat(EnumAppPlat.TOUTIAO.getCode());
  934. weappReleaseStatusVo.setSortColumns(BaseEntity.SortField.ReleaseTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC,BaseEntity.SortField.UserVersion_DESC);
  935. final PageInfo<WxWeappReleaseStatusVo> page = weappReleaseStatusService.listAsPage(weappReleaseStatusVo, pageNum, pageSize);
  936. return new ResultData(page);
  937. }
  938. @ApiOperation("小程序code提交版本列表")
  939. @GetMapping("codeVersionList")
  940. @ApiImplicitParams({
  941. @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)})
  942. public ResultData getCodeVersionList(Integer type) {
  943. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getCodeVersionList");
  944. final List<Map> list = weappCodeStatusService.getVersionList(type,EnumAppPlat.TOUTIAO.getCode());
  945. return new ResultData(list);
  946. }
  947. @ApiOperation("小程序审核版本列表")
  948. @GetMapping("auditVersionList")
  949. @ApiImplicitParams({
  950. @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true),
  951. @ApiImplicitParam(name = "status", value = "审核状态", dataType = "int", paramType = "query")})
  952. public ResultData getAuditVersionList(Integer type, Integer status) {
  953. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getAuditVersionList");
  954. final List<Map> list = weappAuditStatusService.getVersionList(type,EnumAppPlat.TOUTIAO.getCode(), status);
  955. return new ResultData(list);
  956. }
  957. @ApiOperation("小程序发布版本列表")
  958. @GetMapping("releaseVersionList")
  959. @ApiImplicitParams({
  960. @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)})
  961. public ResultData getReleaseVersionList(Integer type) {
  962. logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getReleaseVersionList");
  963. final List<Map> list = weappReleaseStatusService.getVersionList(type,EnumAppPlat.TOUTIAO.getCode());
  964. return new ResultData(list);
  965. }
  966. /*
  967. * 0. 回调搭建好
  968. * 1. wx_appinfo配置好
  969. *
  970. * 10. 授权
  971. * 11. 设置服务器域名及业务域名 - B/C 配置表
  972. * C 服务器域名 c.malls.iformall.com
  973. * 业务域名 c.malls.iformall.com,game.malls.iformall.com
  974. * B 服务器域名 b.malls.iformall.com
  975. * 业务域名 mobile.malls.iformall.com,admin.malls.iformall.com
  976. * C 服务器域名 ciformall.youlane.cn
  977. * 业务域名 ciformall.youlane.cn,game.youlane.cn
  978. * B 服务器域名 biformall.youlane.cn
  979. * 业务域名 mobile.youlane.cn,mall.youlane.cn
  980. * C 服务器域名 ctest.malls.iformall.com
  981. * 业务域名 ctest.malls.iformall.com,gametest.malls.iformall.com
  982. * B 服务器域名 btest.malls.iformall.com
  983. * 业务域名 mobiletest.malls.iformall.com,admintest.malls.iformall.com
  984. * 12. 设置微信基础版本 - 配置
  985. * 2.0.9
  986. * 13. 设置微信模板 - 配置
  987. * 核销成功模板 AT0423 14,15,16,7,10,3,9
  988. * 核销失败模板 AT1824 1,3,4,5
  989. * 14. 草稿提交
  990. * 15. 模板
  991. * 16. 上传小程序代码 - 配置 ext.json
  992. * 17. 体验二维码
  993. * 18. 提交审核 - json --- 获取审核ID
  994. * 19. 获取审核结果 - 基于审核ID查询 -- event 回调
  995. * 20. 审核撤回
  996. * 21. 发布已通过审核的小程序
  997. * 22. oauth2refreshAccessToken
  998. */
  999. @ApiOperation("获取体验小程序的体验二维码")
  1000. @GetMapping("/getQrcode")
  1001. public void getQrcode(@RequestParam(value = "appId") String appId, @RequestParam(value = "pagePath") String pagePath,
  1002. @RequestParam(value = "params", required = false) Map<String, String> params,
  1003. HttpServletResponse response, HttpServletRequest req) {
  1004. try {
  1005. TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId);
  1006. File file = openMaService.getTestQrcode(pagePath,params);
  1007. ServletOutputStream out = response.getOutputStream();
  1008. response.reset();
  1009. response.setContentType("image/jpeg");
  1010. String agent = req.getHeader("user-agent");
  1011. String filename = "QRCode.jpg";
  1012. if (agent.contains("Firefox")) {
  1013. response.setHeader("Content-disposition",
  1014. "attachment; filename=" + new String(filename.getBytes("GB2312"),"ISO-8859-1"));
  1015. } else {
  1016. response.setHeader("Content-disposition",
  1017. "attachment; filename=" + URLEncoder.encode(filename,"UTF-8"));
  1018. }
  1019. // 循环取出流中的数据
  1020. byte[] b = new byte[1024];
  1021. int len;
  1022. InputStream inStream = new FileInputStream(file);
  1023. while ((len = inStream.read(b)) > 0)
  1024. response.getOutputStream().write(b, 0, len);
  1025. inStream.close();
  1026. } catch (WxErrorException e) {
  1027. logger.error(e.getMessage());
  1028. } catch (IOException e) {
  1029. logger.error(e.getMessage());
  1030. }
  1031. }
  1032. }