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={}×tamp={}&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调用企业微信的扫一扫
在企业微信里面新建了一个应用,指向了搭建服务器上Django写的web应用。 web应用需要使用扫描二维码的功能,就使用了大家都评价效果好的微信的扫一扫,事实也证明微信的扫一扫很好,但实现这个功能还是花了自己不少时间,很…...
速盾:CDN和OBS能共用流量包吗?
CDN和OBS是两种不同的云服务,它们在内容分发和存储方面有着不同的功能和优势。虽然它们都可以用于提供高效的内容分发和存储服务,但是它们的流量包是不能共用的。 CDN,即内容分发网络,是一种通过将内容存储在全球分布的服务器上&…...
第8章 利用CSS制作导航菜单
8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计,一般放置在页面的顶部。水平 导航适用性强,几乎所有类型的网站都可以使用,设计难度较低。 如果导航过于普通,无法容纳复杂的信息结构,就需要在…...
C# 集合与泛型
文章目录 前言1.什么是集合?2.非泛型集合(了解即可)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?Docker的优势和应用场景Docker的应用场景包括但不限于: 安装和配置Docker安装Docker引擎配置Docker环境 Docker镜像命令搜索镜像拉取镜像查看本地镜像删除本地镜像 Docker容器命令创建容器启动容器停止容器…...
docker compose - 设置名字
只使用 docker compose up 启动容器,默认名字为当前文件夹的名字 设置 project-name,docker 客户端会显示设置的名字,方便区分 docker compose --project-name webtest up错误: docker compose up --project-name webtest 效果…...
工业拍卖平台、信息发布、租赁商城平台系统适用于全行业解决方案。
工业拍卖平台系统是为工业领域的资产交易、设备处置等提供线上拍卖服务的数字化平台。 主要功能: 拍卖信息发布:平台会展示待拍卖的工业资产详细信息,包括设备的名称、型号、规格、使用年限、生产厂家等基本信息,以及资产的图片…...
一个win32 / WTL下多线程库(CThread类)的使用心得
说是多线程库,其实就是一个单独的.h文件,可以方便的放入WTL/win32工程中。 下载地址:CThread. 里面也简单介绍了 用法。 具体用法,首先自定义一个子线程类继承CThreadImpl<T>,注意他是个模板类。 class CMySu…...
使用wordpress搭建简易的信息查询系统
背景 当前有这样的一个需求,要实现让客户能够自助登录系统查询一些个人的信息,市面上没有特别符合我的需求的产品,经过一段时间的研究,想出了一个用wordpress实现简易信息查询系统,有两种方式。 方式一:使…...
PAT甲级 1076 Forwards on Weibo(30)
文章目录 题目题目翻译深度优先搜索(dfs)宽度优先搜索(bfs)总结 原题链接 题目 题目翻译 微博被称为中国的推特。在微博上,一个用户可能有很多粉丝,也可能关注许多其他用户。因此,通过粉丝关系…...
揭开 gRPC、RPC 、TCP和UDP 的通信奥秘
差异点 特性TCPUDPRPCgRPCHTTP工作层级传输层传输层应用层应用层应用层传输协议面向连接的传输协议无连接传输协议使用 TCP、HTTP 等协议HTTP/2HTTP/1.1, HTTP/2序列化格式字节流数据报文XML、JSON 或自定义Protocol BuffersJSON 或 XML特点可靠的连接传输无连接、快速传输远程…...
使用Web Worker来处理多线程操作,以及如何避免主线程卡顿。
在JavaScript中处理大量数据时,由于JavaScript是单线程的,所有的操作都在主线程上运行,因此处理大量数据可能导致页面卡顿和响应迟缓。为了避免这些问题,可以使用Web Workers来实现多线程操作,允许在后台线程中处理复杂…...
杂谈:业务说的场景金融是什么?
引言:市场格局的转变 在供应短缺的年代,是典型的卖方市场。为了保证稳定供货,买方会提前一段时间下单,也几乎没什么议价能力。卖方只需等着接单就行。 现在很多领域的供应商数量越来越多,而且随着互联网的普及&#…...
在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换
在Chrome开发者工具中,我们可以用 Ctrl [ 和 Ctrl ] 快捷键来切换面板,用起来很方便。 vscode中默认没有这两个快捷键,我们可以通过配置自定义快捷键来实现相同的功能。 配置方法: 1. 按 Ctrl K, Ctrl S 调出快捷键配置面板。…...
【ESP32+MicroPython】硬件控制基础
ESP32是一款功能强大的微控制器,具有多种硬件接口。本文以“ESP32硬件控制”为主题,逐步介绍GPIO(通用输入输出)、PWM(脉宽调制)、ADC(模数转换)等功能的原理与实现,并结…...
Python学习从0到1 day26 第三阶段 Spark ① 数据输入
要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义: Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…...
kafka消费者的消费分区策略有哪些,默认是哪个?
Kafka消费者的分区分配策略主要有以下几种,分别决定了如何将多个分区分配给消费者: 1. Range(范围分配) 描述:将分区连续地分配给消费者。每个消费者负责一段连续的分区。如果有多个消费者,那么消费者会按…...
前端常用时间操作汇总
(1)获取中国标准时间: let now new Date(); // Thu Nov 14 2024 17:13:49 GMT0800 (中国标准时间) (2)获取年份: let year now.getFullYear(); // 2024 (3)获取月份&…...
106. UE5 GAS RPG 使用MVVM
MVVM 是 Model-View-ViewModel的缩写,个人理解它和MVC很相似,有区别的地方在于,在MVC里,Controller会服务多个View,而MVVM里,每个View都拥有一个单独的ViewModel,所以ViewModel相当于精简版的Co…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
