uniapp-消息推送

在小程序公众平台选择消息模板

在这里插入图片描述

uni-app前端调用代码

//小程序登录代码
loginUser() {
				var me = this;

				if (!me.name) {
					uni.showToast({
						title: '用户名不能为空!'
					});
					return;
				}
				if (!me.password) {
					uni.showToast({
						title: '密码不能为空!'
					});
					return;
				}

				uni.showLoading({
					title: '加载中'
				});
				uni.request({
					url: config.api.login,
					method: 'POST',
					header: {
						'content-type': 'application/json'
					},
					data: {
						name: me.name,
						password: me.password
					},
					success: res => {
						console.log(res.data);
						if (res.data.code == 0) {

							var id = res.data.data.id;
							var name = res.data.data.name;
							var nickName = res.data.data.nickName;
							var token = res.data.data.token;
							var headImage = res.data.data.headImage;
							var userEmail = res.data.data.userEmail;

							//本地存储用户信息
							uni.setStorage({
								key: 'userId',
								data: {
									id: id,
									token: token
								},
								success: function() {
									console.log('success');
								}
							});
							//-----
							let user = res.data.data;
							if (user == undefined || user.uid <= 0 || user.token == '') {
								util.toastError('登录失败:未知错误')
								return
							}
							util.setUser(user);
							//-----
							uni.showToast({
								title: '登录成功'
							});
							uni.navigateBack();
						} else if (res.data.code == -1) {
							uni.showToast({
								title: res.data.msg
							});
						}
					},

					complete() {
						uni.hideLoading();
					}
				});
			},
//获取用户信息
getUserProfile() {

				uni.getUserProfile({
					desc: "获取你的昵称、头像、地区及性别",
					success: res => {
						var rawData = res.rawData; //用户非敏感信息
						const signature = res.signature; //签名
						var encrypteData = res.encryptedData; //用户敏感信息
						var iv = res.iv; //解密算法的向量

						console.log("用户数据==>" + rawData)
						console.log("临时登录凭证==signature>" + signature)


						uni.request({
							url: config.api.wxLogin,
							method: 'POST',
							header: {
								'content-type': 'application/x-www-form-urlencoded'
							},
							data: {
								code: this.code, //临时登录凭证
								rawData: rawData, //用户非敏感信息
								signature: signature, //签名
								encrypteData: encrypteData, //用户敏感信息
								iv: iv //解密算法的向量 
							},
							success: function(res) {

							},
							fail: res => {
								console.log("微信授权登录失败数据==>" + res)
							}
						})
					}
				})
			}
//微信登录
wxLogin(e) {



			var me = this;
			var userInfo = e.detail.userInfo;
			var rawData = e.detail.rawData; //用户非敏感信息
			var signature = e.detail.signature; //签名
			var encrypteData = e.detail.encryptedData; //用户敏感信息
			var iv = e.detail.iv; //解密算法的向量
			console.log(e);
			uni.login({
				provider: 'weixin',
				success(loginResult) {
					console.log(loginResult);
					var code = loginResult.code; //临时登录凭证

					uni.request({
						url: config.api.wxLogin,
						method: 'POST',
						header: {
							'content-type': 'application/x-www-form-urlencoded'
						},
						data: {
							code: code, //临时登录凭证
							rawData: rawData, //用户非敏感信息
							signature: signature, //签名
							encrypteData: encrypteData, //用户敏感信息
							iv: iv //解密算法的向量 
						},
						success: function(res) {

							if (res.data.code == 0) {

								console.log(res);
								console.log('userInfo=====>' + userInfo);
								console.log('skey=========>' + res.data.data);

								var id = res.data.data.id;
								var name = res.data.data.name;
								var nickName = res.data.data.nickName;
								var token = res.data.data.token;
								var headImage = res.data.data.headImage;
								var userEmail = res.data.data.userEmail;


								//本地存储用户信息
								uni.setStorage({
									key: 'userId',
									data: {
										id: id,
										token: token
									},
									success: function() {
										console.log('success');
									}
								});
								//-----
								let user = res.data.data;
								if (user == undefined || user.uid <= 0 || user.token == '') {
									util.toastError('登录失败:未知错误')
									return
								}
								util.setUser(user);
								//-----
								uni.showToast({
									title: '登录成功'
								});
								uni.navigateBack();
							} else if (res.data.code == -1) {
								uni.showToast({
									title: res.data.msg
								});
							}





						}
					});
				}
			});
		}
//调用订阅消息的前端代码
getMsg() {
				uni.requestSubscribeMessage({
					tmplIds: ['模板ID'],
					complete:(res)=>{
						console.log(res)
					}
				});
			},

java 后台代码

