消息推送

可以通过该流程向用户进行消息推送

简要流程

开发者主要操作步骤:

  1. 开发者小程序通过 authorize 申请用户的授权
  2. 开发者通过后台效用小程序开放平台接口/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&param=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」 接口的代码示例

小程序团队 © 2020-2021 all right reserved,powered by Gitbook文件修订时间: 2026-01-05 11:12:01

results matching ""

    No results matching ""