@@ -11,6 +11,7 @@ public enum EnumAppType { | |||
C(2, "C端"), | |||
MP_S(3,"公众号-服务号"), | |||
MP_P(4, "公众号-订阅号"), | |||
A(5, "A端"), | |||
; | |||
public static EnumAppType getEnum(Integer code) { | |||
@@ -2,6 +2,7 @@ package com.iformall.service; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.TtMerchantPoi; | |||
import com.iformall.domain.po.WxAppinfo; | |||
/** | |||
* @author gongbiao | |||
@@ -20,5 +21,5 @@ public interface TtMerchantPoiService { | |||
TtMerchantPoi getById(Long id); | |||
boolean addShopMaterial(WxAppinfo appinfo, TtMerchantPoi merchantPoi); | |||
} |
@@ -1,15 +1,26 @@ | |||
package com.iformall.service.impl; | |||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
import com.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.iformall.domain.po.TtMerchantPoi; | |||
import com.iformall.domain.po.WxAppinfo; | |||
import com.iformall.enums.EnumAppPlat; | |||
import com.iformall.enums.EnumAppType; | |||
import com.iformall.mapper.TtMerchantPoiMapper; | |||
import com.iformall.mapper.WxAppinfoMapper; | |||
import com.iformall.service.TtMerchantPoiService; | |||
import com.iformall.service.toutiao.FmTtOpenService; | |||
import com.iformall.service.toutiao.api.TtOpenMaService; | |||
import com.iformall.service.toutiao.api.bean.TtOpenResult; | |||
import com.iformall.service.toutiao.api.bean.TtOpenShopMaterial; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.util.Date; | |||
/** | |||
* @author gongbiao | |||
@@ -22,6 +33,12 @@ public class TtMerchantPoiServiceImpl implements TtMerchantPoiService { | |||
@Autowired | |||
TtMerchantPoiMapper ttMerchantPoiMapper; | |||
@Autowired | |||
WxAppinfoMapper wxAppinfoMapper; | |||
@Autowired | |||
protected FmTtOpenService openService; | |||
@Override | |||
public PageInfo<TtMerchantPoi> listAsPage(TtMerchantPoi record, Integer pageIndex, Integer pageSize) { | |||
@@ -33,5 +50,35 @@ public class TtMerchantPoiServiceImpl implements TtMerchantPoiService { | |||
return ttMerchantPoiMapper.selectById(id); | |||
} | |||
@Override | |||
public boolean addShopMaterial(WxAppinfo appinfo, TtMerchantPoi merchantPoi) { | |||
WxAppinfo appinfoQ = new WxAppinfo(); | |||
appinfoQ.setTenantId(appinfo.getTenantId()); | |||
appinfoQ.setPlat(EnumAppPlat.TOUTIAO.getCode()); | |||
appinfoQ.setType(EnumAppType.A.getCode()); | |||
WxAppinfo ttopen = wxAppinfoMapper.selectOne(new QueryWrapper<>(appinfoQ)); | |||
TtOpenShopMaterial shopMaterial = new TtOpenShopMaterial(); | |||
shopMaterial.setClientKey(ttopen.getAppId()); | |||
shopMaterial.setSupplierExtId(merchantPoi.getSupplierExtId()); | |||
shopMaterial.setBizLicencePath(merchantPoi.getBizLicencePath()); | |||
shopMaterial.setContractPath(merchantPoi.getContractPath()); | |||
shopMaterial.setQualMaterial(merchantPoi.getQualMaterial()); | |||
shopMaterial.setExpireTime(merchantPoi.getExpireTime()); | |||
shopMaterial.setAdditionalQual(merchantPoi.getAdditionalQual()); | |||
TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appinfo.getAppId()); | |||
TtOpenResult res = openMaService.addShopMaterial(shopMaterial); | |||
if(res.isSuccess()){ | |||
merchantPoi.setUpdateDate(new Date()); | |||
ttMerchantPoiMapper.updateById(merchantPoi); | |||
return true; | |||
} | |||
logger.error("提交商铺资质材料error"+ res.getMessage()); | |||
return false; | |||
} | |||
} |
@@ -1,6 +1,7 @@ | |||
package com.iformall.service.toutiao.api; | |||
import com.iformall.service.toutiao.api.bean.TtOpenResult; | |||
import com.iformall.service.toutiao.api.bean.TtOpenShopMaterial; | |||
import com.iformall.service.toutiao.miniapp.TtMaService; | |||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||
import me.chanjar.weixin.common.error.WxErrorException; | |||
@@ -237,6 +238,11 @@ public interface TtOpenMaService extends TtMaService { | |||
*/ | |||
String API_UPLOAD_MATERIAL = "https://open.microapp.bytedance.com/openapi/v1/microapp/upload_material"; | |||
/** | |||
* 提交商铺资质材料 | |||
*/ | |||
String API_ADD_SHOP_MATERIAL = "https://open.microapp.bytedance.com/openapi/v1/microapp/operation/add_shop_material"; | |||
/** | |||
* 获得小程序的域名配置信息 | |||
@@ -490,6 +496,8 @@ public interface TtOpenMaService extends TtMaService { | |||
String mediaUpload(Integer mediaType, File file) throws WxErrorException; | |||
TtOpenResult addShopMaterial(TtOpenShopMaterial shopMaterial)throws WxErrorException; | |||
// /** | |||
// * 小程序用户隐私保护指引服务 | |||
// * | |||
@@ -14,6 +14,7 @@ public class TtOpenGsonBuilder { | |||
INSTANCE.registerTypeAdapter(TtOpenNotifyMsg.class, new TtOpenNotifyMsgGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(TtOpenAuthorizationInfo.class, new TtOpenAuthorizationInfoGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(TtOpenRetrieveCode.class, new TtOpenRetrieveCodeGsonAdapter()); | |||
INSTANCE.registerTypeAdapter(TtOpenShopMaterial.class, new TtOpenShopMaterialGsonAdapter()); | |||
} | |||
@@ -0,0 +1,47 @@ | |||
package com.iformall.service.toutiao.api.bean; | |||
import com.google.gson.JsonArray; | |||
import lombok.*; | |||
import java.io.Serializable; | |||
/** | |||
* @author S | |||
*/ | |||
@Getter | |||
@Setter | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
@Builder | |||
public class TtOpenShopMaterial implements Serializable { | |||
private static final long serialVersionUID = -7209805209834111965L; | |||
private String clientKey;//服务商在抖音开放平台的应用唯一标识 | |||
/** | |||
* 接入方店铺 ID | |||
*/ | |||
private String supplierExtId; | |||
/** | |||
* 商铺营业执照路径 | |||
*/ | |||
private String bizLicencePath;//商铺营业执照路径 | |||
private String contractPath;//商家授权函 | |||
private String qualMaterial;//商铺行业资质材料信息 | |||
//2019-01-14 12:45:10 | |||
private String expireTime; | |||
private String additionalQual;//其他补充资质 | |||
public String toJson() { | |||
return TtOpenGsonBuilder.create().toJson(this); | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
/* | |||
* KINGSTAR MEDIA SOLUTIONS Co.,LTD. Copyright c 2005-2013. All rights reserved. | |||
* | |||
* This source code is the property of KINGSTAR MEDIA SOLUTIONS LTD. It is intended | |||
* only for the use of KINGSTAR MEDIA application development. Reengineering, reproduction | |||
* arose from modification of the original source, or other redistribution of this source | |||
* is not permitted without written permission of the KINGSTAR MEDIA SOLUTIONS LTD. | |||
*/ | |||
package com.iformall.service.toutiao.api.bean; | |||
import com.google.gson.*; | |||
import org.apache.commons.lang3.StringUtils; | |||
import java.lang.reflect.Type; | |||
/** | |||
* @author Daniel Qian | |||
*/ | |||
public class TtOpenShopMaterialGsonAdapter implements JsonSerializer<TtOpenShopMaterial> { | |||
@Override | |||
public JsonElement serialize(TtOpenShopMaterial openShopMaterial, Type typeOfSrc, JsonSerializationContext context) { | |||
return convertToJson(openShopMaterial); | |||
} | |||
protected JsonObject convertToJson(TtOpenShopMaterial openShopMaterial) { | |||
JsonObject json = new JsonObject(); | |||
json.addProperty("client_key", openShopMaterial.getClientKey()); | |||
json.addProperty("supplier_ext_id", openShopMaterial.getSupplierExtId()); | |||
json.addProperty("biz_licence_path", openShopMaterial.getBizLicencePath()); | |||
json.addProperty("contract_path", openShopMaterial.getContractPath()); | |||
if(StringUtils.isNotBlank(openShopMaterial.getQualMaterial())){ | |||
JsonArray qmJsonArray = new JsonParser().parse(openShopMaterial.getQualMaterial()).getAsJsonArray(); | |||
json.add("qual_material",qmJsonArray); | |||
} | |||
json.addProperty("expire_time", openShopMaterial.getExpireTime()); | |||
if(StringUtils.isNotBlank(openShopMaterial.getAdditionalQual())){ | |||
JsonArray aqJsonArray = new JsonParser().parse(openShopMaterial.getAdditionalQual()).getAsJsonArray(); | |||
json.add("additional_qual",aqJsonArray); | |||
} | |||
return json; | |||
} | |||
} |
@@ -11,6 +11,7 @@ import com.iformall.service.toutiao.api.TtOpenMaService; | |||
import com.iformall.service.toutiao.api.bean.TtOpenGsonBuilder; | |||
import com.iformall.service.toutiao.api.bean.TtOpenMaQrcode; | |||
import com.iformall.service.toutiao.api.bean.TtOpenResult; | |||
import com.iformall.service.toutiao.api.bean.TtOpenShopMaterial; | |||
import com.iformall.service.toutiao.miniapp.TtMaQrcode; | |||
import com.iformall.service.toutiao.miniapp.TtQrcodeRequestExecutor; | |||
import com.iformall.service.toutiao.miniapp.impl.TtMaServiceImpl; | |||
@@ -682,6 +683,13 @@ public class TtOpenMaServiceImpl extends TtMaServiceImpl implements TtOpenMaServ | |||
return this.execute(executor, uri, file); | |||
} | |||
@Override | |||
public TtOpenResult addShopMaterial(TtOpenShopMaterial shopMaterial)throws WxErrorException { | |||
String uri = API_ADD_SHOP_MATERIAL + "?component_appid=" + ttOpenComponentService.getWxOpenConfigStorage().getComponentAppId(); | |||
String response = ttOpenComponentService.postByAppAccessToken(appId,uri,shopMaterial.toJson(),"authorizer_access_token"); | |||
return TtOpenGsonBuilder.create().fromJson(response, TtOpenResult.class); | |||
} | |||
/** | |||
* 将字符串对象转化为GsonArray对象 | |||
@@ -1,21 +1,21 @@ | |||
package com.iformall.controller; | |||
import com.alibaba.fastjson.JSON; | |||
import com.github.pagehelper.PageInfo; | |||
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.BaseEntity; | |||
import com.iformall.domain.po.TtMerchantPoi; | |||
import com.iformall.domain.po.WxAppinfo; | |||
import com.iformall.enums.EnumMeterialType; | |||
import com.iformall.service.TtMerchantPoiService; | |||
import com.iformall.service.WxAppinfoService; | |||
import com.iformall.service.toutiao.FmTtOpenService; | |||
import com.iformall.service.toutiao.api.TtOpenMaService; | |||
import io.swagger.annotations.ApiImplicitParam; | |||
import io.swagger.annotations.ApiImplicitParams; | |||
import io.swagger.annotations.ApiOperation; | |||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult; | |||
import me.chanjar.weixin.common.error.WxErrorException; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -23,10 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.web.bind.annotation.*; | |||
import org.springframework.web.multipart.MultipartFile; | |||
import javax.imageio.ImageIO; | |||
import java.awt.image.BufferedImage; | |||
import java.io.InputStream; | |||
import java.util.List; | |||
import java.util.Map; | |||
/** | |||
@@ -40,6 +36,8 @@ public class TtMerchantPoiController extends BaseController { | |||
@Autowired | |||
private TtMerchantPoiService ttMerchantPoiService; | |||
private WxAppinfoService appinfoService; | |||
@Autowired | |||
protected FmTtOpenService openService; | |||
@@ -135,54 +133,78 @@ public class TtMerchantPoiController extends BaseController { | |||
} | |||
} | |||
@PostMapping(value = "/upload_material1", consumes = "multipart/*", headers = "content-type=multipart/form-data") | |||
@ApiOperation("上传图片") | |||
public ResultData uploadMaterial(@RequestParam("file") MultipartFile multiReq) { | |||
logger.info("[" + getIpAddr() + "] TtMerchantPoiController::upload_material"); | |||
String appId = "ttef6599d8705b49b101"; | |||
/** | |||
* @param | |||
* @return | |||
* @throws Exception | |||
*/ | |||
@PostMapping(value = "/add_shop_material") | |||
@ApiOperation("提交商铺资质材料") | |||
public ResultData addShopMaterial(@RequestBody Map<String, String> param) { | |||
logger.info("[" + getIpAddr() + "] TtMerchantPoiController::add_shop_material"); | |||
String appId = param.get("appId"); | |||
if(StringUtils.isBlank(appId)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"appId为空"); | |||
} | |||
String materialTypeStr = "7"; | |||
Integer materialType = null; | |||
if(StringUtils.isNotBlank(materialTypeStr)){ | |||
try{ | |||
materialType = Integer.parseInt(materialTypeStr); | |||
}catch (Exception e){ } | |||
WxAppinfo appinfo = appinfoService.getByAppId(appId); | |||
if(appinfo == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"找不到小程序信息"); | |||
} | |||
if(materialType == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | |||
String supplierExtId = param.get("supplierExtId"); | |||
if(StringUtils.isBlank(supplierExtId)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"商户ID为空"); | |||
} | |||
EnumMeterialType enumMeterialType = EnumMeterialType.getByCode(materialType); | |||
if(enumMeterialType == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); | |||
TtMerchantPoi merchantPoi = ttMerchantPoiService.getById(Long.parseLong(supplierExtId)); | |||
if(merchantPoi == null){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"查询不到商户"); | |||
} | |||
long size = multiReq.getSize(); | |||
final long length = enumMeterialType.getSize(); | |||
if (size > length) { | |||
return new ResultData(ErrorCode.PICTURE_SIZE_EXCEED); | |||
String bizLicencePath = param.get("bizLicencePath"); | |||
if(StringUtils.isBlank(bizLicencePath)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"商铺营业执照为空"); | |||
} | |||
merchantPoi.setBizLicencePath(bizLicencePath); | |||
String fileFormat = ""; | |||
try { | |||
int dot = multiReq.getOriginalFilename().lastIndexOf('.'); | |||
if (dot >= 0) { | |||
fileFormat = multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); | |||
String contractPath = param.get("contract_path"); | |||
if(StringUtils.isBlank(contractPath)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"授权函为空"); | |||
} | |||
merchantPoi.setContractPath(contractPath); | |||
String expireTime = param.get("expire_time"); | |||
if(StringUtils.isBlank(expireTime)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"过期时间为空"); | |||
} | |||
String regex = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29) "; | |||
if(!expireTime.matches(regex)){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"过期时间格式 YYYY-MM-DD"); | |||
} | |||
merchantPoi.setExpireTime(expireTime); | |||
String qualMaterial = param.get("qual_material"); | |||
if(StringUtils.isNotBlank(qualMaterial)){ | |||
try{ | |||
JSON.parse(qualMaterial); | |||
merchantPoi.setQualMaterial(qualMaterial); | |||
}catch(Exception e){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"商铺行业资质材料信息格式不正确"); | |||
} | |||
} | |||
String additionalQual = param.get("additional_qual"); | |||
if(StringUtils.isNotBlank(additionalQual)){ | |||
try{ | |||
JSON.parse(additionalQual); | |||
merchantPoi.setAdditionalQual(additionalQual); | |||
}catch(Exception e){ | |||
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"其他补充资质信息格式不正确"); | |||
} | |||
} | |||
TtOpenMaService openMaService = openService.getTtOpenComponentService().getTtMaServiceByAppid(appId); | |||
String res = openMaService.mediaUpload(materialType, fileFormat, multiReq.getInputStream()); | |||
return new ResultData(res); | |||
boolean b = ttMerchantPoiService.addShopMaterial(appinfo,merchantPoi); | |||
} catch (Exception e) { | |||
logger.error("解析图片",e); | |||
return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR); | |||
} | |||
return new ResultData(b); | |||
} | |||
} |
@@ -1,98 +0,0 @@ | |||
package com.iformall.controller; | |||
import com.iformall.common.ErrorCode; | |||
import com.iformall.common.ResultData; | |||
import com.iformall.controller.base.BaseController; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiOperation; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.web.bind.annotation.PostMapping; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RequestParam; | |||
import org.springframework.web.bind.annotation.RestController; | |||
import org.springframework.web.multipart.MultipartFile; | |||
import javax.imageio.ImageIO; | |||
import java.awt.image.BufferedImage; | |||
import java.util.ArrayList; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
@RestController | |||
@RequestMapping(value = "upload") | |||
@Api(description = "文件上传接口") | |||
public class UploadController extends BaseController { | |||
private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
/** | |||
* 上传文件 | |||
* | |||
* @param multiReq | |||
* @return | |||
* @throws Exception | |||
*/ | |||
@PostMapping(value = "/awsFileUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data") | |||
@ApiOperation("上传文件") | |||
public ResultData awsfileUpload(@RequestParam("file") MultipartFile multiReq) { | |||
logger.info("[" + getIpAddr() + "] UploadController::awsfileUpload"); | |||
try { | |||
int dot = multiReq.getOriginalFilename().lastIndexOf('.'); | |||
String fileFormat = ""; | |||
if (dot >= 0) { | |||
fileFormat = multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); | |||
} | |||
return new ResultData(fileFormat); | |||
} catch (Exception e) { | |||
logger.error(e.getMessage()); | |||
return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR); | |||
} | |||
} | |||
/** | |||
* 图片上传 | |||
* | |||
* @param multiReq | |||
* @return | |||
* @throws Exception | |||
*/ | |||
@PostMapping(value = "/awsImgUpload", consumes = "multipart/*", headers = "content-type=multipart/form-data") | |||
@ApiOperation("上传图片") | |||
public ResultData awsImgUpload(@RequestParam("file") MultipartFile multiReq | |||
, @RequestParam Map<String, String> param) { | |||
logger.info("[" + getIpAddr() + "] UploadController::awsImgUpload"); | |||
long size = multiReq.getSize(); | |||
final long length = 2097152; | |||
if (size > length) { | |||
return new ResultData(ErrorCode.PICTURE_SIZE_EXCEED); | |||
} | |||
String fileFormat = ""; | |||
try { | |||
int dot = multiReq.getOriginalFilename().lastIndexOf('.'); | |||
if (dot >= 0) { | |||
fileFormat = multiReq.getOriginalFilename().substring(dot, multiReq.getOriginalFilename().length()); | |||
} | |||
return new ResultData(fileFormat); | |||
} catch (Exception e) { | |||
logger.error("解析图片",e); | |||
return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR); | |||
} | |||
} | |||
} |
@@ -7,7 +7,7 @@ public class UrlCheck { | |||
public static boolean checkUrl(String url) { | |||
return url.contains("upload_material") | |||
||url.contains("awsFileUpload") | |||
|| url.contains("awsFileUpload") | |||
|| url.contains("awsFilesUpload") | |||
|| url.contains("wxMsgCallback") | |||
|| url.contains("notify"); | |||