为了提高 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 控制台,选择 App,通过以下步骤,配置推送接口:
- 在左侧导航栏中,选择 后台服务管理 > 消息推送,进入 消息推送 页面。
- 在右侧页面上,点击 密钥管理 标签,进入密钥管理页面。
-
点击 推送 API 接口配置 区域右上角的 配置,页面上展示配置入口,如下图所示。
字段 是否必填 说明 状态 是 推送接口的可调用状态。打开开关,即可调用 MPS 提供的接口;关闭开关,则不能调用 MPS 提供的接口。 调用接口加密方式 否 仅可选 RSA 算法。 RSA 算法公钥 否 填写 2048 位公钥。
使用私钥对请求参数进行签名后,MPS 使用公钥对签名后的请求参数进行解密,验证调用者身份。重要:确保公钥填写正确无空格,否则将导致调用接口失败,调用接口说明参见
API 参考。 - 点击 确定 按钮,保存配置。
配置推送回调接口
登录 mPaaS 控制台,选择 App,通过以下步骤,配置推送回调接口:
- 在左侧导航栏中,选择 后台服务管理 > 消息推送,进入 消息推送 页面。
- 在右侧页面上,点击 密钥管理 标签,进入密钥管理页面。
-
点击 推送回调接口配置 区域右上角的 配置,页面上展示配置入口,如下图所示。
字段 是否必填 说明 状态 是 回调状态。打开开关,移动推送核心将根据配置,给用户服务端回执;关闭开关,移动推送核心将不给用户服务端回执。 回调接口 URL 地址 是 填写回调接口地址,应为公网可访问的 HTTP 请求地址。MPS 对 POST 请求体以私钥进行签名,将签名后的内容作为 sign
参数进行回调。回调接口加密方式 否 MPS 使用 RSA 算法对 POST 请求体进行签名。 RSA 算法公钥 否 系统自动填写,您无法修改。用户服务端获取 POST 请求体和 sign
参数后,使用公钥验证是否为 MPS 请求,确保数据传输过程中未被篡改,关于回调验签的说明,参见 API 参考 > HTTP 调用。 - 点击 确定 按钮,保存配置。
说明:使用不同渠道推送消息时,移动推送核心回调时机不同,具体如下所示。
- 三方渠道(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
为消息请求体,为 JASON 格式,参考如下:
{
"extInfo":{
"adToken":"da64bc9d7d448684ebaeecfec473f612c57579008343a88d4dbdd145dad20e84",
"osType":"ios"
},
"msgId":"console_1584853300103",
"pushSuccess":true,
"statusCode":"2",
"statusDesc":"Acked",
"targetId":"da64bc9d7d448684ebaeecfec473f612c57579008343a88d4dbdd145dad20e84"
}
下表为 callbackJson
中各字段的说明。您可以通过此链接获取回调的 回调示例代码。
字段 | 说明 |
---|---|
msgId | 请求的业务消息 ID |
pushSuccess | 推送是否成功 |
statusCode | 消息状态码 |
statusDesc | 消息状态码对应的描述 |
targetId | 目标 ID |