//登录代码
@Log(title = "微信登录", businessType = BusinessType.OTHER)
    @PostMapping("wx/login")
    @ResponseBody
    public BaseResult wxLogin(@RequestParam(value = "code", required = false) String code,
                              @RequestParam(value = "rawData", required = false) String rawData,
                              @RequestParam(value = "signature", required = false) String signature,
                              @RequestParam(value = "encrypteData", required = false) String encrypteData,
                              @RequestParam(value = "iv", required = false) String iv) {


        // 用户非敏感信息:rawData
        // 签名:signature
        JSONObject rawDataJson = JSON.parseObject(rawData);
        // 1.接收小程序发送的code
        // 2.开发者服务器 登录凭证校验接口 appi + appsecret + code
        JSONObject SessionKeyOpenId = WechatUtil.getSessionKeyOrOpenId(code);

        // 3.接收微信接口服务 获取返回的参数
        String openid = SessionKeyOpenId.getString("openid");
        String sessionKey = SessionKeyOpenId.getString("session_key");

        // 4.校验签名 小程序发送的签名signature与服务器端生成的签名signature2 = sha1(rawData + sessionKey)
        String signature2 = DigestUtils.sha1Hex(rawData + sessionKey);


//        log.info("小程序传来的rawData: {}", rawData);
//        log.info("小程序传来的code: {}", code);
//        log.info("服务器生产的sessionKey: {}", sessionKey);
//        log.info("小程序传来的signature: {}", signature);
//        log.info("服务器生产的signature: {}", signature2);
//        log.info("服务器生产的openid: {}", openid);

        if (!signature.equals(signature2)) {
            return BaseResult.error("登陆失败,签名校验失败!");
        }

        // 5.根据返回的User实体类,判断用户是否是新用户,是的话,将用户信息存到数据库;不是的话,更新最新登录时间
        SysUser sysUser = userService.selectUserByOpenId(openid);

        if (sysUser == null) {
            log.info("用户信息入库");
            // 用户信息入库
            String nickName = rawDataJson.getString("nickName");
            String avatarUrl = rawDataJson.getString("avatarUrl");
            String gender = rawDataJson.getString("gender");//0.未知 1.男 2.女

            sysUser = new SysUser();
            sysUser.setUserName(nickName);
            sysUser.setNickName(nickName);
            sysUser.setAvatar(avatarUrl);

            //保持与数据库设计一致
            if (null != gender) {
                switch (gender) {
                    case "0":
                        sysUser.setSex("2");//用户性别(0男 1女 2未知)

                        break;
                    case "1":
                        sysUser.setSex("0");//用户性别(0男 1女 2未知)

                        break;
                    case "2":
                        sysUser.setSex("1");//用户性别(0男 1女 2未知)

                        break;
                }
            }

            sysUser.setOpenId(openid);
            sysUser.setCreateBy(nickName);
            sysUser.setPassword(SecurityUtils.encryptPassword(openid));//小程序默认密码为 openid

            userService.insertUser(sysUser);
        } else {
            sysUser.setUpdateBy(sysUser.getNickName());

            // 已存在,更新用户登录时间
            userService.updateUserProfile(sysUser);
        }

        BaseResult ajax = BaseResult.success("登录成功");
        // 生成令牌
        String token = loginService.login(rawDataJson.getString("nickName"), openid, "",
                "");
        ajax.put(Constants.TOKEN, token);
        return ajax;


    }

 paras.add(new TemplateParam(“time2”,“2015年01月05日”));中的"time2","thing3"对应模板中的字段名称

//发送订阅消息的java代码
 @Log(title = "微信消息", businessType = BusinessType.OTHER)
    @GetMapping("wx/msg")
    @ResponseBody
    public BaseResult user_login(){
        String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                + "小程序的appid"
                + "&secret="
                + "小程序的secret";
        String result = HttpClientUtil.doGet(url);
        JSONObject object=JSON.parseObject(result);
        String Access_Token = object.getString("access_token");


        Template template=new Template();
        template.setTemplate_id("模板id");
        template.setTouser("小程序用户登录的openid");//登录后返回取
        template.setPage("pages/index/index");
        List<TemplateParam> paras=new ArrayList<TemplateParam>();
//        paras.add(new TemplateParam("character_string2","000001"));
//        paras.add(new TemplateParam("amount1","888.88"));
        paras.add(new TemplateParam("time2","2015年01月05日"));
        paras.add(new TemplateParam("thing3","请进入小程序查1看"));
        template.setTemplateParamList(paras);
        String requestUrl="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
        requestUrl=requestUrl.replace("ACCESS_TOKEN", Access_Token);

        System.out.println(template.toJSON());
        String jsonResult=HttpClientUtil.doPostJson(requestUrl,  template.toJSON());
        if(jsonResult!=null){
            return BaseResult.success("订阅消息发送成功!");
        }else {
            return BaseResult.error("订阅消息发送失败!");
        }
    }

