批量推送

对各个推送 ID 推送不同消息。通过替换模板占位符的方式,创建针对某一推送 ID 的个性化消息。与模板推送的区别在于,每一个推送 ID 可以收到内容不同的消息。

重要

当推送目标为移动分析人群或自定义标签人群时,不支持定时和循环推送。

在调用本接口之前,确保已完成以下操作:

  • 在消息推送控制台上创建好目标模板,并确保模板中存在占位符,否则将无法实现消息的个性化推送(即对不同推送 ID 推送不同消息)。详细操作参见 创建模板

  • 引入 SDK 依赖,详见 SDK 准备

请求参数

参数名称

类型

是否必填

示例

描述

classification

String

1

用于传递 vivo 推送通道的消息类型:

  • 0 - 运营类消息

  • 1 - 系统类消息

不填则默认为 1。

taskName

String

批量测试

推送任务名称。

appId

String

ONEX570DA89211721

mPaaS App ID

workspaceId

String

test

mPaaS 工作空间

deliveryType

Long

3

目标 ID 类型,数值选择如下:

  • 1 - Android 设备维度

  • 2 - iOS 设备维度

  • 3 - 用户维度

  • 7 - HarmonyOS 设备维度

说明

用户维度和设备维度的目标最多可以传 100 个。

templateName

String

测试模板

模板名称,在控制台创建模板。

targetMsgs

List

targetMsgs 对象列表

目标对象列表,参数详见下方的 targetMsgs 对象说明

expiredSeconds

Long

300

消息有效期,单位为秒。

extendedParams

String

{“key1”:”value1”}

统一扩展参数,为 Map 形式。

notifyType

String

表示消息通道类型:

  • transparent - MPS 自建通道

  • notify - 默认通道

strategyType

Integer

1

推送策略类型:

  • 0 - 立即

  • 1 - 定时

  • 2 - 循环

不填则默认为 0。

StrategyContent

String

{\”fixedTime\”:1630303126000,\”startTime\”:1625673600000,\”endTime\”:1630303126000,\”circleType\”:1,\”circleValue\”:[1, 7],\”time\”:\”13:45:11\”}

推送策略详情(JSON 字符串)。strategyType 不等于 0 时必填。具体参数详见下方的 StrategyContent 字段说明

transparentMessagePayload

Map<String, JSONObject>

-

厂商透传消息体。

  • 键 key:厂商渠道类型

    • 华为通道为 hms

    • 荣耀通道为 honor

    • 谷歌 firebase 通道为 fcm

    • 鸿蒙通道为 harmonyos

  • value:透传消息体。推送给厂商的透传消息体使用该 value 值

透传消息体的格式如下:

{
	"data": "{\"name\":\"123hms\"}",
	"android": {
		"category": "VOIP",
		"ttl": "600s",
		"urgency": "HIGH"
	},
	"token": [
		"9912981981wqdq2112291fcm001saa222222222ggwerfw gsas2cc3"
	]
}

transparentMessageUrgency

String

-

厂商透传消息优先级(transparentMessagePayload 有值时有效)。

目前仅华为、荣耀以及鸿蒙支持,有 HIGH/NORMAL 可选。

针对华为、荣耀而言:

  • HIGH:表示高优先透传

  • NORMAL:或者不传参表示普通透传

针对鸿蒙而言:

  • HIGH:当前消息是透传消息

  • NORMAL:当前消息是后台消息

thirdChannelCategory

Map

thirdChannelCategory: {

"hms": "9", //华为 FINANCE 财务类型消息

"vivo": "1"

//vivo IM 类型消息

}

用于传递厂商消息分类,详情请参见 厂商消息分类

notifyLevel

Map

