当前位置: 首页 > news >正文

Python调用企业微信的扫一扫

在企业微信里面新建了一个应用,指向了搭建服务器上Django写的web应用。
web应用需要使用扫描二维码的功能,就使用了大家都评价效果好的微信的扫一扫,事实也证明微信的扫一扫很好,但实现这个功能还是花了自己不少时间,很多都是细节,如果你陷在坑里都不知道自己在坑里。

一.python文件:wx_method.py
拷贝这个文件,只需要修改两个地方:app_id和secret,但你着两个参数值要找对,否则后面的签名过不了。
另外特别注意企业微信和微信的token_url是不一样的。

# -*- encoding:utf-8 -*-
import uuid
import time
import requests
import json

# app_id和secret从微信公众号中获取;获取路径:微信公众号->开发->基本配置->公众号开发信息,secret从APP的地方获取
app_id = "wx************************"
secret = "fN**********************************************"

grant_type = "client_credential"


def get_token():
    """
    获取微信access_token;
    access_token有效期为2小时,建议保存到数据库中,定时更新;
    直接获取数据库中的数据.
    """
    #token_url = "https://api.weixin.qq.com/cgi-bin/token"
    token_url ="https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    payload = {
        #"appid": app_id,
        #"secret": secret,
        "corpid": app_id,
        "corpsecret": secret,
        "grant_type": grant_type
    }
    res = requests.get(token_url, params=payload)
    resp = json.loads(res.text)
    if resp.get('access_token'):
        return True, resp['access_token']
    return False, resp


def create_noncestr():
    '''
    生成签名的随机串
    '''
    return uuid.uuid1()


def create_timestamp():
    '''
    生成签名的时间戳
    '''
    return str(int(time.time()))


def get_jsapi_ticket(access_token):
    '''
    获取jsapi_ticket;
    jsapi_ticket是公众号用于调用微信JS接口的临时票据;
    https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN
    '''

    url = 'https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket'

    payload = {

        "access_token": access_token,
        "type": "jsapi"

    }

    res = requests.get(url, params=payload)
    res_result = json.loads(res.text)

    if res_result["errcode"] == 0:
        return True, res_result['ticket']

    return False, res_result

二.view.py中的签名方法调用
这个主要是获得签名传给html中的js进行处理。
from .wx_method import get_token, get_jsapi_ticket, create_noncestr, create_timestamp
def logwechat(request):
    '''
    生成签名算法;
    返回微信config接口注入权限验证配置参数;
    '''
    app_id = "wx******************"
    #url = 'http://yourtesturl
    url = request.POST.get('tokenUrl')
    ok, access_token = get_token()
    if not ok:
        return {'code': 1006, 'message': '获取签名算法失败'}
    ok, jsapi_ticket = get_jsapi_ticket(access_token)
    if not ok:
        return {'code': 1006, 'message': '获取签名算法失败'}
    noncestr = create_noncestr()
    timestamp = create_timestamp()
    stringlink = "jsapi_ticket={}&noncestr={}&timestamp={}&url={}".format(jsapi_ticket, noncestr, timestamp, url)
    crypt = hashlib.sha1(stringlink .encode('utf-8'))
    signature = crypt.hexdigest()

    result_dict = {
        "code": 0,
        "nonceStr": noncestr,
        "timestamp": timestamp,
        "signature": signature,
        "appId": app_id,
        "message": ""

    }
    return JsonResponse(result_dict)
这个不复杂,只要你调试时调用能生成签名就没有问题。

