为了提高 MPS 与用户系统之间的交互的安全性,MPS 会对所有的服务端接口进行加签与验证,并且提供了密钥管理界面,供您进行密钥配置。
推送 API 接口配置
MPS 提供 REST 接口供您调用。为确保安全性,MPS 需要对调用者的身份进行验证。在调用 API 之前,您需要使用 RSA 算法,对请求进行签名,并在消息推送控制台的 密钥管理 页面上的 推送 API 接口配置 区域内,配置密钥,供 MPS 验证调用者身份所用。
推送回调接口配置
若您需要获取消息下发结果的回执,则需要在消息推送控制台的 密钥管理 页面上的 推送回调接口配置 区域中,配置 MPS 回调时用到的 REST 接口地址,并获取公钥。MPS 在回调用户接口时,会对请求参数进行签名。您需要使用获取的公钥,对请求进行验签,以验证是否为 MPS 回调。
配置推送 API 接口
前置条件
进行推送 API 接口配置时,您需要先使用 RSA 算法生成 2048 位公钥。
RSA 公钥生成方法如下:
通过 OpenSSL 官网 下载并安装 OpenSSL 工具(1.1.1 或以上版本)。
打开 OpenSSL 工具,使用以下命令行生成 2048 位的 RSA 私钥。
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
根据 RSA 私钥生成 RSA 公钥。
openssl rsa -pubout -in private_key.pem -out public_key.pem
算法签名规则如下:
使用 SHA 256 签名算法。
将签名结果转换成 base64 字符串。
将 base64 字符串中的
+
替换为-
,/
替换为-
,得到最终签名结果。
操作步骤
完成以下步骤,配置推送接口:
登录 mPaaS 控制台,选择目标应用后,从左侧导航栏进入 消息推送 > 设置 页面。
在右侧页面上,单击 密钥管理 标签,进入密钥管理页面。
点击 推送 API 接口配置 区域右上角的 配置,页面上展示配置入口。
字段
是否必填
说明
状态
是
推送接口的可调用状态。打开开关,即可调用 MPS 提供的接口;关闭开关,则不能调用 MPS 提供的接口。
调用接口加密方式
否
仅可选 RSA 算法。
RSA 算法公钥
否
填写 2048 位公钥。使用私钥对请求参数进行签名后,MPS 使用公钥对签名后的请求参数进行解密,验证调用者身份。
重要为确保公钥填写正确无空格,否则将导致调用接口失败,调用接口说明参见 API 说明。
点击 确定 按钮,保存配置。
配置推送回调接口
在密钥管理页面,点击 推送回调接口配置 区域右上角的 配置,页面上展示配置入口。
字段
是否必填
说明
状态
是
回调状态。打开开关,移动推送核心将根据配置,给用户服务端回执;关闭开关,移动推送核心将不给用户服务端回执。
回调接口 URL 地址
是
填写回调接口地址,应为公网可访问的 HTTP 请求地址。MPS 对 POST 请求体以私钥进行签名,将签名后的内容作为
sign
参数进行回调。回调接口加密方式
否
MPS 使用 RSA 算法对 POST 请求体进行签名。
RSA 算法公钥
否
系统自动填写,您无法修改。用户服务端获取 POST 请求体和
sign
参数后,使用公钥验证是否为 MPS 请求,确保数据传输过程中未被篡改,关于回调验签的说明,参见 服务端 API。点击 确定 按钮,保存配置。
使用不同通道推送消息时,移动推送核心回调时机不同,具体如下所示。
说明厂商通道(FCM/APNs/小米/华为/OPPO/vivo):调用第三方服务成功时,发起回调。
自建通道:推送消息成功时,发起回调。
代码示例
/**
* Alipay.com Inc. Copyright (c) 2004-2020 All Rights Reserved.
*/
package com.callback.demo.callbackdemo;
import com.callback.demo.callbackdemo.util.SignUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
/**
*
* @author yqj
* @version $Id: PushCallbackController.java, v 0.1 2020年03月22日 11:20 AM yqj Exp $
*/
@Controller
public class PushCallbackController {
/**
* 拷贝控制台中推送回调接口配置的RSA 算法公钥
*/
private static final String pubKey = "";
@RequestMapping(value = "/push/callback" ,method = RequestMethod.POST)
public void callback(@RequestBody String callbackJson, @RequestParam String sign) {
System.out.println(sign);
//验签
sign = sign.replace('-','+');
sign = sign.replace('_','/');
if(!SignUtil.check(callbackJson,sign,pubKey,"UTF-8")){
System.out.println("验签失败");
return;
}
System.out.println("验签成功");
//json 消息体
System.out.println(callbackJson);
}
}
callbackJson
为消息请求体,为 JSON 格式,参考如下:
{
"extInfo":{
"adToken":"da64bc9d7d448684ebaeecfec473f612c57579008343a88d4dbdd145dad20e84",
"osType":"ios"
},
"msgId":"console_1584853300103",
"pushSuccess":true,
"statusCode":"2",
"statusDesc":"Acked",
"targetId":"da64bc9d7d448684ebaeecfec473f612c57579008343a88d4dbdd145dad20e84"
}
下表为 callbackJson
中各字段的说明。
字段 | 说明 |
msgId | 请求的业务消息 ID |
pushSuccess | 推送是否成功 |
statusCode | 消息状态码 |
statusDesc | 消息状态码对应的描述 |
targetId | 目标 ID |