小程序推送功能实现,含小程序和后台代码

简介: 小程序推送功能实现,含小程序和后台代码

实现思路


1 小程序获取用户openid,收集formid传给java后台

2 java推送消息给指定小程序用户


老规矩,还是先看效果图



我的这个是跑腿抢单推送,当用户新下单时,会给跑腿员推送消息。

下面开始讲解实现步骤


一,微信小程序管理后台开通模版推送


--模版消息.png--


这里的模版id很重要,接下来我们推送的都是这个模版。


二,java后台实现推送所需字段


1 看微信官方推送消息所需要的字段


--实现推送所需要的字段--

--官方示例--

2 ,有了官方说明,我门接下来就去拿到官方所需要的这些字段,来组装请求数据就可以了。


三,下面讲解实现步骤


我的java后台是基于springboot开发的,如果你不了解spring boot,建议你先去了解下springboot再回来接着学习。

还有RestTemplate是我们java后台做get和post请求必须的,我们和微信服务器交互就用的RestTemplate

1 ,首先根据官方推送所需字段组装java-bean

这里用到两个javabean

/*
* 小程序推送所需数据
* qcl 微信:2501902696
* */@Datapublic class WxMssVo {    private String touser;//用户openid
    private String template_id;//模版id
    private String page = "index";//默认跳到小程序首页
    private String form_id;//收集到的用户formid
    private String emphasis_keyword = "keyword1.DATA";//放大那个推送字段
    private Map<String, TemplateData> data;//推送文字}
/*
* 设置推送的文字和颜色
* qcl 微信:2501902696
* */@Datapublic class TemplateData {    //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
    private String value;//,,依次排下去//    private String color;//字段颜色(微信官方已废弃,设置没有效果)}

到这里请求推送的数据就组装好了,解下来我们去实现推送功能。

奥不对,还有一个重要的字段需要获取到:access_token

access_token的获取

/*
    * 获取access_token
    * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
    * */
    public String getAccess_token(String appid, String appsecret) {        //获取access_token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +                "&appid=" + appid + "&secret=" + appsecret;        String json = restTemplate.getForObject(url, String.class);
        AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);        return accessToken.getAccess_token();
    }

这次是真正的可以来请求微信服务器来实现消息推送了

/*
    * 微信小程序推送单个用户
    * */
    public String pushOneUser(String openid, String formid) {        //获取access_token
        String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +                "?access_token=" + access_token;        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openid);//用户openid
        wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
        wxMssVo.setForm_id(formid);//formid
        Map<String, TemplateData> m = new HashMap<>(5);        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        TemplateData keyword1 = new TemplateData();
        keyword1.setValue("新下单待抢单");
        m.put("keyword1", keyword1);
        TemplateData keyword2 = new TemplateData();
        keyword2.setValue("这里填下单金额的值");
        m.put("keyword2", keyword2);
        wxMssVo.setData(m);
        TemplateData keyword3 = new TemplateData();
        keyword3.setValue("这里填配送地址");
        m.put("keyword3", keyword3);
        wxMssVo.setData(m);
        TemplateData keyword4 = new TemplateData();
        keyword4.setValue("这里填取件地址");
        m.put("keyword4", keyword4);
        wxMssVo.setData(m);
        TemplateData keyword5 = new TemplateData();
        keyword5.setValue("这里填备注");
        m.put("keyword5", keyword5);
        wxMssVo.setData(m);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        log.error("小程序推送结果={}", responseEntity.getBody());        return responseEntity.getBody();
    }

openid可以让小程序开发人员给你传过来,也可以自己获取。

formid需要小程序开发给你传过来,你也可以把formid存到数据库里,什么时候需要直接拿出来用就可以了。

注意:formid必须和用户openid对应。

下面贴出来完整代码

package com.qcl.paotuischool.wechat;import com.google.gson.Gson;import com.qcl.userwechat.bean.AccessToken;import com.qcl.utils.ConstantUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Service;import org.springframework.web.client.RestTemplate;import java.util.HashMap;import java.util.Map;import lombok.extern.slf4j.Slf4j;/**
 * Created by qcl on 2018/9/11.
 * 微信小程序推送服务,
 * 包含获取access_token的服务
 */@Service
