网站设计概念百度h5在线制作免费
在企业微信里面新建了一个应用,指向了搭建服务器上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>
一旦你调通了就容易了。
