消息推送
可以通过该流程向用户进行消息推送
简要流程
开发者主要操作步骤:
- 开发者小程序通过
authorize申请用户的授权 - 开发者通过后台效用小程序开放平台接口
/api/developer/msg/send推送消息给用户
流程图如下所示:

详细步骤
1. 开发者小程序通过 authorize 申请用户的授权
相关接口如下:
authorize(OBJECT)
OBJECT参数说明:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| scope | String | 是 | 授权范围, 消息授权固定为: scope.notification |
| ruleIds | String | 是 | 申请授权的消息规则清单,多个规则ID使用英文逗号隔开。因开放平台消息模板功能还未完全对接,需联系平安产险消息管理团队线下申请生成规则ID。 |
| success | Function | 是 | 成功处理时的回调函数 |
| fail | Function | 是 | 处理失败时的回调函数 |
调用示例
const _data = {
scope: 'scope.notification',
ruleIds: '444287'
}
PAMINA.call('authorize', _data, (res) => {
console.log(res)
}, (e) => {
console.log(e)
})
2. 开发者通过后台效用小程序开放平台接口/api/developer/msg/send推送消息给用户
这是一个 HTTPS 接口,开发者通过后台服务器调用小程序开放平台的开放接口推送消息给指定用户。
为了保证数据安全,开发者需要使用 RSA 密钥进行身份认证,RSA 密钥可以从小程序开放平台如下入口获取: 开发中心 -> 你的小程序 -> 基础信息 -> 小程序密钥
在完成上线全部流程前只能通过测试环境接口方式联调,完成上线流程后需再切换为生产环境接口地址。其中调用测试接口联调时需要提供手机号和设备号给产险开发添加测试数据
令牌接口地址
在完成业务接口调用前需要调用访问令牌接口获取access_token,获取到的acess_token在调用业务接口是放到url后面。
测试地址
POST https://test-api.pingan.com.cn:20443/oauth/oauth2/access_token
生产地址
POST https://api.pingan.com.cn/oauth/oauth2/access_token
请求参数
具体入参值可找产险开发老师获取。
| 传值方式 | 参数值 | |
|---|---|---|
| client_id | POST 请求 | 应用ID 例如:P_PA002_ELIS_UWS(在“我的应用”列表中) |
| grant_type | POST 请求 | 授权类型 固定值:client_credentials |
| client_secret | POST 请求 | 应用密钥 例如:znD5x4d1(创建应用时返回的应用密码) |
响应参数
| access_token | oauth系统对获取access_token有调用限制,请将获取的token值放到本地缓存;注意token是有有效期的,当token失效时需要做相应处理。 |
|---|---|
| expires_in | 有效期 例如 :60 (单位:分钟);0表示永久有效;expires_in只是有效期参考,不以这个为唯一更新token的标准。注意调用接口返回13002和13012的错误码必须处理。 |
| openid | openid |
具体指引链接:https://api.pingan.com.cn/dev/index.do?bAPhdWDKZYpPM00
业务接口地址
request_id只要每个请求传的值不一样就可以,建议传时间戳毫秒数。
测试地址
POST https://test-api.pingan.com.cn:20443/open/mina-store-msg/api/developer/msg/send?access_token=C89B2C0D6A4D4262B17CD7DC1EC05E11&request_id=123451
生产地址
POST https://api.pingan.com.cn/open/mina-store-msg/api/developer/msg/send?access_token=C89B2C0D6A4D4262B17CD7DC1EC05E11&request_id=123451
Headers
| 参数名称 | 参数值 | 是否必须 | 备注 |
|---|---|---|---|
| Content-Type | application/json | 是 | |
| X-MINA-MINI-APP-ID | 是 | 小程序ID | |
| X-MINA-TIMESTAMP | 是 | 请求时间(毫秒级) | |
| X-MINA-SIGN | 是 | 请求签名, 签名有效时间 60 秒, 采用 RSA 算法, 签名结果使用 Base64 进行编码;签名格式: RSA(requestBodyString + X-MINA-MINI-APP-ID + X-MINA-TIMESTAMP) |
请求参数
| 名称 | 类型 | 是否必须 | 默认值 | 备注 |
|---|---|---|---|---|
| openId | string | 是 | 用户,可从端能力getUserId获取 | |
| ruleId | string | 是 | 消息规则ID,模板消息推送的业务规则,因开放平台消息模板功能还未完全对接,需联系平安产险消息管理团队线下申请生成规则ID。 | |
| titleParam | object | 否 | 消息标题变量,具体变量名(json的key)根据不同的消息模板而定 | |
| contentParam | object | 否 | 消息内容变量,具体变量名(json的key)根据不同的消息模板而定 | |
| msgUrlParam | object | 否 | 消息URL变量,具体变量名(json的key)根据不同的消息模板而定 | |
| └─ minadata | object | 否 | 打开小程序的相关参数, 总长度不能超过 1000 个字符 | |
| ├─ pagePath | string | 否 | 进入小程序后的页面地址,如 /index?param=1¶m=abc | |
| └─ extraData | string | 否 | 预留,扩展参数 | |
| messageDeadline | number | 否 | 10位消息过期时间戳,运营消息此字段无效。 |
响应参数
| 名称 | 类型 | 是否必须 | 默认值 | 备注 |
|---|---|---|---|---|
| responseCode | string | 是 | 默认0为成功 1097604001=用户小程序消息开关未打开 1097604002=用户消息规则未授权 |
|
| responseMsg | string | 是 | 提示信息 | |
| data | object | 是 | 业务数据 | |
| └─ messageId | string | 是 | 消息ID,用于排查问题 |
调用示例
axios(
{
method: "post",
url: `https://api.pingan.com.cn/open/mina-store-msg/api/developer/msg/send`,
data: '', // 入参
headers: {} // 请求头
}
).then((res) => {
console.log("msgSend---sucess", res);
this.msgSendResult = JSON.stringify(res);
})
完整代码示例
示例代码(前端 vue):
export default {
name: "login",
data() {
return {
key: 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSj....', // 秘钥
}
},
methods: {
// 开发者向用户发送消息
msgSend() {
const reqBody = JSON.stringify({
"miniAppId":"cxec128d79635042d7",
"openId": 'dl9pwx5qisqo68a',
"ruleId":'444287',
"titleParam":{},
"contentParam":{"key1":"42d7小程序用户"},
"msgUrlParam":{"minadata":{"pagePath":"https://×××.com/"}};
});
console.log('msgSend---reqBody:', reqBody);
const bodyJson = JSON.parse(reqBody);
const appId = bodyJson.miniAppId;
const now_timestamp = new Date().getTime();
const signstr = reqBody + appId + now_timestamp;
console.log("signString : " + signstr);
console.log("msgSend---privateKey : " + this.key)
const sign = this.signRsa(this.key,signstr);
const header = {
"Content-Type": 'application/json',
"X-MINA-TIMESTAMP": now_timestamp,
"X-MINA-SIGN": sign,
"X-MINA-MINI-APP-ID": appId
};
console.log('msgSend---header:', header);
axios(
{
method: "post",
url: `https://api.pingan.com.cn/open/mina-store-msg/api/developer/msg/send`,
data: bodyJson,
headers: header
}
).then((res) => {
console.log("msgSend---sucess", res);
this.msgSendResult = JSON.stringify(res);
if (res.responseMsg && res.responseMsg.includes('用户小程序消息开关未打开')) {
this.$toast('请先到小程序设置中打开总开关,再打开消息授权');
}
})
.catch((e) => {
console.log("msgSend---fail", e);
this.msgSendResult = JSON.stringify(e);
});
},
signRsa(encrypt_key, clearText){
console.info('cleartext: ' + clearText);
//注意此处上下的BEGIN PRIVATE KEY不要删除,框架自带的
const private_key = '-----BEGIN PRIVATE KEY-----\n'
+ encrypt_key
+ '\n-----END PRIVATE KEY-----'
// !!!请自行下载Forge加密js包引入
var privateKey = forge.pki.privateKeyFromPem(private_key);
// const md = forge.md.sha1.create();//这里的sha1对应的java的SHA1WithRSA
const md = forge.md.sha256.create();
md.update(clearText,"utf8");
let sig = privateKey.sign(md);
let erg = forge.util.encode64(sig);
console.log("Signature is: "+erg);
return erg;
},
// 获取消息授权
authorize() {
const _data = {
scope: 'scope.notification',
ruleIds: this.ruleIds,
};
console.log('authorize--- _data:', _data);
PAMINA.call('authorize', _data, (res) => {
console.log(res)
this.authorizeResult = res
}, (e) => {
console.log(e)
this.authorizeResult = e
this.$toast(e.msg)
})
},
}
}
示例代码(后端 java):生成签名
请参考 「
获取用户openId / 小程序登录: getUserId」 接口的代码示例