其他工具类:
HttpClientUtil.java

/**
 * 发起Http请求 【用于小程序登录】
 */
public class HttpClientUtil {

    public static String doGet(String url, Map<String, String> param) {

        // 创建Httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();

        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (param != null) {
                for (String key : param.keySet()) {
                    builder.addParameter(key, param.get(key));
                }
            }
            URI uri = builder.build();

            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);

            // 执行请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultString;
    }

    public static String doGet(String url) {
        return doGet(url, null);
    }

    public static String doPost(String url, Map<String, String> param) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建参数列表
            if (param != null) {
                List<NameValuePair> paramList = new ArrayList<>();
                for (String key : param.keySet()) {
                    paramList.add(new BasicNameValuePair(key, param.get(key)));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }

    public static String doPost(String url) {
        return doPost(url, null);
    }

    public static String doPostJson(String url, String json) {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建请求内容
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 执行http请求
            response = httpClient.execute(httpPost);
            resultString = EntityUtils.toString(response.getEntity(), "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return resultString;
    }

}

 TemplateParam.java

public class TemplateParam {
    private String key;
    private String value;

    public TemplateParam(String key,String value){
        this.key=key;
        this.value=value;
    }
    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

注意:maven 引入:

        <!-- http请求工具包依赖 [微信登录需要]-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.2</version>
        </dependency>

### UniApp 消息推送实现方式 UniApp 提供了多种消息推送的实现方式,其中最常见的是通过 uniPush 服务来完成。以下是基于官方文档和示例代码对 UniApp 消息推送功能的详细说明。 #### 1. 推送服务简介 uniPush 是 DCloud 提供的消息推送服务,支持跨平台(iOS 和 Android)的消息推送功能[^2]。它通过集成个推 SDK 实现设备注册,并将应用实例与唯一的 clientID 关联。开发者可以在后台管理系统中创建和管理推送任务,设置目标用户、推送时间及内容等。 #### 2. 配置流程 在使用 uniPush 之前,需要完成以下配置步骤: - **注册开发者账号**:前往 DCloud 官方网站注册开发者账号并创建应用。 - **获取 AppKey 和 MasterSecret**:在开发者后台获取用于身份验证的 AppKey 和 MasterSecret。 - **集成 uniPush SDK**:在项目中引入 uniPush SDK,确保其正确安装和初始化。 #### 3. 前端实现代码示例 ##### 3.1 监听推送消息 在 `App.vue` 文件中添加以下代码,用于监听推送消息的接收和点击事件: ```javascript // 监听通知栏消息的点击事件 uni.onPushMessage((res) => { if (res.type === 'click') { // 如果需要跳转到指定页面,则实现跳转逻辑 uni.navigateTo({ url: '/pages/pushinfo/pushinfo' // 替换为实际页面路径 }); } // 监听在线推送消息 if (res.type === 'receive') { console.log("接收到的消息内容", res.data); if (res.data.content) { // 处理透传消息或云函数返回的内容 uni.createPushMessage({ content: res.data.content }); } } }); // 获取 clientID uni.getPushClientId({ success(res) { console.log("获取到的 clientID:", res.clientId); }, fail(err) { console.error("获取 clientID 失败:", err); } }); ``` ##### 3.2 创建本地消息 如果需要在应用内生成本地消息,可以使用以下代码: ```javascript let data = { title: "消息标题", subtitle: "消息副标题", content: "这是一条测试消息", jsondata: JSON.stringify({ id: 0 }) }; plus.push.createMessage(data.content, data.jsondata, { cover: false, title: data.title, subtitle: data.subtitle }); ``` #### 4. 后端推送示例 后端可以通过 REST API 向指定设备发送推送消息。以下是一个基于极光推送的示例请求体: ```json { "platform": "all", "audience": { "registration_id": ["指定的 registration_id"] }, "notification": { "alert": "Hello, {{content}}!" }, "message": { "msg_content": "Hi,JPush", "content_type": "text", "title": "msg", "extras": { "key": "value" } } } ``` #### 5. 注意事项 - **clientID 的作用**:clientID 是每个设备实例的唯一标识符,用于区分不同的推送目标[^3]。 - **推送通道选择**:根据设备类型和系统版本,uniPush 会选择合适的推送通道(如系统通知栏、厂商通道或第三方通道)[^2]。 - **兼容性问题**:在开发过程中需注意不同平台的推送行为差异,尤其是 iOS 系统对推送权限的严格限制。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值