From 30d8e227e8d823b6c38c3b9c90ac2df03b63befe Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期二, 25 二月 2025 16:41:22 +0800 Subject: [PATCH] 淘宝转链接口更新 --- fanli/src/main/java/com/yeshi/fanli/controller/client/v2/DynamicControllerV2.java | 314 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 245 insertions(+), 69 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/controller/client/v2/DynamicControllerV2.java b/fanli/src/main/java/com/yeshi/fanli/controller/client/v2/DynamicControllerV2.java index fa8f530..27a49bf 100644 --- a/fanli/src/main/java/com/yeshi/fanli/controller/client/v2/DynamicControllerV2.java +++ b/fanli/src/main/java/com/yeshi/fanli/controller/client/v2/DynamicControllerV2.java @@ -1,43 +1,12 @@ package com.yeshi.fanli.controller.client.v2; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.lang.reflect.Type; -import java.math.BigDecimal; -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import javax.annotation.Resource; - +import com.google.gson.*; +import com.yeshi.common.vo.ClientTextStyleVO; +import com.yeshi.fanli.dto.jd.JDCouponInfo; +import com.yeshi.fanli.dto.pdd.PDDGoodsDetail; import com.yeshi.fanli.entity.SystemEnum; import com.yeshi.fanli.entity.SystemFunction; -import com.yeshi.fanli.exception.taobao.TaoBaoConvertLinkException; -import com.yeshi.fanli.service.manger.goods.TaoBaoLinkManager; -import com.yeshi.fanli.util.*; -import com.yeshi.fanli.util.StringUtil; -import org.apache.commons.beanutils.PropertyUtils; -import org.springframework.core.task.TaskExecutor; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.yeshi.utils.*; -import org.yeshi.utils.entity.FileUploadResult; -import org.yeshi.utils.tencentcloud.COSManager; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import com.yeshi.fanli.dto.jd.JDCouponInfo; +import com.yeshi.fanli.entity.SystemPIDInfo; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.clazz.GoodsClass; import com.yeshi.fanli.entity.bus.homemodule.CommonShareInfo; @@ -57,7 +26,10 @@ import com.yeshi.fanli.entity.jd.JDGoods; import com.yeshi.fanli.entity.system.ConfigKeyEnum; import com.yeshi.fanli.entity.taobao.TaoBaoLink; -import com.yeshi.fanli.exception.goods.ConvertLinkExceptionException; +import com.yeshi.fanli.exception.goods.ConvertLinkException; +import com.yeshi.fanli.exception.pdd.PDDAuthException; +import com.yeshi.fanli.exception.pdd.PDDGoodsException; +import com.yeshi.fanli.exception.taobao.TaoBaoConvertLinkException; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.common.JumpDetailV2Service; import com.yeshi.fanli.service.inter.config.ConfigService; @@ -65,31 +37,61 @@ import com.yeshi.fanli.service.inter.dynamic.ArticleOfficialService; import com.yeshi.fanli.service.inter.dynamic.DynamicInfoService; import com.yeshi.fanli.service.inter.dynamic.GoodsEvaluateService; -import com.yeshi.fanli.service.inter.goods.ShareGoodsService; import com.yeshi.fanli.service.inter.homemodule.CommonShareInfoService; import com.yeshi.fanli.service.inter.homemodule.SpecialService; import com.yeshi.fanli.service.inter.homemodule.SwiperPictureService; +import com.yeshi.fanli.service.inter.pdd.PDDAuthService; import com.yeshi.fanli.service.inter.user.QrCodeService; +import com.yeshi.fanli.service.inter.user.UserFunctionsLimitService; import com.yeshi.fanli.service.inter.user.UserInfoExtraService; import com.yeshi.fanli.service.inter.user.UserInfoService; -import com.yeshi.fanli.service.inter.user.cloud.UserCloudService; import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService; +import com.yeshi.fanli.service.manger.PIDManager; import com.yeshi.fanli.service.manger.goods.ConvertLinkManager; +import com.yeshi.fanli.service.manger.goods.TaoBaoLinkManager; +import com.yeshi.fanli.service.manger.goods.jd.JDConvertLinkManager; +import com.yeshi.fanli.service.manger.goods.pdd.PDDConvertLinkManager; +import com.yeshi.fanli.service.manger.goods.tb.TBConvertLinkManager; +import com.yeshi.fanli.util.*; +import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.cache.JDGoodsCacheUtil; +import com.yeshi.fanli.util.exception.ExceptionConstant; +import com.yeshi.fanli.util.goods.GoodsJumpUtil; +import com.yeshi.fanli.util.goods.GoodsTextUtil; import com.yeshi.fanli.util.jd.JDApiUtil; import com.yeshi.fanli.util.jd.JDUtil; import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil; import com.yeshi.fanli.util.pinduoduo.PinDuoDuoUtil; import com.yeshi.fanli.util.taobao.DaTaoKeUtil; import com.yeshi.fanli.util.taobao.TaoBaoUtil; +import com.yeshi.fanli.util.taobao.TaoKeApiUtil; import com.yeshi.fanli.vo.dynamic.ArticleVO; +import com.yeshi.fanli.vo.goods.ConvertLinkJumpVO; import com.yeshi.fanli.vo.goods.GoodsDetailVO; import com.yeshi.fanli.vo.homemodule.BannerVO; import com.yeshi.fanli.vo.homemodule.SpecialVO; -import com.yeshi.common.vo.ClientTextStyleVO; - +import com.yeshi.fanli.vo.pdd.PDDConvertLinkResultVO; import net.sf.json.JSONArray; import net.sf.json.JSONObject; +import org.apache.commons.beanutils.PropertyUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.task.TaskExecutor; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.yeshi.utils.*; +import org.yeshi.utils.entity.FileUploadResult; +import org.yeshi.utils.tencentcloud.COSManager; + +import javax.annotation.Resource; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.net.MalformedURLException; +import java.util.*; /** * 鍔ㄦ�� @@ -99,6 +101,8 @@ @Controller @RequestMapping("api/v2/dynamic") public class DynamicControllerV2 { + + private Logger logger= LoggerFactory.getLogger(DynamicControllerV2.class); @Resource private TaoBaoLinkManager taoBaoLinkManager; @@ -142,7 +146,13 @@ private ConvertLinkManager convertLinkManager; @Resource - private ShareGoodsService shareGoodsService; + private TBConvertLinkManager tbConvertLinkManager; + + @Resource + private JDConvertLinkManager jdConvertLinkManager; + + @Resource + private PDDConvertLinkManager pddConvertLinkManager; @Resource private DailyCountMomentsService dailyCountMomentsService; @@ -151,7 +161,14 @@ private CommonShareInfoService commonShareInfoService; @Resource - private UserCloudService userCloudService; + private PDDAuthService pddAuthService; + + @Resource + private UserFunctionsLimitService userFunctionsLimitService; + + + @Resource + private PIDManager pidManager; @Resource(name = "taskExecutor") private TaskExecutor executor; @@ -270,7 +287,8 @@ list.add(map.get(TYPE_FAQUAN)); list.add(map.get(TYPE_HUODONG)); // list.add(map.get(TYPE_XUEYUAN)); - list.add(map.get(TYPE_SUCAI)); + // 涓嶈繑鍥炵礌鏉愪簡 + // list.add(map.get(TYPE_SUCAI)); } else { list.add(map.get(TYPE_FAQUAN)); } @@ -623,7 +641,7 @@ } else if (cid == TYPE_SUCAI) { type = 2; } - List<GoodsEvaluate> listNew = new ArrayList<GoodsEvaluate>(); + List<GoodsEvaluate> listNew = new ArrayList<>(); List<GoodsEvaluate> list = goodsEvaluateService.queryMaterialsCache((page - 1) * Constant.PAGE_SIZE, Constant.PAGE_SIZE, type, acceptData.getSystem()); @@ -642,6 +660,9 @@ } for (GoodsEvaluate goodsEvaluate : list) { + if (goodsEvaluate.getGoods() != null) { + goodsEvaluate.getGoods().setCreatetime(null); + } GoodsEvaluate evaluateNew = new GoodsEvaluate(); try { PropertyUtils.copyProperties(evaluateNew, goodsEvaluate); @@ -676,8 +697,16 @@ List<ImgInfo> listInfoNew = new ArrayList<ImgInfo>(); for (ImgInfo imgInfo : goodsEvaluate.getImgList()) { + + if (acceptData.getSystem() == SystemEnum.yhqjx || acceptData.getSystem() == SystemEnum.hsb) { + imgInfo.setGoods(null); + imgInfo.setGoodsVO(null); + } + if (imgInfo.getType() != ImgEnum.activity) { listInfoNew.add(imgInfo); + + continue; } ImgInfo infoNew = new ImgInfo(); @@ -813,6 +842,121 @@ } + + /** + * 杞摼 + * + * @param acceptData + * @param uid + * @param link + * @param out + */ + @RequestMapping(value = "convertLink", method = RequestMethod.POST) + public void convertLink(AcceptData acceptData, Long uid, String link, PrintWriter out) { + if (StringUtil.isNullOrEmpty(link)) { + out.print(JsonUtil.loadFalseResult("閾炬帴涓虹┖")); + return; + } + + ConvertLinkJumpVO convertLinkJumpVO = null; + //鍒ゆ柇result鏄惁涓烘窐鍙d护 + List<String> urlList = UrlUtils.parseUrlsFromText(link); + if (urlList.size() > 0) { + //鍙鐞嗕含涓�/鎷煎澶氶摼鎺� + String url = urlList.get(0); + if (JDUtil.isJDLink(url)) { + try { + url = jdConvertLinkManager.convertShortUrl(url, uid, acceptData.getSystem(), uid == null ? SystemPIDInfo.PidType.coupon : SystemPIDInfo.PidType.fanli); + } catch (Exception e) { + logger.warn(String.format("浜笢杞摼鍑洪敊锛歮aterialId-%s",url), e); + } + convertLinkJumpVO = new ConvertLinkJumpVO(GoodsJumpUtil.getJDJumpInfo(url), Constant.SOURCE_TYPE_JD); + outPrintConvertResult(convertLinkJumpVO, out); + return; + } + + if (PinDuoDuoUtil.isPDDLink(url)) { + String pddGoodsId = PinDuoDuoUtil.getPDDGoodsId(url); + String customParams = pddAuthService.getFanliCustomParams(uid); + PDDConvertLinkResultVO convertLinkResult = null; + try { + convertLinkResult = pddConvertLinkManager.convertGoods(pddGoodsId, acceptData.getSystem(), customParams, uid == null ? SystemPIDInfo.PidType.coupon : SystemPIDInfo.PidType.fanli); + convertLinkJumpVO = new ConvertLinkJumpVO(GoodsJumpUtil.getPDDJumpInfo(convertLinkResult), Constant.SOURCE_TYPE_PDD); + outPrintConvertResult(convertLinkJumpVO, out); + return; + } catch (PDDGoodsException e) { + e.printStackTrace(); + //鍟嗗搧涓嬬嚎 + out.print(JsonUtil.loadFalseResult(ExceptionConstant.CODE_GOODS_OFFLINE, "鍟嗗搧宸蹭笅绾�")); + return; + } catch (PDDAuthException e) { + e.printStackTrace(); + //鎷煎澶氭湭鎺堟潈 + out.print(JsonUtil.loadFalseResult(ExceptionConstant.CODE_AUTH_PDD_NO_AUTH, "鎷煎澶氬皻鏈巿鏉冿紝璇锋巿鏉�")); + return; + } + } + + + return; + } + + List<String> tokenList = TaoBaoUtil.getTokenListFromTextWithKuoHao(link); + if (tokenList.size() > 0) { + //杩樺師鍙d护 + try { + TaoKeApiUtil.TokenConvertResult convertResult = TaoKeApiUtil.tokenConvert(tokenList.get(0)); + if (convertResult != null) { + String originUrl = convertResult.getOrigin_url(); + String goodsId = convertResult.getNum_iid(); + TaoBaoLink taoBaoLink = tbConvertLinkManager.convertGoods(goodsId, uid, acceptData.getSystem(), uid == null ? SystemPIDInfo.PidType.coupon : SystemPIDInfo.PidType.fanli); + convertLinkJumpVO = new ConvertLinkJumpVO(GoodsJumpUtil.getTBJumpInfo(taoBaoLink), Constant.SOURCE_TYPE_TAOBAO); + outPrintConvertResult(convertLinkJumpVO, out); + return; + } else { + throw new Exception("杞摼澶辫触"); + } + } catch (Exception e) { + e.printStackTrace(); + //杈撳嚭鍘熸潵鐨勬窐鍙d护 + JSONObject root = new JSONObject(); + root.put("data", new Gson().toJson(new ConvertLinkJumpVO(null, Constant.SOURCE_TYPE_TAOBAO))); + root.put("code", ExceptionConstant.CODE_JUMP_NO_SUPPORT); + out.print(root.toString()); + return; + } + + } + out.print(JsonUtil.loadFalseResult("涓嶆敮鎸佺殑绫诲瀷")); + } + + + private void outPrintConvertResult(ConvertLinkJumpVO vo, PrintWriter out) { + out.print(JsonUtil.loadTrueResult(new Gson().toJson(vo))); + } + + + /** + * 澶嶅埗鎺ㄨ崘璇� + * + * @param acceptData + * @param uid + * @param id + * @param out + */ + @RequestMapping(value = "evaluateCopyRecommend", method = RequestMethod.POST) + public void evaluateCopyRecommend(AcceptData acceptData, Long uid, String id, PrintWriter out) { + GoodsEvaluate goodsEvaluate = goodsEvaluateService.getById(id); + if (goodsEvaluate == null) { + out.print(JsonUtil.loadFalseResult("璇ュ唴瀹瑰凡涓嶅瓨鍦�")); + return; + } + JSONObject data = new JSONObject(); + String result = GoodsTextUtil.decodeAppHtmlText(goodsEvaluate.getTitle()); + data.put("content", result); + out.print(JsonUtil.loadTrueResult(data)); + } + /** * @param acceptData * @param uid @@ -858,6 +1002,13 @@ return; } + + if (userFunctionsLimitService.isLimit(uid, SystemFunction.share, new Date())) { + out.print(JsonUtil.loadFalseResult(1, "璇ュ姛鑳介檺鍒朵娇鐢�")); + return; + } + + UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid); String relationId = null; if (taoBaoInfo != null && taoBaoInfo.getRelationId() != null && taoBaoInfo.getRelationValid() != null @@ -870,7 +1021,7 @@ } String inviteCode = userInfoExtraService.getInviteCodeByUid(uid); if (SystemInfoUtil.hasFunctions(acceptData.getSystem(), SystemFunction.threeSale)) { - inviteCode = userInfoExtraService.getInviteCodeByUid(uid); + inviteCode = userInfoExtraService.getInviteCodeByUid(uid); if (StringUtil.isNullOrEmpty(inviteCode)) { out.print(JsonUtil.loadFalseResult(1, "閭�璇风爜鏈縺娲�")); return; @@ -977,7 +1128,7 @@ } if (list.size() == 0) { - out.print(JsonUtil.loadFalseResult("璇ヤ俊鎭凡涓嬫灦")); + out.print(JsonUtil.loadFalseResult("鎿嶄綔澶辫触")); return; } @@ -997,7 +1148,7 @@ if (goodsVO.getGoodsType() == Constant.SOURCE_TYPE_TAOBAO) { TaoBaoLink taoBaoLink = null; try { - taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(user.getId(), Long.parseLong(goodsVO.getGoodsId()), + taoBaoLink = taoBaoLinkManager.getTaoBaoLinkForShare(system, user.getId(),goodsVO.getGoodsId(), relationId, null); } catch (TaoBaoConvertLinkException e) { e.printStackTrace(); @@ -1006,7 +1157,7 @@ configService.getValue(ConfigKeyEnum.taobaoShareQrcodeText.getKey(), system), taoBaoLink.getGoods(), TaoBaoUtil.filterTaoToken(taoBaoLink.getTaoToken())); } else if (goodsVO.getGoodsType() == Constant.SOURCE_TYPE_JD) { - JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(Long.parseLong(goodsVO.getGoodsId())); + JDGoods jdGoods = jdGoodsCacheUtil.getGoodsInfo(goodsVO.getGoodsId()); if (jdGoods == null) { return null; } @@ -1017,11 +1168,19 @@ couponUrl = couponInfo.getLink(); } String materialId = "https://item.jd.com/" + goodsVO.getGoodsId() + ".html"; - jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, JDApiUtil.POSITION_SHARE + "", - user.getId() + ""); + try { + jumpLink = JDApiUtil.convertLinkWithSubUnionId(materialId, couponUrl, null, pidManager.getPidCache(system, Constant.SOURCE_TYPE_JD, SystemPIDInfo.PidType.share), + user.getId() + ""); + } catch (Exception e) { + logger.warn(String.format("浜笢杞摼鍑洪敊锛歮aterialId-%s couponUrl-%s",materialId,couponUrl), e); + } } else if (goodsVO.getGoodsType() == Constant.SOURCE_TYPE_PDD) { - jumpLink = PinDuoDuoApiUtil.getPromotionUrl(Long.parseLong(goodsVO.getGoodsId()), - PinDuoDuoApiUtil.PID_SHARE + "", user.getId() + ""); + PDDGoodsDetail pddGoodsDetail = PinDuoDuoApiUtil.getGoodsDetail(goodsVO.getGoodsId()); + if (pddGoodsDetail == null) { + return null; + } + + jumpLink = PinDuoDuoApiUtil.getPromotionUrl(pddGoodsDetail.getGoodsSign(), pidManager.getPidCache(system, Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.share), user.getId() + ""); } FileUploadResult uploadResult = qrCodeService.drawDynamicGoodsPoster(jumpLink, user.getPortrait(), inviteCode, @@ -1064,6 +1223,11 @@ return; } + if (userFunctionsLimitService.isLimit(uid, SystemFunction.share, new Date())) { + out.print(JsonUtil.loadFalseResult(1, "璇ュ姛鑳介檺鍒朵娇鐢�")); + return; + } + UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid); String relationId = null; if (taoBaoInfo != null && taoBaoInfo.getRelationId() != null && taoBaoInfo.getRelationValid() != null @@ -1089,11 +1253,23 @@ } String newText = text; // 闈為�氱敤鍒搁渶瑕侀獙璇� + + //鐗逛环鍙渶瑕佸鍒舵枃瀛楋紝涓嶉渶瑕佽浆閾� + if (acceptData.getSystem() == SystemEnum.yhqjx || acceptData.getSystem() == SystemEnum.hsb) { + newText = GoodsTextUtil.decodeAppHtmlText(newText); + //鍙鍒舵枃瀛� + JSONObject data = new JSONObject(); + data.put("text", newText); + out.print(JsonUtil.loadTrueResult(data)); + return; + } + + if (comment != null && (comment.getNeedSpin() == null || comment.getNeedSpin())) { try { - newText = convertLinkManager.convertLinkFromText(text, uid, true); - } catch (ConvertLinkExceptionException e) { - if (e.getCode() != ConvertLinkExceptionException.CODE_NONE) { + newText = convertLinkManager.convertLinkFromText(acceptData.getSystem(), text, uid, true, true); + } catch (ConvertLinkException e) { + if (e.getCode() != ConvertLinkException.CODE_NONE) { out.print(JsonUtil.loadFalseResult("璇勮鐢熸垚澶辫触")); return; } @@ -1175,9 +1351,9 @@ String newText = text; if (shareInfo.getNeedSpin() != null && shareInfo.getNeedSpin()) { try { - newText = convertLinkManager.convertLinkFromText(text, uid, true); - } catch (ConvertLinkExceptionException e) { - if (e.getCode() != ConvertLinkExceptionException.CODE_NONE) { + newText = convertLinkManager.convertLinkFromText(acceptData.getSystem(), text, uid, true, true); + } catch (ConvertLinkException e) { + if (e.getCode() != ConvertLinkException.CODE_NONE) { out.print(JsonUtil.loadFalseResult("璇勮鐢熸垚澶辫触")); return; } @@ -1245,7 +1421,7 @@ int platformCode = Constant.getPlatformCode(acceptData.getPlatform()); jumpDetail = jumpDetailV2Service.getByTypeCache("web", platformCode, - Integer.parseInt(acceptData.getVersion())); + Integer.parseInt(acceptData.getVersion()), acceptData.getSystem()); JSONObject inner = new JSONObject(); inner.put("url", jumpLink); params = inner.toString(); @@ -1370,9 +1546,9 @@ String newText = text; if (shareInfo.getNeedSpin() != null && shareInfo.getNeedSpin()) { try { - newText = convertLinkManager.convertLinkFromText(text, uid, true); - } catch (ConvertLinkExceptionException e) { - if (e.getCode() != ConvertLinkExceptionException.CODE_NONE) { + newText = convertLinkManager.convertLinkFromText(acceptData.getSystem(), text, uid, true, true); + } catch (ConvertLinkException e) { + if (e.getCode() != ConvertLinkException.CODE_NONE) { JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("璇勮鐢熸垚澶辫触")); return; } @@ -1502,7 +1678,7 @@ if (shareInfo.getNeedSpin() != null && shareInfo.getNeedSpin()) { try { String erCodeContent = ""; - newText = convertLinkManager.convertLinkFromText(text, uid, true); + newText = convertLinkManager.convertLinkFromText(acceptData.getSystem(), text, uid, true, true); // 鑾峰彇鍙d护 List<String> tokenList = TaoBaoUtil.getTokenListFromTextWithKuoHao(newText); if (tokenList != null && tokenList.size() > 0) { @@ -1523,8 +1699,8 @@ } imgUrl = createActivityShareImg(type, id, erCodeContent); - } catch (ConvertLinkExceptionException e) { - if (e.getCode() != ConvertLinkExceptionException.CODE_NONE) { + } catch (ConvertLinkException e) { + if (e.getCode() != ConvertLinkException.CODE_NONE) { JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("璇勮鐢熸垚澶辫触")); return; } @@ -1599,9 +1775,9 @@ String newText = text; // 闈為�氱敤鍒搁渶瑕侀獙璇� if (comment != null && (comment.getNeedSpin() == null || comment.getNeedSpin())) { try { - newText = convertLinkManager.convertLinkFromText(text, uid, true); - } catch (ConvertLinkExceptionException e) { - if (e.getCode() != ConvertLinkExceptionException.CODE_NONE) { + newText = convertLinkManager.convertLinkFromText(acceptData.getSystem(), text, uid, true, true); + } catch (ConvertLinkException e) { + if (e.getCode() != ConvertLinkException.CODE_NONE) { JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("璇勮鐢熸垚澶辫触")); return; } -- Gitblit v1.8.0