Django实现微信消息推送
一 所需准备条件
微信公众号的分类
- 微信消息推送
- 公众号
- 已认证公众号
- 服务号
- 已认证服务号
- 企业号
- 公众号
基于:微信认证服务号 主动推送微信消息。
前提:关注服务号
环境:沙箱环境
沙箱环境地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
二 基本流程
注册开发者账号
获得:appID、appsecret
网页授权获取用户基本信息:47.98.134.86 或 域名
关注公众号(已认证的服务号)
生成二维码,用户扫描;
将用户信息发送给微信,微信再将数据发送给设置redirect_uri地址(md5值)回调地址:47.98.134.86/callback/
- 授权
- 用户md5
- 获取wx_id
在数据库中更新设置:wx_id
发送消息(模板消息)
wx_id
access_token(2小时有效期)
三 核心代码
import json import functools import requests from django.conf import settings from django.shortcuts import render, redirect, HttpResponse from django.http import JsonResponse from app01 import models # 沙箱环境地质:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login def index(request):obj = models.UserInfo.objects.get(id=1)return render(request,'index.html',{'obj':obj})def auth(func):@functools.wraps(func)def inner(request, *args, **kwargs):user_info = request.session.get('user_info')if not user_info:return redirect('/login/')return func(request, *args, **kwargs)return innerdef login(request):"""用户登录:param request: :return: """# models.UserInfo.objects.create(username='luffy',password=123)if request.method == "POST":user = request.POST.get('user')pwd = request.POST.get('pwd')obj = models.UserInfo.objects.filter(username=user, password=pwd).first()if obj:request.session['user_info'] = {'id': obj.id, 'name': obj.username, 'uid': obj.uid}return redirect('/bind/')else:return render(request, 'login.html')@auth def bind(request):"""用户登录后,关注公众号,并绑定个人微信(用于以后消息推送):param request: :return: """return render(request, 'bind.html')@auth def bind_qcode(request):"""生成二维码:param request: :return: """ret = {'code': 1000}try:access_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope=snsapi_userinfo&state={state}#wechat_redirect"access_url = access_url.format(appid=settings.WECHAT_CONFIG["app_id"], # 'wx89085e915d351cae',redirect_uri=settings.WECHAT_CONFIG["redirect_uri"], # 'http://47.93.4.198/test/',state=request.session['user_info']['uid'] # 为当前用户生成MD5值 )ret['data'] = access_urlexcept Exception as e:ret['code'] = 1001ret['msg'] = str(e)return JsonResponse(ret)def callback(request):"""用户在手机微信上扫码后,微信自动调用该方法。用于获取扫码用户的唯一ID,以后用于给他推送消息。:param request: :return: """code = request.GET.get("code")# 用户md5值state = request.GET.get("state")# 获取该用户openId(用户唯一,用于给用户发送消息)res = requests.get(url="https://api.weixin.qq.com/sns/oauth2/access_token",params={"appid": 'wx89085e915d351cae',"secret": '64f87abfc664f1d4f11d0ac98b24c42d',"code": code,"grant_type": 'authorization_code',}).json()# 获取的到openid表示用户授权成功openid = res.get("openid")if openid:models.UserInfo.objects.filter(uid=state).update(wx_id=openid)response = "<h1>授权成功 %s </h1>" % openidelse:response = "<h1>用户扫码之后,手机上的提示</h1>"return HttpResponse(response)def sendmsg(request):def get_access_token():"""获取微信全局接口的凭证(默认有效期俩个小时)如果不每天请求次数过多, 通过设置缓存即可"""result = requests.get(url="https://api.weixin.qq.com/cgi-bin/token",params={"grant_type": "client_credential","appid": settings.WECHAT_CONFIG['app_id'],"secret": settings.WECHAT_CONFIG['appsecret'],}).json()if result.get("access_token"):access_token = result.get('access_token')else:access_token = Nonereturn access_tokenaccess_token = get_access_token()openid = models.UserInfo.objects.get(id=1).wx_iddef send_custom_msg():body = {"touser": openid,"msgtype": "text","text": {"content": '云姐好美呀'}}response = requests.post(url="https://api.weixin.qq.com/cgi-bin/message/custom/send",params={'access_token': access_token},data=bytes(json.dumps(body, ensure_ascii=False), encoding='utf-8'))# 这里可根据回执code进行判定是否发送成功(也可以根据code根据错误信息)result = response.json()return resultdef send_template_msg():"""发送模版消息"""res = requests.post(url="https://api.weixin.qq.com/cgi-bin/message/template/send",params={'access_token': access_token},json={"touser": openid,"template_id": '0XbLbuNkn3wPPAYRVXM-MZ0gU0tPvVbsjfc1qoSH6CM',"data": {"first": {"value": "罗毛","color": "#173177"},"keyword1": {"value": "傻屌","color": "#173177"},}})result = res.json()return resultresult = send_template_msg()if result.get('errcode') == 0:return HttpResponse('发送成功')return HttpResponse('发送失败')
view.py
1 {% load staticfiles %} 2 3 <!DOCTYPE html> 4 <html lang="en"> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Title</title> 8 </head> 9 <body> 10 <div style="width: 600px;margin: 0 auto"> 11 <h1>请关注路飞学城服务号,并绑定个人用户(用于以后的消息提醒)</h1> 12 <div> 13 <h3>第一步:关注路飞学城微信服务号</h3> 14 <img style="height: 100px;width: 100px" src="{% static "img/luffy.jpeg" %}"> 15 </div> 16 <input type="button" value="下一步【获取绑定二维码】" οnclick="getBindUserQcode()"> 17 <div> 18 <h3>第二步:绑定个人账户</h3> 19 <div id="qrcode" style="width: 250px;height: 250px;background-color: white;margin: 100px auto;"></div> 20 </div> 21 </div> 22 <script src="{% static "js/jquery.min.js" %}"></script> 23 <script src="{% static "js/jquery.qrcode.min.js" %}"></script> 24 <script src="{% static "js/qrcode.js" %}"></script> 25 <script> 26 function getBindUserQcode() { 27 $.ajax({ 28 url: '/bind_qcode/', 29 type: 'GET', 30 success: function (result) { 31 console.log(result); 32 $('#qrcode').empty().qrcode({text: result.data}); 33 } 34 }); 35 } 36 </script> 37 38 </body> 39 </html>
bind.html
class UserInfo(models.Model):username = models.CharField("用户名", max_length=64, unique=True)password = models.CharField("密码", max_length=64)uid = models.CharField(verbose_name='个人唯一ID',max_length=64, unique=True)wx_id = models.CharField(verbose_name="微信ID", max_length=128, blank=True, null=True, db_index=True)def save(self, *args, **kwargs):# 创建用户时,为用户自动生成个人唯一IDif not self.pk:m = hashlib.md5()m.update(self.username.encode(encoding="utf-8"))self.uid = m.hexdigest()super(UserInfo, self).save(*args, **kwargs)
model.py
转载于:https://www.cnblogs.com/harryblog/p/10336854.html
Django实现微信消息推送相关推荐
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
python 全栈开发,Day103(微信消息推送,结算中心业务流程) 昨日内容回顾 第一部分:考试题(Python基础)第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事?- o ...
- java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能
其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送.之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作. 需要你既要会小 ...
- python websocket实现消息推送_python Django websocket 实时消息推送
[实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...
- 【微信早安定时推送3.0最牛版】微信消息推送后 可提醒可顶置,聊天框名称,头像都可修改~
微信早安3.0最牛版重磅推出!!! 全网最全最详细教程,无基础看过的都说好,不白找. 往期推送: 微信早安推送1.0版: https://blog.csdn.net/A_Xunla/article/d ...
- 微信消息推送神器【一封传话】介绍,让消息推送更简单
背景 对于很多个人开发和企业级别的软件开发来说,经常会遇到一些消息推送的场景.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,例如微信公众号消息推送.钉钉消息推送等. 这里以微信消息推送举例,原 ...
- 抖音微信消息推送情侣告白浪漫(简易版)
抖音微信消息推送情侣告白浪漫(简易版) 一.首先去微信公众平台用微信扫码登录 登录后会自动生成属于自己的appId,appSecret 二.在上述登录后页面中下拉,用一个手机扫码会生成user_id( ...
- Java后台微信点餐小程序开发最新版笔记,Springboot+Mysql+Freemarker+Bootstrap+微信小程序实现扫码点餐小程序,包含语音提示,微信消息推送,网页管理后台
由于之前的Java后台微信点餐小程序有些知识点过时了,所以今天重新出一版,把里面过时的知识点更新下 前五章是部署笔记,后面是知识点的详细讲解,大家可以先看部署笔记,部署起来后,再跟着详细知识学习. 第 ...
- 基于SpringBoot实现微信消息推送
本微信消息推送实现的功能 1.当天指定城市的天气 2.当天指定城市的最低高气温 3.彩虹屁 技术栈 1.SpringBoot2.7.5 2.JDK1.8 源码链接:weather_push.zip - ...
- 微信消息推送消息加解密(golang)
本篇介绍如何使用golang对微信消息推送进行加解密,后续会补充,目前先写个原理,大概自己看一下,其他的自己应该也能写.老套路,分为三步,为啥写,教程,总结.懒得看的直接看第二步就行. 为什么突然写这 ...
最新文章
- Maven环境变量配置以及修改阿里云镜像
- F1 score的意义
- 计算机二级vf上机试题,2016年计算机二级《VF》上机题及答案
- Python while循环 - Python零基础入门教程
- GCD之线程挂起与恢复
- CreateThread用法详解
- hbase数据结构小结
- 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
- 十五的学习日记20160925
- 专科python应届生工资多少-应届生学Python年薪30万,秘诀是什么?
- 根据开始日期和结束日期获取基金的当天净值,并计算收益率
- 磨刀室-文本编辑之全面接触PDF:最好用的PDF软件汇总(转)
- Monkey Test 命令使用
- 修改群晖mac 及 sn
- Mac OS 系统的发展历史
- 破解使用radius实现802.1x认证的企业无线网络
- Python爬取有道词典
- 网易云登陆界面怎么用PHP做,网易云音乐登录流程图
- 【转载】uTorrent缓存设置,防止出现磁盘负荷100%
- LPC1768 IAR环境下使用完整64K内存的方法_整理
热门文章
- 蓝桥杯 ADV-180 算法提高 陶陶摘苹果2
- 【C++ 与 STL】不定长数组:vector
- L1-019. 谁先倒-PAT团体程序设计天梯赛GPLT
- linux定时任务生效_Linux 添加定时任务
- go restful 安全_Go语言构建 RESTful Web 服务
- java实现邮件发送, 抄送及多附件发送
- java通过JDBC驱动连接操作hive实例
- JAVA 字符串格式化-String.format()的使用(转)
- Linux Shell 文件描述符 及 stdin stdout stderr 重定向
- 用.net实现按透明度生成水印文件