三.html 页面扫一扫
调用微信扫一扫的功能代码网上很多,随便都能找了一个 。
<body>
<div><input type="text" name="sn" id="codeValue"><input id="scanQRCode" value="扫一扫" type="button"></div>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script> 
    <script type="text/javascript">
        $(function() {
            //需要把当前页面的url地址传到后台,生成签名信息时需要使用到
            var tokenUrl= location.href;
            //获取签名的后台接口
            var _getWechatSignUrl = '/logwechat/';   
            $(document).ready(function(){
                //获取签名
                $.ajax({
                    url:_getWechatSignUrl,
                    data:{tokenUrl:tokenUrl},
                    dataType: 'json',//返回数据格式
                    success:function(res){
                    //alert(tokenUrl);
                        //获得签名之后传入配置中进行配置
                        if (res.code != 0){
                            alert(res.message+',请刷新重试');
                            return false;
                        }
                      //alert(res.code);
                       wxConfig(res.appId,res.timestamp,res.nonceStr,res.signature);
     
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        //alert(XMLHttpRequest.status);
                        //alert(textStatus);
                       //alert(tokenUrl);
                     }
                })
            })

           //微信的配置信息
            function wxConfig(_appId,_timestamp, _nonceStr, _signature) {
                wx.config({
                   // beta: ture,
                   //debug: true,// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                    appId: _appId,// 必填,公众号的唯一标识
                    timestamp: _timestamp,// 必填,生成签名的时间戳
                    nonceStr: _nonceStr,// 必填,生成签名的随机串
                    signature: _signature,// 必填,签名,见附录1
                    jsApiList: ['scanQRCode']
                    // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
                });
             //alert(_signature);

            }

           $("#scanQRCode").click(function(event){
                wx.scanQRCode({
                    desc: 'scanQRCode desc',
                    needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                    scanType : [ "qrCode", "barCode" ], // 可以指定扫二维码还是一维码,默认二者都有
                    success : function(res) {
                    // alert('ok2');
                        var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                        $("#codeValue").val(result);//赋值
                        //form.submit(); //如果希望扫描后提交页面
                    },
                    error:function(res){
                        //alert(res);
                      }
                });
           })

        });
    </script>

</body>
</html>

一旦你调通了就容易了。

相关文章:

Python调用企业微信的扫一扫

在企业微信里面新建了一个应用&#xff0c;指向了搭建服务器上Django写的web应用。 web应用需要使用扫描二维码的功能&#xff0c;就使用了大家都评价效果好的微信的扫一扫&#xff0c;事实也证明微信的扫一扫很好&#xff0c;但实现这个功能还是花了自己不少时间&#xff0c;很…...

速盾:CDN和OBS能共用流量包吗?

CDN和OBS是两种不同的云服务&#xff0c;它们在内容分发和存储方面有着不同的功能和优势。虽然它们都可以用于提供高效的内容分发和存储服务&#xff0c;但是它们的流量包是不能共用的。 CDN&#xff0c;即内容分发网络&#xff0c;是一种通过将内容存储在全球分布的服务器上&…...

第8章 利用CSS制作导航菜单

8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平 导航适用性强&#xff0c;几乎所有类型的网站都可以使用&#xff0c;设计难度较低。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在…...

C# 集合与泛型

文章目录 前言1.什么是集合&#xff1f;2.非泛型集合&#xff08;了解即可&#xff09;2.1常见的非泛型集合 3.泛型的概念4.常用的泛型集合4.1 List < T > <T> <T>4.2 Dictionary<TKey, TValue>4.3 Queue < T > <T> <T>4.4 S t a c…...

el-date-picker 设置开始时间和结束时间

<el-date-picker v-model"ruleForm.RECORDDATE" type"date" placeholder"日期" format"YYYY/M/D" value-format"YYYY/M/D" style"width: 100%;" :disabled-date"publishDateAfter" > </el-dat…...

【Docker】 常用命令

文章目录 介绍Docker和容器化技术什么是Docker&#xff1f;Docker的优势和应用场景Docker的应用场景包括但不限于&#xff1a; 安装和配置Docker安装Docker引擎配置Docker环境 Docker镜像命令搜索镜像拉取镜像查看本地镜像删除本地镜像 Docker容器命令创建容器启动容器停止容器…...

docker compose - 设置名字

只使用 docker compose up 启动容器&#xff0c;默认名字为当前文件夹的名字 设置 project-name&#xff0c;docker 客户端会显示设置的名字&#xff0c;方便区分 docker compose --project-name webtest up错误&#xff1a; docker compose up --project-name webtest 效果…...

工业拍卖平台、信息发布、租赁商城平台系统适用于全行业解决方案。

工业拍卖平台系统是为工业领域的资产交易、设备处置等提供线上拍卖服务的数字化平台。 主要功能&#xff1a; 拍卖信息发布&#xff1a;平台会展示待拍卖的工业资产详细信息&#xff0c;包括设备的名称、型号、规格、使用年限、生产厂家等基本信息&#xff0c;以及资产的图片…...

一个win32 / WTL下多线程库(CThread类)的使用心得