@Slf4j
public class WxPushServiceQcl {    //用来请求微信的get和post
    @Autowired
    private RestTemplate restTemplate;    /*
    * 微信小程序推送单个用户
    * */
    public String pushOneUser(String openid, String formid) {        //获取access_token
        String access_token = getAccess_token(ConstantUtils.SCHOOL_APPID, ConstantUtils.SCHOOL_APPSECRET);        String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send" +                "?access_token=" + access_token;        //拼接推送的模版
        WxMssVo wxMssVo = new WxMssVo();
        wxMssVo.setTouser(openid);//用户openid
        wxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版id
        wxMssVo.setForm_id(formid);//formid
        Map<String, TemplateData> m = new HashMap<>(5);        //keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注
        TemplateData keyword1 = new TemplateData();
        keyword1.setValue("新下单待抢单");
        m.put("keyword1", keyword1);
        TemplateData keyword2 = new TemplateData();
        keyword2.setValue("这里填下单金额的值");
        m.put("keyword2", keyword2);
        wxMssVo.setData(m);
        TemplateData keyword3 = new TemplateData();
        keyword3.setValue("这里填配送地址");
        m.put("keyword3", keyword3);
        wxMssVo.setData(m);
        TemplateData keyword4 = new TemplateData();
        keyword4.setValue("这里填取件地址");
        m.put("keyword4", keyword4);
        wxMssVo.setData(m);
        TemplateData keyword5 = new TemplateData();
        keyword5.setValue("这里填备注");
        m.put("keyword5", keyword5);
        wxMssVo.setData(m);
        ResponseEntity<String> responseEntity =
                restTemplate.postForEntity(url, wxMssVo, String.class);
        log.error("小程序推送结果={}", responseEntity.getBody());        return responseEntity.getBody();
    }    /*
    * 获取access_token
    * appid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来
    * */
    public String getAccess_token(String appid, String appsecret) {        //获取access_token
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +                "&appid=" + appid + "&secret=" + appsecret;        String json = restTemplate.getForObject(url, String.class);
        AccessToken accessToken = new Gson().fromJson(json, AccessToken.class);        return accessToken.getAccess_token();
    }
}

在需要做推送的地方调用WxPushServiceQcl类中的pushOneUser方法,并传入openid, formid参数即可。


--java控制台打印.png--


这是我推送成功后打印的log

下面来讲小程序端开发需要做些什么

可以看出,我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。

--官方下发条件--


所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了。

看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样

<form report-submit='true' >
   <button  form-type='submit'>获取formid</button>
  </form>

所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。


红框里是用户常点的


我的小程序是跑腿小程序,消息也主要推送给跑腿员的,而跑腿员点击最多的也就是这两个条目,所以我们就用from组件来伪装这两个条目,让用户在点击的同时就可以收集到用的formid。

<view class='button_item'>  <form class="form_item" bindsubmit='gorRunnerLobby' report-submit='true' data-type="1">
   <button class="button" form-type='submit'>
    <text>抢单大厅</text>
    <text class='runner_desc'>(兼职也可月入万元)</text>
   </button>
  </form>
  <view class='right_arrow' /> </view>

这样就可以在用户点击条目时,收集到用户formid了



由于上面的botton有默认样式,所以我们就通过修改css来去除botton默认样式。

.button_item { width: 100%; display: flex; flex-direction: row; align-items: center; padding: 2px 20px; background: white; border-bottom: 1px solid gainsboro;
}/* 主要通过这里去除botton默认样式 */.button { width: 100%; background: white; border: none; text-align: left; padding: 6px 0px; margin: 0px; line-height: 1.5;
}/* 主要通过这里去除botton边框 */.button::after { border: none;
}/* 用button伪装获取formid */.form_item { width: 100%;
}

到这里我们小程序端也圆满完成自己的任务了。

这样我们java后台和小程序开发就可以开开心心的完成微信小程序的消息推送功能了。

相关文章
|
1月前
|
小程序
小程序提交数据到后台做加法运算
小程序提交数据到后台做加法运算
24 0
|
20天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
1月前
|
存储 自然语言处理 小程序
微信小程序多语言切换神器:简繁体切换功能完全指南
随着全球化的发展,支持多种语言的应用程序愈发重要。本文介绍了如何在微信小程序中实现简体与繁体字体之间的切换功能,以满足不同地区用户的需求。通过创建utils文件夹并编写相应的转换函数,开发者可以方便地实现语言切换,从而提升用户体验。文章中还附带了示例代码和效果图,帮助读者更好地理解和应用这一功能。
87 0
微信小程序多语言切换神器:简繁体切换功能完全指南
|
1月前
|
开发框架 小程序 JavaScript
小程序代码丢失!反编译找回
小程序源代码的容易获取问题确实存在一些潜在的安全隐患。然而,现在的小程序开发框架采用像 Babel 这样的打包工具,将 JavaScript 逻辑代码混合在一个文件中并进行转编译,使其变得难以理解。
38 0
小程序代码丢失!反编译找回
|
1月前
|
小程序 Java
小程序访问java后台失败解决方案
小程序访问java后台失败解决方案
44 2
|
1月前
|
小程序 JavaScript Java
小程序访问java后台
小程序访问java后台
27 1
|
1月前
|
小程序 Linux Python
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
查找首字母与Python相关的的英文词汇小程序的续篇---进一步功能完善
|
29天前
|
小程序 安全 数据库连接
为什么已经提交的小程序无法连接后台服务?
【10月更文挑战第17天】为什么已经提交的小程序无法连接后台服务?
47 0
|
1月前
|
小程序 Java
小程序通过get请求提交数据到java后台
小程序通过get请求提交数据到java后台
30 0
|
2月前
|
小程序 JavaScript Go
代码总有一个是你想要的分享63个微信小程序源
分享63个微信小程序源代码,包括电商系统、同城拼车、博客等多种应用,涵盖C#、Node.js、Golang等技术栈。每个项目附带源码和示例,适合初学者和开发者参考学习。提取码:8888,代码效果参考:http://www.603393.com/sitemap.xml。
64 2

热门文章

最新文章

下一篇
无影云桌面