notifyLevel: {"oppo":"2"//OPPO通知栏+锁屏}

厂商消息提醒等级,如 OPPO 消息等级如下所示:

  • 1 - 通知栏

  • 2 - 通知栏+锁屏

  • 3 - 通知栏+锁屏+横幅+震动+铃声

miChannelId

String

"123321"

小米厂商推送渠道的 channelId

activityEvent

String

实时活动事件,可选 update/end:

  • update - 更新事件

  • end - 结束事件

activityContentState

JSONObject

实时活动消息的 content-state,需和客户端定义的参数保持一致

dismissalDate

long

实时活动消息过期时间(秒级时间戳),可选字段,不传则按 iOS 系统默认失效时间 12h。

说明

关于 activityEvent 参数:

  • activityEvent 为 end 事件时,dismissalDate 配置的过期时间才会生效。

  • activityEvent 为 update 事件时,dismissalDate 配置的过期时间不会生效。

  • 若传送 end 事件但不传 dismissalDate,iOS 系统默认 4 小时后结束实时活动。

targetMsgs 对象说明

参数名称

类型

是否必填

示例

描述

target

String

userid1024

目标 ID,根据 deliveryType 类型填写。

msgKey

String

1578807462788

业务消息 ID,用于消息的排查。由用户定义,不可重复。

templateKeyValue

String

{“money”:”200”,”name”:”张三”}

模板参数,为 Map 形式,和 templateName 指定的模板对应,key 为占位符名称,value 为要替换的值,例如模板内容为(两个 # 之间为占位符名称) 恭喜#name#中了#money#元

extendedParams

String

{“key1”:”value1”}

扩展参数,为 map 形式,针对每条消息的不同扩展参数。

StrategyContent 字段说明

JSON 格式转化为 String 传值。

参数名称

类型

是否必填

示例

描述

fixedTime

long

1630303126000

定时推送时间戳(单位:毫秒,精确到秒)。推送策略类型为定时(strategyType 值为 1)时,fixedTime 必填。

startTime

long

1640966400000

循环周期开始时间戳(单位:毫秒,精确到天)。推送策略类型为循环(strategyType 值为 2)时,startTime 必填。

endTime

long

1672416000000

循环周期结束时间戳(单位:毫秒,精确到天),循环结束时间不得超过当天后的 180 天。推送策略类型为循环(strategyType 值为 2)时,endTime 必填。

circleType

int

3

循环类型:

  • 1 - 每天

  • 2 - 每周

  • 3 - 每月

推送策略类型为循环(strategyType 值为 2)时,circleType 必填。

circleValue

int[]

[1,3]

循环值:

  • 若循环类型为每天:空

  • 若循环类型为每周:设置每周循环的时间,例如 [1,3] 表示每周 1 和周 3。

  • 若循环类型为每月:设置每月循环推送的时间,例如 [1,3] 表示每月 1 号和 3 号。

推送策略类型为循环(strategyType 值为 2)且循环类型(circleType)非每天时,circleValue 必填。

time

String

09:45:11

循环推送时间(时分秒,格式为 HH:mm:ss) 。推送策略类型为循环(strategyType 值为 2)时,time 必填。

说明
  • 未执行的定时或循环推送任务总数上限默认为 100 条。

  • 循环周期为开始时间的 0 点到结束时间的 24 点。

  • 循环开始时间和结束时间均不可早于当天 0 点,且结束时间不得早于开始时间。

返回参数

参数名称

类型

示例

描述

RequestId

String

B589F4F4-CD68-3CE5-BDA0-6597F33E23916512

请求 ID

ResultCode

String

OK

请求结果码

ResultMessage

String

param is invalid

请求错误描述

PushResult

JSON

请求结果

Success

boolean

true

请求状态。Success 参数值包含在返回的 PushRresult JSON 字符串中。

ResultMsg

String

param is invalid

请求错误内容。ResultMsg 参数值包含在返回的 PushRresult JSON 字符串中。

Data

String

903bf653c1b5442b9ba07684767bf9c2

定时推送任务 ID。strategyType 不等于 0 时,该字段不为空。

代码示例

请确保您的 AccessKey 拥有 AliyunMPAASFullAccess 权限,详情请参考 对 RAM 账号进行应用级别的访问控制

Java 代码示例

单击此处 查看下方代码示例中 AccessKeyId 与 AccessKeySecret 的获取方式。

 DefaultProfile.addEndpoint("cn-hangzhou", "mpaas", "mpaas.cn-hangzhou.aliyuncs.com");
        // 创建 DefaultAcsClient 实例并初始化
        // 阿里云账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 用户进行 API 访问或日常运维,请登录 RAM 控制台创建 RAM 用户
        // 此处以把 AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
        // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险
        // 建议先完成环境变量配置。
        String accessKeyId = System.getenv("MPAAS_AK_ENV");
        String accessKeySecret = System.getenv("MPAAS_SK_ENV");
        DefaultProfile profile = DefaultProfile.getProfile(
            "cn-hangzhou",          // 地域 ID
            accessKeyId,      
            accessKeySecret); 

        IAcsClient client = new DefaultAcsClient(profile);
        // Create an API request and set parameters
        PushMultipleRequest request = new PushMultipleRequest();
        request.setAppId("ONEX570DA89211721");
        request.setWorkspaceId("test");
        request.setDeliveryType(3L);
        request.setTaskName("批量测试");
        request.setTemplateName("测试模板");
        //你好#name#,恭喜中奖#money#元
        List<PushMultipleRequest.TargetMsg> targetMsgs = new ArrayList<PushMultipleRequest.TargetMsg>();
        PushMultipleRequest.TargetMsg targetMsg = new PushMultipleRequest.TargetMsg();
        targetMsg.setTarget("userid1024");
        targetMsg.setMsgKey(String.valueOf(System.currentTimeMillis()));
        Map<String, String> templatekv = new HashMap<String, String>();
        templatekv.put("name", "张三");
        templatekv.put("money", "200");
        targetMsg.setTemplateKeyValue(JSON.toJSONString(templatekv));
        //目标数量不要超过 100 个
        targetMsgs.add(targetMsg);
        request.setTargetMsgs(targetMsgs);
        request.setExpiredSeconds(600L);

        request.setStrategyType(2);
        request.setStrategyContent("{\"fixedTime\":1630303126000,\"startTime\":1625673600000,\"endTime\":1630303126000,\"circleType\":1,\"circleValue\":[1, 7],\"time\":\"13:45:11\"}");

        PushMultipleResponse response;
        try {
            response = client.getAcsResponse(request);
            System.out.println(response.getResultCode());
            System.out.println(response.getResultMessage());
            System.out.println(response.getPushResult().getData());  // 推送任务 ID 或定时推送任务 ID
        } catch (ClientException e) {
            e.printStackTrace();
        }

Python 代码示例

# -*- coding: utf8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkmpaas.request.v20190821 import PushMultipleRequest
import json
import time

// 阿里云账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 用户进行 API 访问或日常运维,请登录 RAM 控制台创建 RAM 用户
// 此处以把 AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
// 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险
// 建议先完成环境变量配置
# Initialize AcsClient instance
String accessKeyId = System.getenv("MPAAS_AK_ENV");
String accessKeySecret = System.getenv("MPAAS_SK_ENV");
client = AcsClient(
accessKeyId,      
accessKeySecret,  
"cn-hangzhou"
);

# Initialize a request and set parameters
request = PushMultipleRequest.PushMultipleRequest()
request.set_endpoint("mpaas.cn-hangzhou.aliyuncs.com")
request.set_AppId("ONEX570DA89211721")
request.set_WorkspaceId("test")
request.set_TemplateName("template1024")
request.set_DeliveryType(3)
request.set_TaskName("python测试任务")
request.set_ExpiredSeconds(600)
msgkey = str(time.time())
targets = [
  {
    "Target": "user1024",
    "MsgKey": msgkey,
    "TemplateKeyValue": {
      "name": "张三",
      "money": "200"
    }
  }
]
request.set_TargetMsgs(targets)
# Print response
response = client.do_action_with_exception(request)
print response

Node.js 代码示例

const sdk = require('@alicloud/mpaas20190821');

const { default: Client, PushMultipleRequest,PushMultipleRequestTargetMsg } = sdk;
// 创建客户端
// 阿里云账号 AccessKey 拥有所有 API 的访问权限,风险很高。强烈建议您创建并使用 RAM 用户进行 API 访问或日常运维,请登录 RAM 控制台创建 RAM 用户
// 此处以把 AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
// 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险
// 建议先完成环境变量配置
String accessKeyId = System.getenv("MPAAS_AK_ENV");
String accessKeySecret = System.getenv("MPAAS_SK_ENV");
const client = new Client({
  accessKeyId,      
  accessKeySecret, 
  endpoint: 'mpaas.cn-hangzhou.aliyuncs.com',
  apiVersion: '2019-08-21'
});
// 初始化 request
  const request = new PushMultipleRequest();
  request.appId = "ONEX570DA89211721";
  request.workspaceId = "test";
  request.templateName= "template1024";
  const templatekv = {
    name: '张三',
    money:'300'
  };
  //request.templateKeyValue = JSON.stringify(templatekv);

  request.deliveryType = 3;
  request.taskName = "Node 测试任务";
  request.expiredSeconds=600;
  const extendedParam = {
    test: '自定义扩展参数'
  };
  request.extendedParams = JSON.stringify(extendedParam);

  const targetMsgkey = new PushMultipleRequestTargetMsg();
  targetMsgkey.target = "userid1024";
  targetMsgkey.msgKey = String(new Date().valueOf());
  targetMsgkey.templateKeyValue = JSON.stringify(templatekv);;
  request.targetMsg = [targetMsgkey];

// 调用 API
try {
  client.pushMultiple(request).then(res => {
    console.log('SUCCESS', res);
  }).catch(e => {
    console.log('FAIL', e);
  });
} catch(e) {
  console.log('ERROR', e);
}

PHP 代码示例

<?php

use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\MPaaS\MPaaS;
AlibabaCloud::accessKeyClient('accessKeyId', 'accessKeySecret')
    ->regionId('cn-hangzhou')
    ->asDefaultClient();

class Demo {
    public function run() {
        try {
              $this->multiPush();
        } catch (\Exception $e) {
        }
    }


   public function multiPush() {
        $request = MPaaS::v20190821()->pushMultiple();
        $result = $request->host("mpaas.cn-hangzhou.aliyuncs.com")
            // 是否开启 debug 模式
            ->debug(true)
            ->withAppId("ONEX570DA89211721")
            ->withWorkspaceId("test")
            ->withTemplateName("template1024")
            ->withDeliveryType(3)
            ->withTaskName("PHP测试批量任务")
            ->withExpiredSeconds(600)
            ->withTargetMsg(
                [
                    [
                        "Target" => "userid1024",
                        "MsgKey" => "" . time(),
                        "TemplateKeyValue" => json_encode([
                            "name" => "张三",
                            "money" => "200",
                        ])
                    ]
                ]
            )
            ->request();
    }
}