说是多线程库&#xff0c;其实就是一个单独的.h文件&#xff0c;可以方便的放入WTL/win32工程中。 下载地址&#xff1a;CThread. 里面也简单介绍了 用法。 具体用法&#xff0c;首先自定义一个子线程类继承CThreadImpl<T>&#xff0c;注意他是个模板类。 class CMySu…...

使用wordpress搭建简易的信息查询系统

背景 当前有这样的一个需求&#xff0c;要实现让客户能够自助登录系统查询一些个人的信息&#xff0c;市面上没有特别符合我的需求的产品&#xff0c;经过一段时间的研究&#xff0c;想出了一个用wordpress实现简易信息查询系统&#xff0c;有两种方式。 方式一&#xff1a;使…...

PAT甲级 1076 Forwards on Weibo(30)

文章目录 题目题目翻译深度优先搜索&#xff08;dfs&#xff09;宽度优先搜索&#xff08;bfs&#xff09;总结 原题链接 题目 题目翻译 微博被称为中国的推特。在微博上&#xff0c;一个用户可能有很多粉丝&#xff0c;也可能关注许多其他用户。因此&#xff0c;通过粉丝关系…...

揭开 gRPC、RPC 、TCP和UDP 的通信奥秘

差异点 特性TCPUDPRPCgRPCHTTP工作层级传输层传输层应用层应用层应用层传输协议面向连接的传输协议无连接传输协议使用 TCP、HTTP 等协议HTTP/2HTTP/1.1, HTTP/2序列化格式字节流数据报文XML、JSON 或自定义Protocol BuffersJSON 或 XML特点可靠的连接传输无连接、快速传输远程…...

使用Web Worker来处理多线程操作,以及如何避免主线程卡顿。

在JavaScript中处理大量数据时&#xff0c;由于JavaScript是单线程的&#xff0c;所有的操作都在主线程上运行&#xff0c;因此处理大量数据可能导致页面卡顿和响应迟缓。为了避免这些问题&#xff0c;可以使用Web Workers来实现多线程操作&#xff0c;允许在后台线程中处理复杂…...

杂谈:业务说的场景金融是什么?

引言&#xff1a;市场格局的转变 在供应短缺的年代&#xff0c;是典型的卖方市场。为了保证稳定供货&#xff0c;买方会提前一段时间下单&#xff0c;也几乎没什么议价能力。卖方只需等着接单就行。 现在很多领域的供应商数量越来越多&#xff0c;而且随着互联网的普及&#…...

在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换

在Chrome开发者工具中&#xff0c;我们可以用 Ctrl [ 和 Ctrl ] 快捷键来切换面板&#xff0c;用起来很方便。 vscode中默认没有这两个快捷键&#xff0c;我们可以通过配置自定义快捷键来实现相同的功能。 配置方法&#xff1a; 1. 按 Ctrl K, Ctrl S 调出快捷键配置面板。…...

【ESP32+MicroPython】硬件控制基础

ESP32是一款功能强大的微控制器&#xff0c;具有多种硬件接口。本文以“ESP32硬件控制”为主题&#xff0c;逐步介绍GPIO&#xff08;通用输入输出&#xff09;、PWM&#xff08;脉宽调制&#xff09;、ADC&#xff08;模数转换&#xff09;等功能的原理与实现&#xff0c;并结…...

Python学习从0到1 day26 第三阶段 Spark ① 数据输入

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义&#xff1a; Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…...

kafka消费者的消费分区策略有哪些,默认是哪个?

Kafka消费者的分区分配策略主要有以下几种&#xff0c;分别决定了如何将多个分区分配给消费者&#xff1a; 1. Range&#xff08;范围分配&#xff09; 描述&#xff1a;将分区连续地分配给消费者。每个消费者负责一段连续的分区。如果有多个消费者&#xff0c;那么消费者会按…...

前端常用时间操作汇总

&#xff08;1&#xff09;获取中国标准时间&#xff1a; let now new Date(); ​ // Thu Nov 14 2024 17:13:49 GMT0800 (中国标准时间) &#xff08;2&#xff09;获取年份&#xff1a; let year now.getFullYear(); ​ // 2024 &#xff08;3&#xff09;获取月份&…...

106. UE5 GAS RPG 使用MVVM

MVVM 是 Model-View-ViewModel的缩写&#xff0c;个人理解它和MVC很相似&#xff0c;有区别的地方在于&#xff0c;在MVC里&#xff0c;Controller会服务多个View&#xff0c;而MVVM里&#xff0c;每个View都拥有一个单独的ViewModel&#xff0c;所以ViewModel相当于精简版的Co…...

