在公众平台沙箱环境中注册

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index   

大致的流程

 

1. 获取 appId 和appsecret

  appID:wx89085e915d351cae
  appsecret:64f87abfc664f1d4f11d0ac98b24c42d

 网页授权获取用户基本信息 修改微信可以访问的地址: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小时有效期)

 

models.py

import hashlib
from django.db import models

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):
        # 创建用户时,为用户自动生成个人唯一ID
        if not self.pk:
            m = hashlib.md5()
            m.update(self.username.encode(encoding="utf-8"))
            self.uid = m.hexdigest()
        super(UserInfo, self).save(*args, **kwargs)

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^login/$\', views.login),
    url(r\'^bind/$\', views.bind),
    url(r\'^bind_qcode/$\', views.bind_qcode),
    url(r\'^callback/$\', views.callback),
    url(r\'^sendmsg/$\', views.sendmsg),
]

 

登陆的视图 — > 登陆成功后 引导用户关注公众号和绑定个人的信息

 

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 inner


def 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()
        print(obj)
        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\')

{% load staticfiles %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div style="width: 600px;margin: 0 auto">
    <h1>请关注服务号,并绑定个人用户(用于以后的消息提醒)</h1>
    <div>
        <h3>第一步:关注微信服务号</h3>
        <img style="height: 100px;width: 100px" src="{% static "img/luffy.jpeg" %}">
    </div>
    <input type="button" value="下一步【获取绑定二维码】" onclick="getBindUserQcode()">
    <div>
        <h3>第二步:绑定个人账户</h3>
        <div id="qrcode" style="width: 250px;height: 250px;background-color: white;margin: 100px auto;"></div>
    </div>
</div>
<script src="{% static "js/jquery.min.js" %}"></script>
<script src="{% static "js/jquery.qrcode.min.js" %}"></script>
<script src="{% static "js/qrcode.js" %}"></script>
<script>
    function getBindUserQcode() {
        $.ajax({
            url: \'/bind_qcode/\',
            type: \'GET\',
            success: function (result) {
                console.log(result);
                $(\'#qrcode\').empty().qrcode({text: result.data});
            }
        });
    }
</script>

</body>
</html>

bind.html

点击关注服务号成功微信后会生成一个 关注后的用户列表

  

 

绑定个人的账户,我们想要获取在微信公众号中用户的id存到数据库中 

在这里生成了一个url让用户去访问(已二维码的形式)

@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_url
    except Exception as e:
        ret[\'code\'] = 1001
        ret[\'msg\'] = str(e)

    return JsonResponse(ret)

 

  

 当用户扫描绑定个人信息后,会访问如下的视图函数   (把公共号中的用户的ID存入数据库中,根据数据库中的uid)

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>" % openid
    else:
        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 = None
        return access_token

    access_token = get_access_token()

    openid = models.UserInfo.objects.get(id=1).wx_id

    def 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 result

    def 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": \'rbm9NAgqSb3HITCJYjJr9kiX2-J9LHg982JCuvxJQIA\',
                "data": {
                    "first": {
                        "value": "云姐",
                        "color": "#173177"
                    },
                    "keyword1": {
                        "value": "美女",
                        "color": "#173177"
                    },
                }
            }
        )
        result = res.json()
        return result

    result = send_template_msg()

    if result.get(\'errcode\') == 0:
        return HttpResponse(\'发送成功\')
    return HttpResponse(\'发送失败\')

  

  

 

版权声明:本文为crazymagic原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/crazymagic/p/9741211.html%20