事情是这样的,刷抖音的时候看到一个视频里面微信公众号每天推送消息给女朋友,由于一时技痒决定尝试一下...
遵循程序员一贯的作风,不管会不会先去百度搜搜.... 结果看到都是什么用python写的,啧啧啧... 我是前端啊.... 看不懂这玩意,用我自己的方式实现吧,话不多说开始吧↓
微信公众平台接口测试帐号申请:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
微信官方文档(如果出错查一下错误代码):https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Global_Return_Code.html
消息推送接口:https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${this.token}
因为不会后台,我这边全部都由前端的方式去做了,项目框架选择的是 uniapp ,不会的话可以去我的专栏去学习一下还是比较容易上手的。
注册完成后可以看到上面的界面,在里面去拿到我们的 appID 、 appsecret
配置消息模板,大家自行搭配
这个拿到以后,我们就可以开始干活了,先看一下成品的样子
这里是JS 部分
- export default {
- data() {
- return {
- title: 'Hello',
- appid: "wx2......4eb",
- secret: "5ac3......97d",
- // 账号授权信息
- token: "",
- // 用户openId
- // 臭宝ID oeDzm6C......kRMmUDtM
- // 个人ID oeDzm6F......hLTllHY
- touser: "oeDzm6......LTllHY",
- // 消息模板ID
- template_id: "XK_v411POkuBPw4l3-ebSfWO1Vs0AhqWaqTCBlO2lqg",
- // 回调信息
- message: "",
- // 下次生日
- xiacishengri: "",
- // 纪念日
- jinianri: "",
- // 已经相识多久了
- day: ""
- }
- },
- onLoad() {
- this.xiacishengri = this.daojishi("2023/07/30 00:00:00")
- this.jinianri = this.daojishi("2022/12/18 00:00:00")
- this.xiangshiduojiu(2020, 12, 18, 0, 0, 0)
- },
- methods: {
- // 获取token信息
- getToken() {
- const vm = this
- uni.request({
- url: `/cgi-bin/token?grant_type=client_credential&appid=${this.appid}&secret=${this.secret}`,
- method: "get",
- success: function(res) {
- vm.token = res.data.access_token
- }
- })
- },
- // 发送消息
- postMessage() {
- const vm = this
- uni.request({
- url: `/cgi-bin/message/template/send?access_token=${this.token}`,
- method: "POST",
- data: {
- "touser": this.touser,
- "template_id": this.template_id,
- "data": {
- "title": {
- "value": "今天好呀臭宝~",
- "color": "#000000"
- },
- "message": {
- "value": `我们已经在一起相识${this.day}`,
- "color": "#000000"
- },
- "bosDay": {
- "value": `距离你下次过生日只剩下${this.xiacishengri}天`,
- "color": "#000000"
- },
- "jinianri": {
- "value": `距离我们的相识纪念日还有${this.jinianri}天`,
- "color": "#000000"
- }
- }
- },
- success: function(res) {
- vm.message = res.data
- }
- })
- },
- // 倒计时方法
- daojishi(value) {
- const setTime = new Date(value);
- const nowTime = new Date();
- const restSec = setTime.getTime() - nowTime.getTime();
- // 剩余天数
- const day = parseInt(restSec / (60 * 60 * 24 * 1000));
- // 剩余小时
- const hour = parseInt(restSec / (60 * 60 * 1000) % 24);
- // 剩余分钟
- const minu = parseInt(restSec / (60 * 1000) % 60);
- // 剩余秒数
- const sec = parseInt(restSec / 1000 % 60);
- return day
- },
- // 计算你们认识了多久
- xiangshiduojiu(iYear, iMonth, iDay, iHour, iMinute, iSecond) {
- var iYear = iYear //年份
- var iMonth = iMonth //月份
- var iDay = iDay // 日期
- var iHour = iHour // 时
- var iMinute = iMinute // 分
- var iSecond = iSecond //秒
-
- //设计一个计时器,1秒钟运行一次
- var now = new Date(); //现在时间,获取时间戳
- //以前的时间(以前的时间戳)
- var ago = new Date(iYear, iMonth - 1, iDay, iHour, iMinute, iSecond);
- //计算时差
- var ms = now - ago;
- //计算天数
- var day = parseInt(ms / (24 * 60 * 60 * 1000));
- //计算小时
- var hours = parseInt(ms % (24 * 60 * 60 * 1000) / (60 * 60 * 1000));
- //计算分钟
- var min = parseInt(ms % (24 * 60 * 60 * 1000) % (60 * 60 * 1000) / (60 * 1000));
- //计算秒
- var s = parseInt(ms % (24 * 60 * 60 * 1000) % (60 * 60 * 1000) % (60 * 1000) / 1000);
- console.log('你认识ta已经有' + day + '天' + hours + '小时' + min + '分' + s + '秒了!')
- this.day = day + '天' + hours + '小时' + min + '分' + s + '秒'
- }
- }
- }
html部分
- <template>
- <view>
- <view style="background-color: white;display: flex;">
- <text style="height: 30px;line-height: 30px;font-size: 18px;">用户ID:text>
- <input style="height: 30px;line-height: 30px;margin-left: 20px;font-size: 18px;" type="text"
- v-model="touser">
- view>
- <view style="background-color: white;display: flex;">
- <text style="height: 30px;line-height: 30px;font-size: 18px;">消息模板ID:text>
- <input style="height: 30px;line-height: 30px;margin-left: 20px;font-size: 18px;" type="text"
- v-model="template_id">
- view>
- <button style="margin-top: 80rpx;" @click="getToken">获取token信息button>
- <button style="margin-top: 30rpx;" @click="postMessage">发送推送消息button>
- <view style="color: aliceblue;margin-top: 30rpx;">
- token ======>>>>>>>
- <br>
- {{token}}
- view>
- <view style="color: aliceblue;margin-top: 30rpx;">
- 回调信息 ======>>>>>>>
- <br>
- {{message}}
- view>
- view>
- template>
说一下他大概实现的思路哈, 懂的大佬别喷我
1.获取用户的token
2.拿到token以后再去配置消息模板
3.拿到消息模板ID ,跟用户openid 以后,去调取消息推送的接口
因为我看到大家都是后台去写的,没有服务器... 我这个也就没发布,想完成定时推送的话,在前端项目里面加个定时器,定时24小时调用一次获token 跟 发送消息方法就可以了,我这边是把获取token跟发送消息给分开了,大家写到一起也没问题,注意同步的问题就行了
对了对了, 大家请求的时候会发生跨域问题,我们需要做个代理,把这个代码贴到对应位置上面去。manifest.json 源码视图
- "h5": {
- "router": {
- "base": ""
- },
- "template": "index.html",
- // 这个是主要的哈
- "devServer": {
- "port": 8081, //端口号
- "disableHostCheck": true,
- "proxy": {
- "/": {
- "target": "https://api.weixin.qq.com", //目标接口域名
- "changeOrigin": true, //是否跨域
- "secure": false // 设置支持https协议的代理
- }
- },
- "https": true
- },
- "uniStatistics": {
- "enable": true
- }
- }
最后展示下效果吧