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.

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