Qwen3-14B中文古诗创作效果:格律合规、意象统一、风格仿写展示

Qwen3-14B中文古诗创作效果&#xff1a;格律合规、意象统一、风格仿写展示 1. 引言&#xff1a;当AI遇见古诗创作 古诗创作一直被视为人类独有的艺术表达形式&#xff0c;需要深厚的文化底蕴和语言功底。然而&#xff0c;随着大语言模型的发展&#xff0c;AI在古诗创作领域展…...

InstantID社区翻译计划:多语言支持的实现与贡献方式

InstantID社区翻译计划&#xff1a;多语言支持的实现与贡献方式 【免费下载链接】InstantID 项目地址: https://ai.gitcode.com/hf_mirrors/InstantX/InstantID InstantID作为一款创新的AI人脸编辑工具&#xff0c;正通过社区翻译计划打破语言壁垒&#xff0c;让全球用…...

WZ文件编辑神器:Harepacker-resurrected从入门到精通的完整指南

WZ文件编辑神器&#xff1a;Harepacker-resurrected从入门到精通的完整指南 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected Harepacker-resu…...

别再只建网站了!宝塔面板的‘Node项目’功能,让你的Express/Koa后端服务上线更简单

解锁宝塔面板的隐藏技能&#xff1a;Node.js后端服务一键部署实战指南 你是否还在为Node.js项目的繁琐部署流程而头疼&#xff1f;手动配置PM2、Nginx反向代理、环境变量设置...这些操作不仅耗时耗力&#xff0c;还容易出错。其实&#xff0c;你每天都在使用的宝塔面板早已内置…...

探索瑞芯微RK3588硬件电路设计:从资料到实战

瑞芯微RK3588硬件电路设计资料&#xff08;Altium原理图PCB全套硬件资料&#xff09;包含RK3588全套硬件资料和用RK3588设计的一款网络硬盘录像机&#xff08;原理图和PCB均用Altium Designer打开&#xff09;使用3D封装最近在研究硬件设计这块&#xff0c;发现了一份超有料的瑞…...

油气勘探数据可视化流程图制作

一、前言 油气勘探属于高投入、高风险、数据密集型行业&#xff0c;勘探过程中会产生地震数据、测井数据、地质录井数据、试油试采数据等多维度海量信息。数据可视化流程图能够将复杂的勘探流程、数据流转逻辑、分析决策路径进行结构化呈现&#xff0c;既便于团队内部技术交底…...

Vue-Super-Flow隐藏玩法:不画图,只填空!手把手教你打造可配置的流程图答题组件

Vue-Super-Flow隐藏玩法&#xff1a;不画图&#xff0c;只填空&#xff01;手把手教你打造可配置的流程图答题组件 在Vue生态中&#xff0c;流程图工具通常被用来构建复杂的可视化编辑界面。但你是否想过&#xff0c;这些工具还能用来做些什么&#xff1f;本文将带你探索一个全…...

湖南石材结晶公司

在长沙&#xff0c;无论是高端商场、星级酒店&#xff0c;还是政务大厅、三甲医院&#xff0c;光洁如镜、平整如砥的石材地面&#xff0c;都是其专业形象与高端质感的直接体现。然而&#xff0c;石材作为“面子工程”&#xff0c;长期承受高频人流、设备碾压&#xff0c;极易出…...

无代码自动化:OpenClaw+Qwen3.5-9B可视化流程搭建

无代码自动化&#xff1a;OpenClawQwen3.5-9B可视化流程搭建 1. 为什么选择OpenClawQwen3.5-9B组合 去年夏天&#xff0c;我发现自己每周要花3小时重复做三件事&#xff1a;整理会议录音、提取待办事项、设置日历提醒。当我尝试用传统自动化工具时&#xff0c;要么需要写代码…...

30个核心概念一次讲明白,小白也能轻松入门大模型(收藏版)

这几年&#xff0c;AI 几乎成了人人都在谈的话题。 有人在聊大模型&#xff0c;有人在说智能体&#xff0c;有人担心算力不够&#xff0c;也有人被“参数”、“微调”、“多模态”、“RAG”这些词绕得头晕。 结果就是&#xff1a;听了很多&#xff0c;越听越乱。 这篇文章是用尽…...