koubei.marketing.campaign.activity.create (活动创建接口)沙箱java版

简介: 通过创建营销活动接口,活动定义主要由活动基本信息,预算信息,活动约束信息,优惠券工具,投放渠道和招商工具信息组成,为了演示简单,我们仅用必要的配置来创建一个“消费后送1分钱代金券”的活动,如需了解更详细的活动创建配置说明,可参阅进阶说明。

通过创建营销活动接口,活动定义主要由活动基本信息,预算信息,活动约束信息,优惠券工具,投放渠道和招商工具信息组成,为了演示简单,我们仅用必要的配置来创建一个“消费后送1分钱代金券”的活动,如需了解更详细的活动创建配置说明,可参阅进阶说明。 示例使用的是java语言,jdk版本需在1.5及以上的开发环境,否者可能会出现测试不通过,在沙箱调通接口后,必须在线上进行测试与验收,所有返回码及业务逻辑以线上为准; 对接须知:  1、正式环境需创建应用配置密钥提交审核,签约生效后方可正常使用;签约请联系商户客服进行咨询  沙箱环境测试注意点:      a、在沙箱调通接口后,必须在线上进行测试与验收,所有返回码及业务逻辑以线上为准;      c、可使用沙箱环境-沙箱工具-口碑门店账号&二维码转换工具,通过沙箱钱包的扫一扫功能,进入商家详情页,查看门店效果;      d、沙箱测试创建门店,推荐使用北京、上海、杭州三个城市在国家统计局中有的区域进行测试,如遇到区域不存在的情况,请更换区域调试;  2、下载服务端SDK  demo下载:营销活动创建接口.zip(非官方文档,仅供参考) koubei.marketing.campaign.activity.create (活动创建接口)接口示例代码

package com.alipay.demo;
    
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
    
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.BudgetInfo;
import com.alipay.api.domain.ConstraintInfo;
import com.alipay.api.domain.ItemInfo;
import com.alipay.api.domain.KoubeiMarketingCampaignActivityCreateModel;
import com.alipay.api.domain.PromoTool;
import com.alipay.api.domain.PublishChannel;
import com.alipay.api.domain.SendRule;
import com.alipay.api.domain.UseRule;
import com.alipay.api.domain.Voucher;
import com.alipay.api.request.KoubeiMarketingCampaignActivityCreateRequest;
import com.alipay.api.response.KoubeiMarketingCampaignActivityCreateResponse;
import com.alipay.config.AlipayConfig;
    
/**
 * koubei.marketing.campaign.activity.create (活动创建接口)
 * @author wb-wly251833
 * 文档链接:https://doc.open.alipay.com/doc2/apiDetail.htm?spm=a219a.7395905.0.0.zlCQSG&docType=4&apiId=1086
 */
public class koubeiMarketingCampaignActivityCreate {
    
