最近需要开发微信和小程序的推送功能,需要用java后台实现推送,自己本身java和小程序都做,所以就自己动手实现下小程序的模版推送功能推送。
实现思路1小程序获取用户openid,收集formid传给java后台2java推送消息给指定小程序用户老规矩,还是先看效果图
我的这个是跑腿抢单推送,当用户新下单时,会给跑腿员推送消息。下面开始讲解实现步骤
一,微信小程序管理后台开通模版推送
这里的模版id很重要,接下来我们推送的都是这个模版。二,java后台实现推送所需字段1看微信官方推送消息所需要的字段

2有了官方说明,我门接下来就去拿到官方所需要的这些字段,来组装请求数据就可以了。三,下面讲解实现步骤我的java后台是基于springboot开发的,如果你不了解springboot,建议你先去了解下springboot再回来接着学习。还有RestTemplate是我们java后台做get和post请求必须的,我们和微信服务器交互就用的RestTemplate1首先根据官方推送所需字段组装java-bean这里用到两个javabean/小程序推送所需数据qcl微信:2501902696/@DatapublicclassWxMssVo{privateStringtouser;//用户openidprivateStringtemplate_id;//模版idprivateStringpage="index";//默认跳到小程序首页privateStringform_id;//收集到的用户formidprivateStringemphasis_keyword="keyword1.DATA";//放大那个推送字段privateMapString,TemplateDatadata;//推送文字}/设置推送的文字和颜色qcl微信:2501902696/@DatapublicclassTemplateData{//keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注privateStringvalue;//,,依次排下去//privateStringcolor;//字段颜色(微信官方已废弃,设置没有效果)}到这里请求推送的数据就组装好了,解下来我们去实现推送功能。奥不对,还有一个重要的字段需要获取到:access_token
access_token的获取
/获取access_tokenappid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来/publicStringgetAccess_token(Stringappid,Stringappsecret){//获取access_tokenStringurl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"+"&appid="+appid+"&secret="+appsecret;Stringjson=restTemplate.getForObject(url,String.class);AccessTokenaccessToken=newGson().fromJson(json,AccessToken.class);returnaccessToken.getAccess_token();}这次是真正的可以来请求微信服务器来实现消息推送了
/微信小程序推送单个用户/publicStringpushOneUser(Stringopenid,Stringformid){//获取access_tokenStringaccess_token=getAccess_token(ConstantUtils.SCHOOL_APPID,ConstantUtils.SCHOOL_APPSECRET);Stringurl="https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send"+"?access_token="+access_token;//拼接推送的模版WxMssVowxMssVo=newWxMssVo();wxMssVo.setTouser(openid);//用户openidwxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版idwxMssVo.setForm_id(formid);//formidMapString,TemplateDatam=newHashMap(5);//keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注TemplateDatakeyword1=newTemplateData();keyword1.setValue("新下单待抢单");m.put("keyword1",keyword1);TemplateDatakeyword2=newTemplateData();keyword2.setValue("这里填下单金额的值");m.put("keyword2",keyword2);wxMssVo.setData(m);TemplateDatakeyword3=newTemplateData();keyword3.setValue("这里填配送地址");m.put("keyword3",keyword3);wxMssVo.setData(m);TemplateDatakeyword4=newTemplateData();keyword4.setValue("这里填取件地址");m.put("keyword4",keyword4);wxMssVo.setData(m);TemplateDatakeyword5=newTemplateData();keyword5.setValue("这里填备注");m.put("keyword5",keyword5);wxMssVo.setData(m);ResponseEntityStringresponseEntity=restTemplate.postForEntity(url,wxMssVo,String.class);log.error("小程序推送结果={}",responseEntity.getBody());returnresponseEntity.getBody();}openid可以让小程序开发人员给你传过来,也可以自己获取。formid需要小程序开发给你传过来,你也可以把formid存到数据库里,什么时候需要直接拿出来用就可以了。注意:formid必须和用户openid对应。
下面贴出来完整代码packagecom.qcl.paotuischool.wechat;importcom.google.gson.Gson;importcom.qcl.userwechat.bean.AccessToken;importcom.qcl.utils.ConstantUtils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.http.ResponseEntity;importorg.springframework.stereotype.Service;importorg.springframework.web.client.RestTemplate;importjava.util.HashMap;importjava.util.Map;importlombok.extern.slf4j.Slf4j;/Createdbyqclon2018/9/11.微信小程序推送服务,包含获取access_token的服务/@Service@Slf4jpublicclassWxPushServiceQcl{//用来请求微信的get和post@AutowiredprivateRestTemplaterestTemplate;/微信小程序推送单个用户/publicStringpushOneUser(Stringopenid,Stringformid){//获取access_tokenStringaccess_token=getAccess_token(ConstantUtils.SCHOOL_APPID,ConstantUtils.SCHOOL_APPSECRET);Stringurl="https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send"+"?access_token="+access_token;//拼接推送的模版WxMssVowxMssVo=newWxMssVo();wxMssVo.setTouser(openid);//用户openidwxMssVo.setTemplate_id("LzeDP0G5PLgHoOjCMfhu44wfUluhW11Zeezu3r_dC24");//模版idwxMssVo.setForm_id(formid);//formidMapString,TemplateDatam=newHashMap(5);//keyword1:订单类型,keyword2:下单金额,keyword3:配送地址,keyword4:取件地址,keyword5备注TemplateDatakeyword1=newTemplateData();keyword1.setValue("新下单待抢单");m.put("keyword1",keyword1);TemplateDatakeyword2=newTemplateData();keyword2.setValue("这里填下单金额的值");m.put("keyword2",keyword2);wxMssVo.setData(m);TemplateDatakeyword3=newTemplateData();keyword3.setValue("这里填配送地址");m.put("keyword3",keyword3);wxMssVo.setData(m);TemplateDatakeyword4=newTemplateData();keyword4.setValue("这里填取件地址");m.put("keyword4",keyword4);wxMssVo.setData(m);TemplateDatakeyword5=newTemplateData();keyword5.setValue("这里填备注");m.put("keyword5",keyword5);wxMssVo.setData(m);ResponseEntityStringresponseEntity=restTemplate.postForEntity(url,wxMssVo,String.class);log.error("小程序推送结果={}",responseEntity.getBody());returnresponseEntity.getBody();}/获取access_tokenappid和appsecret到小程序后台获取,当然也可以让小程序开发人员给你传过来/publicStringgetAccess_token(Stringappid,Stringappsecret){//获取access_tokenStringurl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"+"&appid="+appid+"&secret="+appsecret;Stringjson=restTemplate.getForObject(url,String.class);AccessTokenaccessToken=newGson().fromJson(json,AccessToken.class);returnaccessToken.getAccess_token();}}在需要做推送的地方调用WxPushServiceQcl类中的pushOneUser方法,并传入openid,formid参数即可。
这是我推送成功后打印的log下面来讲小程序端开发需要做些什么可以看出,我们的formid有效期是7天,并且一个form_id只能使用一次,所以我们小程序端所需要做的就是尽可能的多拿些formid,然后传个后台,让后台存到数据库中,这样7天有效期内,想怎么用就怎么用了。

所以接下来要讲的就是小程序开发怎么尽可能多的拿到formid了。
看下官方提供的,只有在表单提交时把report-submit设为true时才能拿到formid,比如这样formreport-submit='true'buttonform-type='submit'获取formid/button/form所以我们就要在这里下功夫了,既然只能在form组件获取,我们能不能把我们小程序里用到最多的地方用form来伪装呢。
我的小程序是跑腿小程序,消息也主要推送给跑腿员的,而跑腿员点击最多的也就是这两个条目,所以我们就用from组件来伪装这两个条目,让用户在点击的同时就可以收集到用的formid。viewclass='button_item'formbindsubmit='gorRunnerLobby'report-submit='true'data-type="1"buttonform-type='submit'text抢单大厅/texttextclass='runner_desc'(兼职也可月入万元)/text/button/formviewclass='right_arrow'//view这样就可以在用户点击条目时,收集到用户formid了
由于上面的botton有默认样式,所以我们就通过修改css来去除botton默认样式。.button_item{width:100%;display:flex;flex-direction:row;align-items:center;padding:2px20px;background:white;border-bottom:1pxsolidgainsboro;}/主要通过这里去除botton默认样式/.button{width:100%;background:white;border:none;text-align:left;padding:6px0px;margin:0px;line-height:1.5;}/主要通过这里去除botton边框/.button::after{border:none;}/用button伪装获取formid/.form_item{width:100%;}到这里我们小程序端也圆满完成自己的任务了。
补充知识点这样我们java后台和小程序开发就可以开开心心的完成微信小程序的消息推送功能了。
如果有java或小程序相关的问题可以加我微信交流学习2501902696(备注小程序或java)视频讲解:













