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.

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