    public static void main(String[] args) throws AlipayApiException, ParseException {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        KoubeiMarketingCampaignActivityCreateRequest request = new KoubeiMarketingCampaignActivityCreateRequest();
        KoubeiMarketingCampaignActivityCreateModel model = new KoubeiMarketingCampaignActivityCreateModel();
        //外部批次ID
        model.setOutBizNo(getOutBizNo());   
        //活动名称
        model.setName("消费满10元送1元代金券"); 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        Date startTime = sdf.parse("2017-05-01 00:00:00");  
        Date endTime = sdf.parse("2018-05-01 00:00:00");  
        //活动开始时间
        model.setStartTime(startTime); 
        //活动结束时间
        model.setEndTime(endTime); 
        //活动类型,CONSUME_SEND:消费送活动; DIRECT_SEND:直发奖活动; REAL_TIME_SEND:实时立减类活动 
        model.setType("REAL_TIME_SEND"); 
        //活动详细说明
        model.setDesc("该活动是用于挽回流失用户的"); 
        //投放渠道
        model.setPublishChannels(getPublishChannels());
        //活动预算
        model.setBudgetInfo(getBudgetInfo());
        // 活动限制信息
        model.setConstraintInfo(getConstraintInfo());
            
        /********营销工具集   **********/
        List toolList =new ArrayList<>();
        toolList.add(getPromoTool());
        model.setPromoTools(toolList); 
            
        request.setBizModel(model);
        KoubeiMarketingCampaignActivityCreateResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
        System.out.println("调用成功");
        } else {
        System.out.println("调用失败");
        }
         System.out.println(response.getBody());
    }
        
        
    /**
     * 外部批次ID
     * @return
     */
    private static String getOutBizNo() {
        SimpleDateFormat simpleDateFormat;
        simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        Date date = new Date();
        String str = simpleDateFormat.format(date);
        Random random = new Random();
        int rannum = (int) (random.nextDouble() * (999 - 100 + 1)) + 100;// 获取5位随机数
        return str+rannum;// 当前时间
    }
        
    /**
     * 投放渠道
     * @return
     */
    private static List getPublishChannels() {
      // TODO Auto-generated method stub
      List l=new ArrayList<>();
      PublishChannel p= new PublishChannel();
      p.setType("SHOP_DETAIL");
      p.setName("投放到店铺");
      l.add(p);
      return l;
    }
        
        
    /**
     * 活动限制信息
     * @return
     */
    private static ConstraintInfo getConstraintInfo() {
        ConstraintInfo constraintInfo = new  ConstraintInfo();
        //活动期间用户能够参与的次数限制 ,不填则不做限制
        //constraintInfo.setUserWinCount("1"); 
        //活动期间用户能够参与的频率限制 ,不填则不限制参与频率, 每日中奖1次: D||1  
        //constraintInfo.setUserWinFrequency("D||3"); 
        //人群规则组ID 人群规则组ID 仅直发奖类型活动设置有效,通过调用营销活动人群组规则创建接口参数返回
        //constraintInfo.setCrowdGroupId("12344556");
        //活动适用的门店列表仅品牌商发起的招商活动可为空 最多支持10w家门店
        constraintInfo.setSuitShops(getSuitShops());
        //最低消费金额,单位元 仅在创建消费送礼包活动时设置
        //constraintInfo.setMinCost("12");
        return constraintInfo;
        }
        
    /**
     * 券对象,当活动类型为POINT_SEND时为null,其他活动类型此字段必填
     * @return
     */
    private static  Voucher getVoucher(){
        Voucher voucher = new Voucher();
        //券类型,目前支持以下类型:  EXCHANGE:兑换券  MONEY:代金券  REDUCETO:减至券  RATE:折扣券
        voucher.setType("MONEY");
        //该字段仅在兑换券条件下(即券类型为EXCHANGE),用于设置兑换券的核销方式 
        //voucher.setVerifyMode("MERCHANT_SCAN");
        //名称
        voucher.setName("满十减一");
            
        //券的使用说明 
        List UseInstructionsList = new ArrayList<>();
        UseInstructionsList.add("满十减一特价优惠");
        voucher.setUseInstructions(UseInstructionsList);
            
        //券LOGO文件ID,调用图片上传接口alipay.offline.material.image.upload获得
        voucher.setLogo("gKpPK40RSNeBiMxDsat8CQAAACMAAQED");
        //券有效期类型,目前支持以下类型: RELATIVE:相对有效期 ,FIXED:绝对有效期
        voucher.setValidateType("RELATIVE");
        //券副标题
        voucher.setBrandName("券副标题测试");
        //券生效的方式,目前支持以下方式 立即生效:IMMEDIATELY  延迟生效:DELAY 仅在券有效期类型为相对有效期时生效
        voucher.setEffectType("IMMEDIATELY");
        //券面额
        voucher.setWorthValue("1");
        // 券的使用规则信息
        voucher.setUseRule(getUseRule());
        //单品信息 兑换券不允许设置单品信息 减至券必须设置单品信息 其他类型券可按需设置
        voucher.setItemInfo(getItemInfo());
        //券的备注
        voucher.setVoucherNote("券的备注测试");
        return voucher;
    }
        
    /**
     * Item_Info 单品信息
     * @return
     */
    private static ItemInfo getItemInfo() {
          // TODO Auto-generated method stub
          ItemInfo itemInfo=new ItemInfo();
          itemInfo.setItemText("单品卷测试");
          itemInfo.setItemName("新版ipad");
          itemInfo.setItemIds(getitemIds());
          return itemInfo;
    }
        
    /**
     * item_ids 单品码列表 
     * @return
     */
    private static List getitemIds() {
          // TODO Auto-generated method stub
          List l=new ArrayList<>();
          l.add("000123456");
          return l;
    }
        
    /**
     * 券的使用规则信息
     * @return
     */
    private static UseRule getUseRule(){
        UseRule useRule = new UseRule();
        useRule.setSuitShops(getSuitShops());
        return useRule;
    }
        
    /**
     * 活动适用的门店列表 
     * @return
     */
    private static List getSuitShops() {
          // TODO Auto-generated method stub
          List SuitShops=new ArrayList<>();
          SuitShops.add("2017090500077000000000123588");
          SuitShops.add("2017031700077000000000073266");
          return SuitShops;
    }
        
    /**
     * 营销工具集
     * @return
     */
    private static  PromoTool getPromoTool(){
        PromoTool promoTool = new PromoTool();
        //券对象
        promoTool.setVoucher(getVoucher());
        //单个营销工具的生效状态,当在招商部分券失效后会使用这个字段
        //promoTool.setStatus("");
        //奖品发放的规则
        promoTool.setSendRule(getSendRule());
        return  promoTool;
    }
        
    /**
     * 奖品发放的规则
     * @return
     */
    private static SendRule getSendRule() {
          // TODO Auto-generated method stub
          SendRule s=new SendRule();
          //发券最低消费金额
          s.setMinCost("100");
          return s;
        }
        
    /**
     * 活动预算
     * @return
     */
    private static   BudgetInfo getBudgetInfo(){
        //活动预算
        BudgetInfo budgetInfo = new BudgetInfo();
        //预算类型
        budgetInfo.setBudgetType("QUANTITY"); 
        //预算数量
        budgetInfo.setBudgetTotal("10258");
        return budgetInfo;
    }
}

