Commit ba5378df by 李传峰

Merge branch 'feature/checkCpa' into 'master'

feat: [none] CPA广告-权益ID校验

See merge request rays/pcloud-book!1709
parents 78a21b72 5f2f8f72
package com.pcloud.book.advertising.biz;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySyncRecord;
import com.pcloud.common.page.PageBeanNew;
import java.util.List;
/**
* (AdvertisingCpaPaySyncRecord)表服务接口
*
* @author makejava
* @since 2022-12-09 16:41:33
*/
public interface AdvertisingCpaPaySyncRecordBiz {
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
AdvertisingCpaPaySyncRecord getById(Long id);
/**
* 分页查询
*/
PageBeanNew getList(Integer currentPage, Integer numPerPage);
/**
* 新增数据
*
* @param advertisingCpaPaySyncRecord 实例对象
* @return 主键
*/
Long insert(AdvertisingCpaPaySyncRecord advertisingCpaPaySyncRecord);
/**
* 修改数据
*
* @param advertisingCpaPaySyncRecord 实例对象
*/
void update(AdvertisingCpaPaySyncRecord advertisingCpaPaySyncRecord);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
void deleteById(Long id);
}
......@@ -3,6 +3,7 @@ package com.pcloud.book.advertising.biz.impl;
import cn.hutool.core.collection.CollUtil;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.biz.BmBiz;
import com.pcloud.book.advertising.check.AdvertisingCheck;
import com.pcloud.book.advertising.entity.AdvertisingBmOption;
import com.pcloud.book.advertising.entity.AdvertisingBmOptionItem;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
......@@ -42,6 +43,8 @@ public class AdvertisingCpaPaySettingBizImpl implements AdvertisingCpaPaySetting
private BmBiz bmBiz;
@Autowired
private AdvertisingCpaProductPackageBiz cpaProductPackageBiz;
@Autowired
private AdvertisingCheck advertisingCheck;
@Override
@ParamLog("通过ID查询单条数据")
......@@ -89,9 +92,6 @@ public class AdvertisingCpaPaySettingBizImpl implements AdvertisingCpaPaySetting
if (cpaId == null) {
return;
}
if (Objects.equals(paySetting, YesNoEnums.YES.code) && CollUtil.isEmpty(cpaPaySettingList)) {
throw new BizException(BizException.PARAM_DELETION.getCode(), "请配置付费规则");
}
cpaPaySettingList = Optional.ofNullable(cpaPaySettingList).orElse(CollUtil.toList());
// 查询报名表单
List<AdvertisingBmOption> bmOptionList = bmBiz.getByCPAId(cpaId);
......
package com.pcloud.book.advertising.biz.impl;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySyncRecord;
import com.pcloud.book.advertising.dao.AdvertisingCpaPaySyncRecordDao;
import com.pcloud.book.advertising.biz.AdvertisingCpaPaySyncRecordBiz;
import com.pcloud.common.core.aspect.ParamLog;
import com.pcloud.common.page.PageBeanNew;
import com.pcloud.common.page.PageParam;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.NumberUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* (AdvertisingCpaPaySyncRecord)表服务实现类
*
* @author makejava
* @since 2022-12-09 16:41:33
*/
@Service("advertisingCpaPaySyncRecordBiz")
public class AdvertisingCpaPaySyncRecordBizImpl implements AdvertisingCpaPaySyncRecordBiz {
private static final Logger LOGGER = LoggerFactory.getLogger(AdvertisingCpaPaySyncRecordBizImpl.class);
@Autowired
private AdvertisingCpaPaySyncRecordDao advertisingCpaPaySyncRecordDao;
@Override
@ParamLog("通过ID查询单条数据")
public AdvertisingCpaPaySyncRecord getById(Long id) {
return advertisingCpaPaySyncRecordDao.getById(id);
}
@Override
@ParamLog("查询多条数据")
public PageBeanNew getList(Integer currentPage, Integer numPerPage) {
PageBeanNew pageBeanNew = advertisingCpaPaySyncRecordDao.listPageNew(new PageParam(currentPage, numPerPage), null, "getList");
List recordList = pageBeanNew.getRecordList();
if (ListUtils.isEmpty(recordList)){
return pageBeanNew;
}
// 加载其它数据
return pageBeanNew;
}
@Override
@ParamLog("新增")
public Long insert(AdvertisingCpaPaySyncRecord advertisingCpaPaySyncRecord) {
advertisingCpaPaySyncRecordDao.insert(advertisingCpaPaySyncRecord);
return advertisingCpaPaySyncRecord.getId();
}
@Override
@ParamLog("修改")
public void update(AdvertisingCpaPaySyncRecord advertisingCpaPaySyncRecord) {
if(advertisingCpaPaySyncRecord == null || !NumberUtil.isNumber(advertisingCpaPaySyncRecord.getId())){
throw BizException.PARAM_IS_NULL;
}
advertisingCpaPaySyncRecordDao.update(advertisingCpaPaySyncRecord);
}
@Override
@ParamLog("删除")
public void deleteById(Long id) {
advertisingCpaPaySyncRecordDao.deleteById(id);
}
}
......@@ -3257,6 +3257,8 @@ public class AdvertisingSpaceBizImpl implements AdvertisingSpaceBiz {
@Override
public void updateCPAContent(AdvertisingCpa advertisingCpa) {
// 校验
advertisingCheck.checkCPAProductPackageParam(advertisingCpa.getPaySetting(), advertisingCpa.getAdvertisingCpaPaySettingList());
advertisingCpa = equipCPA(advertisingCpa);
Long cpaId = advertisingCpa.getId();
//广告详情,报名表单选项新增
......
package com.pcloud.book.advertising.check;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.pcloud.book.advertising.biz.AdvertisingCpaProductPackageBiz;
import com.pcloud.book.advertising.entity.AdvertisingCpa;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySetting;
import com.pcloud.book.advertising.entity.AdvertisingCpaProductPackage;
import com.pcloud.book.advertising.entity.AdvertisingDetailFile;
import com.pcloud.book.advertising.entity.AdvertisingSpace;
import com.pcloud.book.advertising.enums.AdDetailModeEnum;
......@@ -14,9 +19,11 @@ import com.pcloud.common.utils.ListUtils;
import com.pcloud.common.utils.string.StringUtil;
import com.pcloud.message.common.enums.YesNoEnums;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -29,6 +36,9 @@ import java.util.regex.Pattern;
@Component("advertisingCheck")
public class AdvertisingCheck {
@Autowired
private AdvertisingCpaProductPackageBiz cpaProductPackageBiz;
/**
* 新增广告位前校验参数
*/
......@@ -122,8 +132,25 @@ public class AdvertisingCheck {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "按钮提示不能为空!");
}
}
if (YesNoEnums.YES.code.equals(advertisingCpa.getPaySetting()) && CollUtil.isEmpty(advertisingCpa.getAdvertisingCpaPaySettingList())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请配置付费规则!");
// CPA第三方权益包校验
checkCPAProductPackageParam(advertisingCpa.getPaySetting(), advertisingCpa.getAdvertisingCpaPaySettingList());
}
public void checkCPAProductPackageParam(Integer paySetting, List<AdvertisingCpaPaySetting> cpaPaySettingList) {
if (YesNoEnums.YES.code.equals(paySetting)) {
if (CollUtil.isEmpty(cpaPaySettingList)) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请配置付费规则!");
} else {
Map<String, AdvertisingCpaProductPackage> cpaProductPackageMap = cpaProductPackageBiz.mapAll();
if (MapUtil.isEmpty(cpaProductPackageMap)) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, "请先在数据库中配置好第三方权益包!");
}
for (AdvertisingCpaPaySetting cpaPaySetting : cpaPaySettingList) {
if (!cpaProductPackageMap.containsKey(cpaPaySetting.getProductPackageId())) {
throw new BookBizException(BookBizException.PARAM_IS_ERROR, StrUtil.format("请核对权益ID【{}】是否正确", cpaPaySetting.getProductPackageId()));
}
}
}
}
}
......
......@@ -6,11 +6,13 @@ import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.pcloud.common.exceptions.BizException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
......@@ -30,7 +32,7 @@ public class QiLiShuSheApiHandler {
this.domain = domain;
}
public boolean post(String path, HashMap<String, Object> bodyMap) {
public ApiRequestResult post(String path, HashMap<String, Object> bodyMap) {
HttpRequest post = HttpUtil.createPost(this.domain + path);
String nonceStr = IdUtil.fastSimpleUUID();
long timestamp = System.currentTimeMillis() / 1000;
......@@ -41,17 +43,26 @@ public class QiLiShuSheApiHandler {
post.header("signature", getSign("POST", path, sortBody(bodyMap), nonceStr, timestamp));
post.body(body);
String result = post.execute().body();
// 返回值
ApiRequestResult requestResult = new ApiRequestResult();
requestResult.setRunSuccess(false);
requestResult.setApiUrl(post.getUrl());
requestResult.setApiBody(body);
requestResult.setApiResult(result);
log.info("【起礼科技】请求第三方接口结果;result:{};post:{}", result, post);
if (StrUtil.isBlank(result)) {
return false;
return requestResult;
}
JSONObject jsonObject = JSONObject.parseObject(result);
if (jsonObject.getBoolean("success")) {
log.info("【起礼科技】数据同步成功;body:{}", body);
return true;
requestResult.setRunSuccess(true);
return requestResult;
}
log.info("【起礼科技】数据同步失败;body:{}", body);
return false;
return requestResult;
}
private String sortBody(HashMap<String, Object> bodyMap) {
......@@ -83,4 +94,17 @@ public class QiLiShuSheApiHandler {
throw new BizException(BizException.DB_DML_FAIL.getCode(), "【起礼科技】第三方签名生成失败;");
}
}
@Data
public static class ApiRequestResult implements Serializable {
private Boolean runSuccess;
private String apiUrl;
private String apiBody;
private String apiResult;
}
}
package com.pcloud.book.advertising.dao;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySyncRecord;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
/**
* (AdvertisingCpaPaySyncRecord)表数据库访问层
*
* @author makejava
* @since 2022-12-09 16:41:33
*/
public interface AdvertisingCpaPaySyncRecordDao extends BaseDao<AdvertisingCpaPaySyncRecord> {
}
package com.pcloud.book.advertising.dao.impl;
import com.pcloud.book.advertising.entity.AdvertisingCpaPaySyncRecord;
import com.pcloud.book.advertising.dao.AdvertisingCpaPaySyncRecordDao;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* (AdvertisingCpaPaySyncRecord)表数据库访问层
*
* @author makejava
* @since 2022-12-09 16:41:33
*/
@Repository("advertisingCpaPaySyncRecordDaoImpl")
public class AdvertisingCpaPaySyncRecordDaoImpl extends BaseDaoImpl<AdvertisingCpaPaySyncRecord> implements AdvertisingCpaPaySyncRecordDao {
}
......@@ -112,6 +112,16 @@ public class AdvertisingBmRegister extends BaseEntity{
private String phoneNumber;
private Integer payStatusThird;
public Integer getPayStatusThird() {
return payStatusThird;
}
public void setPayStatusThird(Integer payStatusThird) {
this.payStatusThird = payStatusThird;
}
public String getPhoneNumber() {
return phoneNumber;
}
......
package com.pcloud.book.advertising.entity;
import java.util.Date;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* (AdvertisingCpaPaySyncRecord)实体类
*
* @author makejava
* @since 2022-12-09 19:24:49
*/
@Data
public class AdvertisingCpaPaySyncRecord extends BaseEntity {
private static final long serialVersionUID = 1;
@ApiModelProperty("权益配置id")
private Long id;
@ApiModelProperty("订单号")
private String orderNum;
@ApiModelProperty("调用链接")
private String apiUrl;
@ApiModelProperty("调用参数")
private String apiBody;
@ApiModelProperty("调用结果")
private String apiResult;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@ApiModelProperty("更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
@ApiModelProperty("动作code")
private String actionCode;
@ApiModelProperty("消息")
private String msg;
}
package com.pcloud.book.advertising.enums;
public enum ApiActionCodeEnum {
PAY,
REFUND,
;
}
package com.pcloud.book.advertising.enums;
public enum PayStatusThirdSyncEnum {
PAY_SYNC_SUCCESS(1, "支付同步成功"),
PAY_SYNC_FAIL(2, "支付同步失败"),
REFUND_SYNC_SUCCESS(3, "退款同步成功"),
REFUND_SYNC_FAIL(4, "退款同步失败"),
;
public final Integer status;
public final String desc;
PayStatusThirdSyncEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
}
......@@ -23,6 +23,7 @@
<result column="order_num" property="orderNum" jdbcType="VARCHAR"/>
<result column="pay_status" property="payStatus" jdbcType="INTEGER"/>
<result column="phone_number" property="phoneNumber" jdbcType="VARCHAR"/>
<result column="pay_status_third" property="payStatusThird" jdbcType="INTEGER"/>
</resultMap>
<!-- 微信端用户详细信息 -->
......@@ -41,7 +42,7 @@
<sql id="Base_Column_List" >
id, user_id, ad_id, nick_name, create_time, qrcode_id, scene_id, adviser_id, agent_id, channel_id, official_account_id, from_type,
from_id,book_id,create_day, create_month,cpa_id,cpa_pay_setting_id,order_num,pay_status,phone_number
from_id,book_id,create_day, create_month,cpa_id,cpa_pay_setting_id,order_num,pay_status,phone_number,pay_status_third
</sql>
<select id="getById" parameterType="long" resultMap="BaseResultMap">
......@@ -71,7 +72,8 @@
cpa_pay_setting_id,
order_num,
pay_status,
phone_number
phone_number,
pay_status_third
)
VALUES
(
......@@ -94,7 +96,8 @@
#{cpaPaySettingId},
#{orderNum},
#{payStatus},
#{phoneNumber}
#{phoneNumber},
#{payStatusThird}
)
</insert>
......@@ -252,6 +255,9 @@
<if test="phoneNumber!=null">
phone_number = #{phoneNumber},
</if>
<if test="payStatusThird!=null">
pay_status_third = #{payStatusThird},
</if>
</set>
WHERE
id = #{id}
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pcloud.book.advertising.dao.impl.AdvertisingCpaPaySyncRecordDaoImpl">
<resultMap id="BaseResultMap" type="com.pcloud.book.advertising.entity.AdvertisingCpaPaySyncRecord">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="order_num" property="orderNum" jdbcType="VARCHAR"/>
<result column="api_url" property="apiUrl" jdbcType="VARCHAR"/>
<result column="api_body" property="apiBody" jdbcType="VARCHAR"/>
<result column="api_result" property="apiResult" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
<result column="action_code" property="actionCode" jdbcType="VARCHAR"/>
<result column="msg" property="msg" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id, order_num, api_url, api_body, api_result, create_time, update_time, action_code, msg
</sql>
<select id="getById" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_pay_sync_record
WHERE id = #{id}
</select>
<select id="getList" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM advertising_cpa_pay_sync_record
</select>
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
INSERT INTO advertising_cpa_pay_sync_record(
order_num,
api_url,
api_body,
api_result,
create_time,
update_time,
action_code,
msg
) VALUES (
#{orderNum, jdbcType=VARCHAR},
#{apiUrl, jdbcType=VARCHAR},
#{apiBody, jdbcType=VARCHAR},
#{apiResult, jdbcType=VARCHAR},
#{createTime, jdbcType=TIMESTAMP},
#{updateTime, jdbcType=TIMESTAMP},
#{actionCode, jdbcType=VARCHAR},
#{msg, jdbcType=VARCHAR}
)
</insert>
<insert id="batchInsert">
INSERT INTO advertising_cpa_pay_sync_record (
order_num,
api_url,
api_body,
api_result,
create_time,
update_time,
action_code,
msg
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.orderNum, jdbcType=VARCHAR},
#{item.apiUrl, jdbcType=VARCHAR},
#{item.apiBody, jdbcType=VARCHAR},
#{item.apiResult, jdbcType=VARCHAR},
#{item.createTime, jdbcType=TIMESTAMP},
#{item.updateTime, jdbcType=TIMESTAMP},
#{item.actionCode, jdbcType=VARCHAR},
#{item.msg, jdbcType=VARCHAR}
)
</foreach>
</insert>
<!--通过主键修改数据-->
<update id="update">
UPDATE advertising_cpa_pay_sync_record
<set>
<if test="orderNum != null">
order_num = #{orderNum},
</if>
<if test="apiUrl != null">
api_url = #{apiUrl},
</if>
<if test="apiBody != null">
api_body = #{apiBody},
</if>
<if test="apiResult != null">
api_result = #{apiResult},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="actionCode != null">
action_code = #{actionCode},
</if>
<if test="msg != null">
msg = #{msg},
</if>
</set>
WHERE id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
DELETE FROM advertising_cpa_pay_sync_record where id = #{id}
</delete>
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment