一 所需准备条件

微信公众号的分类

  • 微信消息推送

    • 公众号

      • 已认证公众号
      • 服务号
      • 已认证服务号
      • 企业号

基于:微信认证服务号 主动推送微信消息。
前提:关注服务号
环境:沙箱环境

沙箱环境地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

二 基本流程

  1. 注册开发者账号

    获得:appID、appsecret

    网页授权获取用户基本信息:47.98.134.86 或 域名

  2. 关注公众号(已认证的服务号)

  3. 生成二维码,用户扫描;
    将用户信息发送给微信,微信再将数据发送给设置redirect_uri地址(md5值)

  4. 回调地址:47.98.134.86/callback/

    • 授权
    • 用户md5
    • 获取wx_id
      在数据库中更新设置:wx_id
  5. 发送消息(模板消息)

    • 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实现微信消息推送相关推荐

  1. python 全栈开发,Day103(微信消息推送,结算中心业务流程)

    python 全栈开发,Day103(微信消息推送,结算中心业务流程) 昨日内容回顾 第一部分:考试题(Python基础)第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事?- o ...

  2. java发送qq消息_Java点餐系统和点餐小程序新加微信消息推送功能

    其实想给点餐系统加推送很久了,之前也有单门写过Java版的微信消息推送和云开发版的微信消息推送.之所以一直没有加,也是考虑到大家的学习接受度,因为做订阅消息推送是一个综合性的开发工作. 需要你既要会小 ...

  3. python websocket实现消息推送_python Django websocket 实时消息推送

    [实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...

  4. 【微信早安定时推送3.0最牛版】微信消息推送后 可提醒可顶置,聊天框名称,头像都可修改~

    微信早安3.0最牛版重磅推出!!! 全网最全最详细教程,无基础看过的都说好,不白找. 往期推送: 微信早安推送1.0版: https://blog.csdn.net/A_Xunla/article/d ...

  5. 微信消息推送神器【一封传话】介绍,让消息推送更简单

    背景 对于很多个人开发和企业级别的软件开发来说,经常会遇到一些消息推送的场景.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,例如微信公众号消息推送.钉钉消息推送等. 这里以微信消息推送举例,原 ...

  6. 抖音微信消息推送情侣告白浪漫(简易版)

    抖音微信消息推送情侣告白浪漫(简易版) 一.首先去微信公众平台用微信扫码登录 登录后会自动生成属于自己的appId,appSecret 二.在上述登录后页面中下拉,用一个手机扫码会生成user_id( ...

  7. Java后台微信点餐小程序开发最新版笔记,Springboot+Mysql+Freemarker+Bootstrap+微信小程序实现扫码点餐小程序,包含语音提示,微信消息推送,网页管理后台

    由于之前的Java后台微信点餐小程序有些知识点过时了,所以今天重新出一版,把里面过时的知识点更新下 前五章是部署笔记,后面是知识点的详细讲解,大家可以先看部署笔记,部署起来后,再跟着详细知识学习. 第 ...

  8. 基于SpringBoot实现微信消息推送

    本微信消息推送实现的功能 1.当天指定城市的天气 2.当天指定城市的最低高气温 3.彩虹屁 技术栈 1.SpringBoot2.7.5 2.JDK1.8 源码链接:weather_push.zip - ...

  9. 微信消息推送消息加解密(golang)

    本篇介绍如何使用golang对微信消息推送进行加解密,后续会补充,目前先写个原理,大概自己看一下,其他的自己应该也能写.老套路,分为三步,为啥写,教程,总结.懒得看的直接看第二步就行. 为什么突然写这 ...

最新文章

  1. Maven环境变量配置以及修改阿里云镜像
  2. F1 score的意义
  3. 计算机二级vf上机试题,2016年计算机二级《VF》上机题及答案
  4. Python while循环 - Python零基础入门教程
  5. GCD之线程挂起与恢复
  6. CreateThread用法详解
  7. hbase数据结构小结
  8. 洛谷P3292 [SCOI2016]幸运数字(倍增+线性基)
  9. 十五的学习日记20160925
  10. 专科python应届生工资多少-应届生学Python年薪30万,秘诀是什么?
  11. 根据开始日期和结束日期获取基金的当天净值,并计算收益率
  12. 磨刀室-文本编辑之全面接触PDF:最好用的PDF软件汇总(转)
  13. Monkey Test 命令使用
  14. 修改群晖mac 及 sn
  15. Mac OS 系统的发展历史
  16. 破解使用radius实现802.1x认证的企业无线网络
  17. Python爬取有道词典
  18. 网易云登陆界面怎么用PHP做,网易云音乐登录流程图
  19. 【转载】uTorrent缓存设置,防止出现磁盘负荷100%
  20. LPC1768 IAR环境下使用完整64K内存的方法_整理

热门文章

  1. 蓝桥杯 ADV-180 算法提高 陶陶摘苹果2
  2. 【C++ 与 STL】不定长数组:vector
  3. L1-019. 谁先倒-PAT团体程序设计天梯赛GPLT
  4. linux定时任务生效_Linux 添加定时任务
  5. go restful 安全_Go语言构建 RESTful Web 服务
  6. java实现邮件发送, 抄送及多附件发送
  7. java通过JDBC驱动连接操作hive实例
  8. JAVA 字符串格式化-String.format()的使用(转)
  9. Linux Shell 文件描述符 及 stdin stdout stderr 重定向
  10. 用.net实现按透明度生成水印文件