请求参数注意事项: 1.app_auth_token:ISV/开发者可以通过“第三方应用授权”得到商家授权令牌(app_auth_token)作为请求参数传入,实现代商家发起请求的能力; 2.voucher.Logo:券LOGO文件ID,调用alipay.offline.material.image.upload(图片上传接口)获得,接口示例 可点击【查看】根据帖子进行测试获取image_id 3.SuitShops:活动适用的门店列表 ,这个需要使用查询商户的门店编号列表接口进行查询获取 调用成功返回信息:

{"koubei_marketing_campaign_activity_create_response":{"code":"10000","msg":"Success","camp_id":"20170926000000000839270000151581","camp_status":"STARTED"}

注:如果创建成功 alipayResponse.getCode() 可以获取结果码10000,结果码和错误码请参考本文结果码说明章节。alipayResponse.getCampId() 可以获取营销活动ID,后面会用到。 以下是我在沙箱环境下测试到的错误,这边分享给大家: 1.错误原因:OperatorId(操作人id)该参数没有填写正确,必须和operator_type配对出现,不填时默认是商户 

{"koubei_marketing_campaign_activity_create_response":{"code":"40004","msg":"Business Failed","sub_code":"REQ_PARAM_ERROR","sub_msg":"非法访问,权限不足"}

2.错误原因:SuitShops(活动适用的门店列表 )填写不正确,这个需要使用查询商户的门店编号列表接口进行查询获取 还需注意的是PromoTools->voucher->UseRule.SuitShops 跟 ConstraintInfo.SuitShops 必须保持一致

{"koubei_marketing_campaign_activity_create_response":{"code":"40004","msg":"Business Failed","sub_code":"BIZ_INVOKE_ERROR","sub_msg":"AE0311111201:传入门店id数目与查询出的门店数目不符,门店[2015110600077000000002125023]不存在"}

3.错误原因:你的voucher 中的EffectType(券生效的方式)=IMMEDIATELY(立即生效),Voucher的Type=EXCHANGE(兑换券,导致的报错,需要将EffectType改成DELAY(延迟生效)或者 将Voucher的Type修改为别的

{"koubei_marketing_campaign_activity_create_response":{"code":"40004","msg":"Business Failed","sub_code":"BIZ_INVOKE_ERROR","sub_msg":"AE0311111201:实时优惠不支持兑换券"}

4.将Voucher下的Type=MONEY时,voucher.WorthValue不能为空

{"koubei_marketing_campaign_activity_create_response":{"code":"40004","msg":"Business Failed","sub_code":"BIZ_INVOKE_ERROR","sub_msg":"AE0311111201:券的类型为代金券或立减券时,券面额不能为空"},

5. Voucher 下的Voucher的Type设置为EXCHANGE(兑换券)时,VerifyMode=MERCHANT_SCAN ,否者不能设值

{"koubei_marketing_campaign_activity_create_response":{"code":"40004","msg":"Business Failed","sub_code":"BIZ_INVOKE_ERROR","sub_msg":"AE0311111201:只有兑换券才能设置券核销方式"}

6.constraintInfo.CrowdGroupId 人群规则组ID ,仅直发奖类型活动设置有效,通过调用营销活动人群组规则创建接口参数返回的crowd_group_id

{"koubei_marketing_campaign_activity_create_response":{"code":"40004","msg":"Business Failed","sub_code":"BIZ_INVOKE_ERROR","sub_msg":"AE0311111201:传入的人群id不正确"}

7.这个错有点坑的,有时候你的代码没有错,也会报,过会再运行就好了,可能是你测试过于频繁导致的,但大多数是参数错误导致的

{"null_response":{"code":"20000","msg":"Service Currently Unavailable","sub_code":"aop.unknow-error","sub_msg":"系统繁忙"}}

如:constraintInfo.setCrowdRestriction我的传值如下,然后一直报这个错,注掉后就成功了

constraintInfo.setCrowdRestriction("NEW_MEMBER_PROMO:新会员 STUDENT:学生用户,仅对DIRECT_SEND类型活动有效");

目录
相关文章
|
2天前
|
Java 开发者
Java一分钟之-Lambda表达式与函数式接口
【5月更文挑战第12天】Java 8引入的Lambda表达式简化了函数式编程,与函数式接口结合,实现了代码高效编写。本文介绍了Lambda的基本语法,如参数列表、箭头符号和函数体,并展示了如何使用Lambda实现`Runnable`接口。函数式接口仅有一个抽象方法,可与Lambda搭配使用。`@FunctionalInterface`注解用于确保接口具有单一抽象方法。文章还讨论了常见的问题和易错点,如非函数式接口、类型冲突以及Lambda表达式的局部变量可见性,并提供了避免这些问题的策略。通过理解Lambda和函数式接口,开发者能提高代码可读性和效率。
38 4
|
1天前
|
Java ice
【Java开发指南 | 第二十九篇】Java接口
【Java开发指南 | 第二十九篇】Java接口
6 0
|
1天前
|
Java ice
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
【Java开发指南 | 第九篇】访问实例变量和方法、继承、接口
10 4
|
3天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
43 3
|
3天前
|
Java API
Java 接口
5月更文挑战第6天
|
4天前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
7 0
|
4天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
11 0
|
4天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
7 0
|
4天前
|
Java
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
|
5天前
|
Java
Java一分钟之-抽象类与接口的应用场景
【5月更文挑战第9天】Java中,抽象类和接口用于实现多态和抽象。抽象类不能实例化,提供部分实现和定义模板;接口包含无实现的抽象方法,用于定义行为规范和解耦合。选择时,关注行为用接口,部分实现用抽象类。注意抽象类的`final`和`static`方法、接口冲突等问题,明确设计目标,适度抽象,遵循接口设计原则,以提高代码质量。
13 1