package com.iformall.controller; import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageInfo; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.iformall.common.ErrorCode; import com.iformall.common.Result; import com.iformall.common.ResultData; import com.iformall.controller.base.BaseController; import com.iformall.domain.po.*; import com.iformall.domain.vo.WxWeappAuditStatusVo; import com.iformall.domain.vo.WxWeappCodeStatusVo; import com.iformall.domain.vo.WxWeappInfo; import com.iformall.domain.vo.WxWeappReleaseStatusVo; import com.iformall.enums.*; import com.iformall.service.*; import com.iformall.service.toutiao.FmTtOpenService; import com.iformall.service.toutiao.api.TtOpenMaService; import com.iformall.service.toutiao.miniapp.TtMaService; import com.iformall.service.wechat.FmOpenService; import com.iformall.utils.Constant; import com.iformall.utils.OpenConstant; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.open.api.WxOpenMaService; import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo; import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage; import me.chanjar.weixin.open.bean.result.WxOpenMaDomainResult; import me.chanjar.weixin.open.bean.result.WxOpenMaQueryAuditResult; import me.chanjar.weixin.open.bean.result.WxOpenMaSubmitAuditResult; import me.chanjar.weixin.open.bean.result.WxOpenResult; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.*; /** * Stormeye Wu */ @Controller @RequestMapping("/weapp") @Api(description = "小程序") public class WxWeappInfoController extends BaseController { private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private Integer getFmDeploy; @Autowired private WxAuthorizerInfoService authorizerInfoService; @Autowired private WxWeappBasicSetService weappBasicSetService; @Autowired private WxWeappExtSetService weappExtSetService; @Autowired private WxWeappCodeStatusService weappCodeStatusService; @Autowired private WxWeappAuditStatusService weappAuditStatusService; @Autowired private WxWeappReleaseStatusService weappReleaseStatusService; @Autowired private FmTtOpenService openService; @Autowired private WxAppinfoService appinfoService; @Autowired private WxTemplateMsgService templateMsgService; @ApiOperation(value = "小程序分页列表接口", notes = "查询支持小程序类型,名称,appid,version") @GetMapping("list") @ApiImplicitParams({ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) public ResultData list(@ModelAttribute WxWeappInfo weappInfo, Integer pageNum, Integer pageSize) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list"); if (null == weappInfo) { weappInfo = new WxWeappInfo(); } else { if(StringUtils.isBlank(weappInfo.getName())) { weappInfo.setName(null); } } weappInfo.setPlat(EnumAppPlat.TOUTIAO.getCode()); weappInfo.setSortColumns(BaseEntity.SortField.TenantId_ASC,BaseEntity.SortField.Type_ASC,BaseEntity.SortField.Name_ASC); final PageInfo page = authorizerInfoService.listVoAsPage(weappInfo, pageNum, pageSize); return new ResultData(page); } @ApiOperation("小程序列表接口") @GetMapping("allist") public ResultData getList(@ModelAttribute WxWeappInfo weappInfo) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list"); if (null == weappInfo) { weappInfo = new WxWeappInfo(); } else { if(StringUtils.isBlank(weappInfo.getName())) { weappInfo.setName(null); } } weappInfo.setSortColumns(BaseEntity.SortField.CurrentVersion_DESC); final List list = authorizerInfoService.getList(weappInfo); return new ResultData(list); } @ApiOperation(value = "APPs基础设置(服务器域名、业务域名、基础版本、微信模板)", notes = "{\"apps\":\"appid,appid\",\"type\":\"String\"}") @PostMapping("batchBasicSet") public ResultData batchSet(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchBasicSet"); String appsStr = params.get(OpenConstant.APPS); String typeStr = params.get(OpenConstant.TYPE); if(StringUtils.isBlank(typeStr)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空"); } Integer type = 0; try { type = Integer.parseInt(typeStr); } catch (Exception e) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } // 检查基础配置参数 WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet(); weappBasicSetQ.setType(type); weappBasicSetQ.setDeploy(getFmDeploy); WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ); if(weappBasicSet == null) { logger.error("未找到相关的基础设置参数"); return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR); } JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl()); if(domainObj == null) { logger.error("未找到相关的基础设置参数"); return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR); } JSONObject templeObj = JSON.parseObject(weappBasicSet.getTemplateInfo()); logger.info(templeObj.toJSONString()); if(StringUtils.isBlank(appsStr)) { WxWeappInfo weappInfoQ = new WxWeappInfo(); weappInfoQ.setType(type); List list = authorizerInfoService.getList(weappInfoQ); for(WxWeappInfo info: list) { appsStr += info.getAuthorizerAppid() + ","; } appsStr = appsStr.substring(0, appsStr.length() - 1); } // 逐一设置app配置 String [] apps = appsStr.split(","); for(String appId: apps) { // 检查appId是否已授权 WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); if(authorizerInfo == null) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } ResultData openRet = setBasicForAppId(appId, weappBasicSet, domainObj, templeObj); if (openRet != null) return openRet; } return new ResultData(); } @ApiOperation(value = "APP清除域名", notes = "{\"weappId\":\"weappId\",\"type\":\"String\"}") @PostMapping("cleanDomain") public ResultData cleanDomain(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::cleanDomain"); String appId = params.get(OpenConstant.WE_APPID); String typeStr = params.get(OpenConstant.TYPE); if(StringUtils.isBlank(typeStr)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空"); } if(StringUtils.isBlank(appId)) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "weappId参数不能为空"); } Integer type = 0; try { type = Integer.parseInt(typeStr); } catch (Exception e) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } // 检查基础配置参数 WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet(); weappBasicSetQ.setType(type); weappBasicSetQ.setDeploy(getFmDeploy); WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ); if(weappBasicSet == null) { logger.error("未找到相关的基础设置参数"); return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR); } JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl()); if(domainObj == null) { logger.error("未找到相关的基础设置参数"); return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR); } // 检查appId是否已授权 WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); if(authorizerInfo == null) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId); try { modifyDomainUrl(OpenConstant.DEL, domainObj, authorizerInfo, openMaService); } catch (WxErrorException e) { logger.error(e.getMessage()); return new ResultData(Result.ERROR, e.getMessage()); } return new ResultData(); } private ResultData setBasicForAppId(String appId, WxWeappBasicSet weappBasicSet, JSONObject domainObj, JSONObject templeObj) { WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); if(authorizerInfo == null) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId); try { setBasicVersion(weappBasicSet, authorizerInfo, openMaService); modifyDomainUrl(OpenConstant.SET, domainObj, authorizerInfo, openMaService); } catch (WxErrorException e) { logger.error(e.getMessage()); return new ResultData(Result.ERROR, e.getMessage()); } // // 设置微信模板 // if(weappBasicSet.getType().equals(EnumAppType.C.getCode())) { // if(authorizerInfo.getTemplateStatus() == null || // !authorizerInfo.getTemplateStatus().equals(EnumWxAuthotizationTemplateStatus.SUCCESS.getCode())) { // // 模板未设置或者设置失败 // // 获取模板 // WxAppinfo appinfo = appinfoService.getByAppId(appId); // TtMaService maService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId); // // try { //// setBasicTemplateMsgVerifySuccess(templeObj, appinfo, maService); //// setBasicTemplateMsgVerifyFail(templeObj, appinfo, maService); //// setBasicTemplateMsgPressSuccess(templeObj, appinfo, maService); // // // 更新状态 // authorizerInfo.setTemplateStatus(EnumWxAuthotizationTemplateStatus.SUCCESS.getCode()); // authorizerInfo.setTemplateTime(new Date()); // authorizerInfo.setUpdateTime(new Date()); // authorizerInfoService.updateTemplate(authorizerInfo); // } catch (WxErrorException e) { // logger.error(e.getMessage()); // // 更新状态 // authorizerInfo.setTemplateStatus(EnumWxAuthotizationTemplateStatus.Fail.getCode()); // authorizerInfo.setTemplateTime(new Date()); // authorizerInfo.setUpdateTime(new Date()); // authorizerInfoService.updateTemplate(authorizerInfo); // return new ResultData(Result.ERROR, e.getMessage()); // } // } // } // 设置成功返回null return null; } // private void setBasicTemplateMsg(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService, Integer msgCode, String msgTypeStr) throws WxErrorException { // JSONObject msgObj; // try { // msgObj = templeObj.getJSONObject(msgTypeStr); // } catch (Exception e) { // logger.error(e.getMessage()); // return; // } // logger.info(msgObj.toJSONString()); // String id = msgObj.getString(OpenConstant.ID); // JSONArray keyidlist = msgObj.getJSONArray(OpenConstant.KEY_ID_LIST); // String customParam = msgObj.getString(OpenConstant.CUSTOM_PARAM); // logger.info(customParam); // JSONObject customParamObj = JSON.parseObject(customParam); // List keyArr1 = getIdList(keyidlist); // if (appinfo != null) { // // wx_template_msg // WxTemplateMsg templateMsgQ = new WxTemplateMsg(); // templateMsgQ.setTenantId(appinfo.getTenantId()); // logger.info(msgCode.toString()); // templateMsgQ.setType(msgCode); // WxTemplateMsg templateMsg = templateMsgService.getByObj(templateMsgQ); // if (templateMsg != null) { // templateMsg.setCustomParam(customParamObj.toJSONString()); // templateMsgService.saveOrUpdate(templateMsg); // } else { // WxMaTemplateAddResult ret = maService.getTemplateService().addTemplate(id, keyArr1); // logger.info(ret.toString()); // templateMsgQ.setTemplateId(ret.getTemplateId()); // templateMsgQ.setCustomParam(customParamObj.toJSONString()); // templateMsgService.saveOrUpdate(templateMsgQ); // } // } // } // private void setBasicTemplateMsgVerifySuccess(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService) throws WxErrorException { // // 核销成功消息 // setBasicTemplateMsg(templeObj, appinfo, maService, EnumTemplateType.VERIFY_SUCCESS.getCode(), OpenConstant.VERIFY_SUCC); // } // // private void setBasicTemplateMsgVerifyFail(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService) throws WxErrorException { // // 核销失败消息 // setBasicTemplateMsg(templeObj, appinfo, maService, EnumTemplateType.VERIFY_FAIL.getCode(), OpenConstant.VERIFY_FAIL); // } // // private void setBasicTemplateMsgPressSuccess(JSONObject templeObj, WxAppinfo appinfo, TtMaService maService) throws WxErrorException { // // 砍价成功消息 // logger.info("setBasicTemplateMsgPressSuccess begin.."); // /// EnumTemplateType.PRESS_PRICE_SUCCESS.getCode() // setBasicTemplateMsg(templeObj, appinfo, maService, 3, "press_success"); // logger.info("setBasicTemplateMsgPressSuccess end."); // } private void modifyDomainUrl(String action, JSONObject domainObj, WxAuthorizerInfo authorizerInfo, TtOpenMaService openMaService) throws WxErrorException { // 服务器域名 JSONObject urlObj = domainObj.getJSONObject(OpenConstant.URL); List requestDomain = getUrlList(urlObj.getJSONArray(OpenConstant.REQ_DOMAIN)); List wsrequestDomain = getUrlList(urlObj.getJSONArray(OpenConstant.WS_DOMAIN)); List uploadDomain = getUrlList(urlObj.getJSONArray(OpenConstant.UPLOAD_DOMAIN)); List downloadDomain = getUrlList(urlObj.getJSONArray(OpenConstant.DOWNLOAD_DOMAIN)); logger.info(downloadDomain.toString()); WxOpenMaDomainResult openRet = openMaService.modifyDomain(action, requestDomain, wsrequestDomain, uploadDomain, downloadDomain); logger.info(openRet.toString()); if(openRet.isSuccess()) { logger.info("设置服务器域名成功"); authorizerInfo.setDomainStatus(EnumEnableType.SUCC.getCode()); authorizerInfo.setDomainTime(new Date()); authorizerInfo.setUpdateTime(new Date()); } else { logger.info("设置服务器域名成功"); authorizerInfo.setDomainStatus(EnumEnableType.FAIL.getCode()); authorizerInfo.setDomainTime(new Date()); authorizerInfo.setUpdateTime(new Date()); } authorizerInfoService.updateDomainUrl(authorizerInfo); // 业务域名 JSONObject webObj = domainObj.getJSONObject(OpenConstant.WEB); List urlList = getUrlList(webObj.getJSONArray(OpenConstant.WEB_DOMAIN)); String openRet1 = openMaService.setWebViewDomain(action, urlList); logger.info(openRet1); JSONObject webRetObj = JSON.parseObject(openRet1); if(webRetObj.getInteger(OpenConstant.ERRCODE).equals(0)) { logger.info("设置服务器业务域名成功"); authorizerInfo.setWebdomainStatus(EnumEnableType.SUCC.getCode()); authorizerInfo.setWebdomainTime(new Date()); authorizerInfo.setUpdateTime(new Date()); } else { logger.info("设置服务器业务域名失败"); authorizerInfo.setWebdomainStatus(EnumEnableType.FAIL.getCode()); authorizerInfo.setWebdomainTime(new Date()); authorizerInfo.setUpdateTime(new Date()); } authorizerInfoService.updateWebDomainUrl(authorizerInfo); } private void setBasicVersion(WxWeappBasicSet weappBasicSet, WxAuthorizerInfo authorizerInfo, TtOpenMaService openMaService) throws WxErrorException { // 设置基础版本 String versionRet = openMaService.setSupportVersion(weappBasicSet.getVersion()); logger.info(versionRet); JSONObject verObj = JSON.parseObject(versionRet); if(verObj.getInteger(OpenConstant.ERRCODE).equals(OpenConstant.SUCC)) { authorizerInfo.setBaseStatus(EnumEnableType.SUCC.getCode()); } else { authorizerInfo.setBaseStatus(EnumEnableType.FAIL.getCode()); } authorizerInfo.setBaseTime(new Date()); authorizerInfo.setUpdateTime(new Date()); authorizerInfoService.updateBaseVersion(authorizerInfo); } private List getIdList(JSONArray keyidlist) { List keyArr = new ArrayList(); for (int i = 0; i < keyidlist.size(); i++) { keyArr.add(keyidlist.getIntValue(i)); } return keyArr; } private List getUrlList(JSONArray urlList) { List keyArr = new ArrayList(); for (int i = 0; i < urlList.size(); i++) { keyArr.add(urlList.getString(i)); } return keyArr; } @ApiOperation(value = "批量授权的小程序code提交", notes = "{\"apps\":\"appid,appid\",\"templateId\":\"String\",\"type\":\"String\",\"userVersion\":\"String\",\"userDesc\":\"String\"}") @PostMapping("batchCodeCommit") public ResultData batchCodeCommit(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet"); String appsStr = params.get(OpenConstant.APPS); String templateIdStr = params.get(OpenConstant.TEMPLATE_ID); String typeStr = params.get(OpenConstant.TYPE); String userVersion = params.get(OpenConstant.USER_VERSION); String userDesc = params.get(OpenConstant.USER_DESC); Integer type = null; Long templateId = null; try { templateId = Long.parseLong(templateIdStr); } catch (Exception e) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } try { type = Integer.parseInt(typeStr); } catch (Exception e) { logger.error("type为null"); } if(StringUtils.isBlank(appsStr)) { if(type == null) { logger.error("type为null"); return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } WxWeappInfo authQ = new WxWeappInfo(); authQ.setType(type); List appList = authorizerInfoService.getList(authQ); appsStr = ""; StringBuilder sb = new StringBuilder(); boolean bfirst = true; for(WxWeappInfo app: appList) { if(bfirst) { sb.append(app.getAuthorizerAppid()); bfirst = false; } else { sb.append(app.getAuthorizerAppid()).append(","); } } } String [] apps = appsStr.split(","); // 逐一检查app的设置 for(String appId: apps) { WxWeappExtSet extSetQ = new WxWeappExtSet(); extSetQ.setAppId(appId); WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); if(extSet == null) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } if(StringUtils.isBlank(extSet.getExtJson())) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } if(StringUtils.isBlank(extSet.getReleaseJson())) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } } // 逐一设置app配置 for(String appId: apps) { // 检查appId是否已授权 WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); if(authorizerInfo == null) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } codeCommit(appId, userVersion, userDesc, templateId); } return new ResultData(); } private void codeCommit(String appId, String userVersion, String userDesc, Long templateId) { WxAppinfo appinfo = appinfoService.getByAppId(appId); // int iAppType = 0; // String appTypeStr = userVersion.substring(0, 1); // if(appTypeStr.equalsIgnoreCase(Constant.C)) // iAppType = EnumAppType.C.getCode(); // else if(appTypeStr.equalsIgnoreCase(Constant.B)) // iAppType = EnumAppType.B.getCode(); // // if(!appinfo.getType().equals(iAppType)) { // // 如果版本号与小程序的类型不一致,不提交版本 // return; // } // get ext json WxWeappExtSet extSetQ = new WxWeappExtSet(); extSetQ.setAppId(appId); WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId); if(extSet != null) { boolean codeCommitStatus = false; if(codeStatus != null && codeStatus.getCodeStatus().equals(0) && codeStatus.getUserVersion().equals(userVersion)) { codeCommitStatus = true; } if(!codeCommitStatus) { codeCommitStatus = doCodeCommit(userVersion, userDesc, templateId, appinfo, extSet, codeStatus); } } } @ApiOperation(value = "小程序批量提交审核", notes = "{\"type\":\"String\",\"userVersion\":\"String\",\"apps\":\"appid,appid\"}") @PostMapping("batchCodeAudit") public ResultData batchCodeAudit(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet"); String appsStr = params.get(OpenConstant.APPS); String typeStr = params.get(OpenConstant.TYPE); String userVersion = params.get(OpenConstant.USER_VERSION); Integer type = null; try { type = Integer.parseInt(typeStr); } catch (Exception e) { logger.error("小程序类型"); } if(StringUtils.isBlank(appsStr)) { if(type == null) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } WxWeappInfo authQ = new WxWeappInfo(); authQ.setType(type); List appList = authorizerInfoService.getList(authQ); appsStr = ""; StringBuilder sb = new StringBuilder(); boolean bfirst = true; for(WxWeappInfo app: appList) { if(bfirst) { sb.append(app.getAuthorizerAppid()); bfirst = false; } else { sb.append(app.getAuthorizerAppid()).append(","); } } } String [] apps = appsStr.split(","); // 逐一检查app的设置 for(String appId: apps) { WxWeappExtSet extSetQ = new WxWeappExtSet(); extSetQ.setAppId(appId); WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); if(extSet == null) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } if(StringUtils.isBlank(extSet.getExtJson())) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } if(StringUtils.isBlank(extSet.getReleaseJson())) { return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } } // 逐一设置app配置 for(String appId: apps) { // 检查appId是否已授权 WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); if(authorizerInfo == null) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); } codeAudit(appId, userVersion); } return new ResultData(); } private void codeAudit(String appId, String userVersion) { // get ext json WxWeappExtSet extSetQ = new WxWeappExtSet(); extSetQ.setAppId(appId); WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId); if(extSet != null) { boolean codeCommitStatus = false; if(codeStatus != null && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode()) && codeStatus.getUserVersion().equals(userVersion)) { codeCommitStatus = true; } if(codeCommitStatus) { WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); if(auditStatus != null && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) { logger.error("审核中不能再提交审核"); return; } doCodeAudit(codeStatus, auditStatus, extSet); } else { logger.error("CODE提交失败"); } } } private boolean doCodeCommit(String userVersion, String userDesc, Long templateId, WxAppinfo appinfo, WxWeappExtSet extSet, WxWeappCodeStatus codeStatus) { Gson gson = new GsonBuilder().create(); // code提交 boolean codeCommitStatus = false; String codeErrCode = ""; try { WxMaOpenCommitExtInfo extInfo = gson.fromJson(extSet.getExtJson(), new TypeToken() {}.getType()); logger.info("OLD: " + extInfo.toString()); // 自动修改提交的版本 if(extInfo.getExtMap().containsKey(OpenConstant.APP_VERSION)) { extInfo.getExtMap().put(OpenConstant.APP_VERSION, userVersion); } logger.info("NEW: " + extInfo.toString()); TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appinfo.getAppId()); WxOpenResult openRet = openMaService.codeCommit(templateId, userVersion, userDesc, extInfo); logger.info(openRet.toString()); if (openRet.isSuccess()) { codeCommitStatus = true; } codeErrCode = gson.toJson(openRet); } catch (WxErrorException e) { codeCommitStatus = false; codeErrCode = e.getMessage(); logger.error(codeErrCode); } if (codeStatus == null) { codeStatus = new WxWeappCodeStatus(); codeStatus.setId(appinfo.getId()); codeStatus.setTenantId(appinfo.getTenantId()); codeStatus.setAppId(appinfo.getAppId()); if (appinfo != null) { codeStatus.setType(appinfo.getType()); codeStatus.setPlat(appinfo.getPlat()); } codeStatus.setUserVersion(userVersion); codeStatus.setVersionDesc(userDesc); if(codeCommitStatus) { codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode()); } else { codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); } codeStatus.setCodeErrCode(codeErrCode); codeStatus.setCodeTime(new Date()); weappCodeStatusService.saveStatus(codeStatus); } else { codeStatus.setUserVersion(userVersion); codeStatus.setVersionDesc(userDesc); if(codeCommitStatus) { codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode()); } else { codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); } codeStatus.setCodeErrCode(codeErrCode); codeStatus.setCodeTime(new Date()); weappCodeStatusService.updateStatus(codeStatus); } return codeCommitStatus; } private void doCodeAudit(WxWeappCodeStatus codeStatus, WxWeappAuditStatus auditStatus, WxWeappExtSet extSet) { Gson gson = new GsonBuilder().create(); boolean submitStatus = false; Long auditid = null; String codeErrCode = ""; try { WxOpenMaSubmitAuditMessage subMessage = gson.fromJson(extSet.getReleaseJson(), new TypeToken() {}.getType()); logger.info(subMessage.toString()); TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(codeStatus.getAppId()); WxOpenMaSubmitAuditResult openRet = openMaService.submitAudit(subMessage); logger.info(openRet.toString()); if(openRet.isSuccess()) { submitStatus = true; auditid = openRet.getAuditId(); } else { submitStatus = false; } codeErrCode = gson.toJson(openRet); } catch (WxErrorException e) { logger.error(e.getMessage()); submitStatus = false; codeErrCode = e.getMessage(); } if (auditStatus == null) { auditStatus = new WxWeappAuditStatus(); auditStatus.setId(codeStatus.getId()); auditStatus.setTenantId(codeStatus.getTenantId()); auditStatus.setAppId(codeStatus.getAppId()); auditStatus.setType(codeStatus.getType()); auditStatus.setPlat(codeStatus.getPlat()); auditStatus.setUserVersion(codeStatus.getUserVersion()); auditStatus.setVersionDesc(codeStatus.getVersionDesc()); auditStatus.setAuditid(auditid); if(submitStatus) { auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); } else { auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); } auditStatus.setAuditErrCode(codeErrCode); auditStatus.setAuditTime(new Date()); weappAuditStatusService.saveStatus(auditStatus); } else { auditStatus.setAuditid(auditid); if(!submitStatus) { if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion()) && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) { // 当前审核中的数据不能替换 return; } auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); } else { auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); } auditStatus.setUserVersion(codeStatus.getUserVersion()); auditStatus.setVersionDesc(codeStatus.getVersionDesc()); auditStatus.setAuditErrCode(codeErrCode); auditStatus.setAuditTime(new Date()); weappAuditStatusService.updateStatus(auditStatus); } } @ApiOperation(value = "批量审核查询", notes = "{\"type\":\"string\",\"version\":\"string\"}") @PostMapping("batchAuditQuery") public ResultData batchAuditQuery(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditQuery"); Gson gson = new GsonBuilder().create(); String typeStr = params.get(OpenConstant.TYPE); String version = params.get(OpenConstant.VERSION); Integer type = null; try { type = Integer.parseInt(typeStr); } catch (Exception e) { logger.error(e.getMessage()); } WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo(); if(StringUtils.isNotBlank(typeStr)) { queryVo.setType(type); } if(StringUtils.isNotBlank(version)) { queryVo.setUserVersion(version); } queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); List apps = weappAuditStatusService.getList(queryVo); apps.stream().forEach( auditStatus -> { // 审核中,可以发起审核查询 try { TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(auditStatus.getAppId()); WxOpenMaQueryAuditResult openResult = openMaService.getLatestAuditStatus(); logger.info(openResult.toString()); if (openResult.isSuccess()) { // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回 switch (openResult.getStatus().intValue()) { case 0: auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); break; case 1: auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); break; case 2: auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); break; case 3: auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); break; default: auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); break; } auditStatus.setAuditErrCode(gson.toJson(openResult)); auditStatus.setAuditid(openResult.getAuditId()); auditStatus.setAuditTime(new Date()); weappAuditStatusService.updateStatus(auditStatus); } } catch (WxErrorException e) { logger.error(e.getMessage()); } }); return new ResultData(); } @ApiOperation(value = "批量审核撤回", notes = "{\"type\":\"string\",\"version\":\"string\"}") @PostMapping("batchAuditCancel") public ResultData batchAuditCancel(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditCancel"); Gson gson = new GsonBuilder().create(); String typeStr = params.get(OpenConstant.TYPE); String version = params.get(OpenConstant.VERSION); Integer type = null; try { type = Integer.parseInt(typeStr); } catch (Exception e) { logger.error(e.getMessage()); } WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo(); if(StringUtils.isNotBlank(typeStr)) { queryVo.setType(type); } if(StringUtils.isNotBlank(version)) { queryVo.setUserVersion(version); } queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); List apps = weappAuditStatusService.getList(queryVo); apps.stream().forEach( auditStatus -> { // 审核通过,已发布不可撤回 try { TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(auditStatus.getAppId()); WxOpenResult openResult = openMaService.undoCodeAudit(); logger.info(openResult.toString()); if(openResult.isSuccess()) { auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); auditStatus.setAuditErrCode(gson.toJson(openResult)); auditStatus.setAuditTime(new Date()); weappAuditStatusService.updateStatus(auditStatus); } } catch (WxErrorException e) { logger.error(e.getMessage()); } }); return new ResultData(); } @ApiOperation(value = "批量发布", notes = "{\"type\":\"string\", \"version\":\"string\"}") @PostMapping("batchRelease") public ResultData batchRelease(@RequestBody Map params) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchRelease"); Gson gson = new GsonBuilder().create(); String typeStr = params.get(OpenConstant.TYPE); String version = params.get(OpenConstant.VERSION); Integer type = null; try { type = Integer.parseInt(typeStr); } catch (Exception e) { logger.error(e.getMessage()); } WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo(); if(StringUtils.isNotBlank(typeStr)) { queryVo.setType(type); } if(StringUtils.isNotBlank(version)) { queryVo.setUserVersion(version); } queryVo.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); List apps = weappAuditStatusService.getList(queryVo); apps.stream().forEach( auditStatus -> { boolean isUpdate = false; WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(auditStatus.getAppId()); if(releaseStatus != null) { // 当前版本已发布成功,跳过 if(releaseStatus.getUserVersion().equals(version) && releaseStatus.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) { return; } releaseStatus.setUserVersion(auditStatus.getUserVersion()); releaseStatus.setVersionDesc(auditStatus.getVersionDesc()); isUpdate = true; } else { releaseStatus = new WxWeappReleaseStatus(); releaseStatus.setId(auditStatus.getId()); releaseStatus.setTenantId(auditStatus.getTenantId()); releaseStatus.setAppId(auditStatus.getAppId()); releaseStatus.setType(auditStatus.getType()); releaseStatus.setPlat(auditStatus.getPlat()); releaseStatus.setUserVersion(auditStatus.getUserVersion()); releaseStatus.setVersionDesc(auditStatus.getVersionDesc()); } try { TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(auditStatus.getAppId()); WxOpenResult openRet = openMaService.releaesAudited(); logger.info(openRet.toString()); boolean releaseSuccess = false; if(openRet.isSuccess()) { releaseSuccess = true; } if(releaseSuccess) { releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode()); } else { if(openRet.getErrcode().equals(OpenConstant.ERR_CODE_APP_IS_RELEASED)) { releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode()); } else { releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode()); } } releaseStatus.setReleaseErrCode(gson.toJson(openRet)); releaseStatus.setReleaseTime(new Date()); if(isUpdate) { weappReleaseStatusService.updateStatus(releaseStatus); } else { weappReleaseStatusService.saveStatus(releaseStatus); } } catch (WxErrorException e) { logger.error(e.getMessage()); if(e.getError().getErrorCode() == OpenConstant.ERR_APP_IS_RELEASED) { releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode()); } else { releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode()); } releaseStatus.setReleaseErrCode(e.getMessage()); releaseStatus.setReleaseTime(new Date()); if(isUpdate) { weappReleaseStatusService.updateStatus(releaseStatus); } else { weappReleaseStatusService.saveStatus(releaseStatus); } } }); return new ResultData(); } @ApiOperation(value = "小程序code提交状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version") @GetMapping("codeStatusList") @ApiImplicitParams({ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) public ResultData codeStatusList(@ModelAttribute WxWeappCodeStatusVo weappCodeStatusVo, Integer pageNum, Integer pageSize) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::codeStatusList"); if (null == weappCodeStatusVo) { weappCodeStatusVo = new WxWeappCodeStatusVo(); } else { if(StringUtils.isBlank(weappCodeStatusVo.getAppId())) { weappCodeStatusVo.setAppId(null); } if(StringUtils.isBlank(weappCodeStatusVo.getName())) { weappCodeStatusVo.setName(null); } } weappCodeStatusVo.setPlat(EnumAppPlat.TOUTIAO.getCode()); weappCodeStatusVo.setSortColumns(BaseEntity.SortField.CodeTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC, BaseEntity.SortField.UserVersion_DESC); final PageInfo page = weappCodeStatusService.listAsPage(weappCodeStatusVo, pageNum, pageSize); return new ResultData(page); } @ApiOperation(value = "小程序审核状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version") @GetMapping("auditStatusList") @ApiImplicitParams({ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) public ResultData auditStatusList(@ModelAttribute WxWeappAuditStatusVo weappAuditStatusVo, Integer pageNum, Integer pageSize) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::auditStatusList"); if (null == weappAuditStatusVo) { weappAuditStatusVo = new WxWeappAuditStatusVo(); } else { if(StringUtils.isBlank(weappAuditStatusVo.getAppId())) { weappAuditStatusVo.setAppId(null); } if(StringUtils.isBlank(weappAuditStatusVo.getName())) { weappAuditStatusVo.setName(null); } } weappAuditStatusVo.setPlat(EnumAppPlat.TOUTIAO.getCode()); weappAuditStatusVo.setSortColumns(BaseEntity.SortField.AuditTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC, BaseEntity.SortField.UserVersion_DESC); final PageInfo page = weappAuditStatusService.listAsPage(weappAuditStatusVo, pageNum, pageSize); return new ResultData(page); } @ApiOperation(value = "小程序发布状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version") @GetMapping("releaseStatusList") @ApiImplicitParams({ @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) public ResultData releaseStatusList(@ModelAttribute WxWeappReleaseStatusVo weappReleaseStatusVo, Integer pageNum, Integer pageSize) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::releaseStatusList"); if (null == weappReleaseStatusVo) { weappReleaseStatusVo = new WxWeappReleaseStatusVo(); } else { if(StringUtils.isBlank(weappReleaseStatusVo.getAppId())) { weappReleaseStatusVo.setAppId(null); } if(StringUtils.isBlank(weappReleaseStatusVo.getName())) { weappReleaseStatusVo.setName(null); } } weappReleaseStatusVo.setPlat(EnumAppPlat.TOUTIAO.getCode()); weappReleaseStatusVo.setSortColumns(BaseEntity.SortField.ReleaseTime_DESC, BaseEntity.SortField.TenantId_ASC, BaseEntity.SortField.Type_ASC,BaseEntity.SortField.UserVersion_DESC); final PageInfo page = weappReleaseStatusService.listAsPage(weappReleaseStatusVo, pageNum, pageSize); return new ResultData(page); } @ApiOperation("小程序code提交版本列表") @GetMapping("codeVersionList") @ApiImplicitParams({ @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)}) public ResultData getCodeVersionList(Integer type) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getCodeVersionList"); final List list = weappCodeStatusService.getVersionList(type,EnumAppPlat.TOUTIAO.getCode()); return new ResultData(list); } @ApiOperation("小程序审核版本列表") @GetMapping("auditVersionList") @ApiImplicitParams({ @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true), @ApiImplicitParam(name = "status", value = "审核状态", dataType = "int", paramType = "query")}) public ResultData getAuditVersionList(Integer type, Integer status) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getAuditVersionList"); final List list = weappAuditStatusService.getVersionList(type,EnumAppPlat.TOUTIAO.getCode(), status); return new ResultData(list); } @ApiOperation("小程序发布版本列表") @GetMapping("releaseVersionList") @ApiImplicitParams({ @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)}) public ResultData getReleaseVersionList(Integer type) { logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getReleaseVersionList"); final List list = weappReleaseStatusService.getVersionList(type,EnumAppPlat.TOUTIAO.getCode()); return new ResultData(list); } /* * 0. 回调搭建好 * 1. wx_appinfo配置好 * * 10. 授权 * 11. 设置服务器域名及业务域名 - B/C 配置表 * C 服务器域名 c.malls.iformall.com * 业务域名 c.malls.iformall.com,game.malls.iformall.com * B 服务器域名 b.malls.iformall.com * 业务域名 mobile.malls.iformall.com,admin.malls.iformall.com * C 服务器域名 ciformall.youlane.cn * 业务域名 ciformall.youlane.cn,game.youlane.cn * B 服务器域名 biformall.youlane.cn * 业务域名 mobile.youlane.cn,mall.youlane.cn * C 服务器域名 ctest.malls.iformall.com * 业务域名 ctest.malls.iformall.com,gametest.malls.iformall.com * B 服务器域名 btest.malls.iformall.com * 业务域名 mobiletest.malls.iformall.com,admintest.malls.iformall.com * 12. 设置微信基础版本 - 配置 * 2.0.9 * 13. 设置微信模板 - 配置 * 核销成功模板 AT0423 14,15,16,7,10,3,9 * 核销失败模板 AT1824 1,3,4,5 * 14. 草稿提交 * 15. 模板 * 16. 上传小程序代码 - 配置 ext.json * 17. 体验二维码 * 18. 提交审核 - json --- 获取审核ID * 19. 获取审核结果 - 基于审核ID查询 -- event 回调 * 20. 审核撤回 * 21. 发布已通过审核的小程序 * 22. oauth2refreshAccessToken */ }