钉钉登入 -- 钉钉扫码登入 SDK后端请求报 “签名校验失败“,无法使用,后面封装的方法 python

import base64
import hmac
import time
import requests
from hashlib import sha256


# 钉钉扫码登入
class DingScanningCodeLogin(object):
    # 钉钉后台里的AppKey和AppSecret
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.timestamp = str(int(round(time.time()))) + '000'
        self.url_1 = "https://oapi.dingtalk.com/sns/getuserinfo_bycode"
        self.url_2 = "https://oapi.dingtalk.com/gettoken"
        self.url_3 = 'https://oapi.dingtalk.com/topapi/user/getbyunionid'
    # tmp_auth_code是前端请求钉钉后回调在url上拼接的code
    def get_user_according_to_sns_info(self, tmp_auth_code, url=None):
        if not url:
            url = self.url_1

        signature = base64.b64encode(
            hmac.new(self.app_secret.encode(encoding="utf-8"),
                     self.timestamp.encode(encoding="utf-8"),
                     digestmod=sha256).digest()).decode(encoding='utf-8')

        params = {'accessKey': self.app_key, 'timestamp': self.timestamp, 'signature': signature}

        d_data = requests.post(url=url, params=params, json={'tmp_auth_code': tmp_auth_code})
        print(d_data)
        if not int(d_data.json().get('errcode')) == 0:
            raise Exception(d_data.json().get("errmsg"))

        return d_data.json().get("user_info")
    # 这里可以加一层redis缓存access_token
    def get_access_token(self, url=None):
        if not url:
            url = self.url_2

        params = {"appkey": self.app_key, "appsecret": self.app_secret}

        d_data = requests.get(url=url, params=params)
        if not int(d_data.json().get("errcode")) == 0:
            raise Exception(d_data.json().get("errmsg"))
        return {"access_token": d_data.json().get("access_token"), "expires_in": d_data.json().get("expires_in")}

    def get_user_id(self, token, union_id, url=None):
        if not url:
            url = self.url_3

        d_data = requests.post(url=url, params={'access_token': token}, json={'unionid': union_id})
        if not int(d_data.json().get("errcode")) == 0:
            raise Exception(d_data.json().get("errmsg"))

        return d_data.json().get("result")

因为钉钉sdk调用一直无法请求,报校验失败换多次方法没解决,赶时间就没继续研究sdk源码。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值