Commit edfdd733 by dong

fix

parent 095d4236
...@@ -58,7 +58,6 @@ class IndustryChain1(db.Model): ...@@ -58,7 +58,6 @@ class IndustryChain1(db.Model):
enterprise_num = db.Column(db.Integer, comment='相关全企业表数量') enterprise_num = db.Column(db.Integer, comment='相关全企业表数量')
# 全国企业 # 全国企业
class Enterprise(db.Model): class Enterprise(db.Model):
__tablename__ = "enterprise" __tablename__ = "enterprise"
...@@ -115,9 +114,9 @@ class Enterprise(db.Model): ...@@ -115,9 +114,9 @@ class Enterprise(db.Model):
parti_year = db.Column(db.Integer, doc='高新企业注册年份', comment='高新企业注册年份') # 高新企业注册年份 parti_year = db.Column(db.Integer, doc='高新企业注册年份', comment='高新企业注册年份') # 高新企业注册年份
tbe = db.Column(db.String(32), doc='是否科技型中小企业', comment='是否科技型中小企业') # 是否科技型中小企业 tbe = db.Column(db.String(32), doc='是否科技型中小企业', comment='是否科技型中小企业') # 是否科技型中小企业
tbe_sjmy = db.Column(db.String(32), doc='是否为省级民营科技企业', comment='是否为省级民营科技企业') # 省级民营科技企业 tbe_sjmy = db.Column(db.String(32), doc='是否为省级民营科技企业', comment='是否为省级民营科技企业') # 省级民营科技企业
zjtg = db.Column(db.String(32), doc='是否为专精特新企业', comment='是否为专精特新企业') # 山西专精特工企业 zjtx = db.Column(db.String(32), doc='是否为专精特新企业', comment='是否为专精特新企业') # 山西专精特工企业
zjtg_gjjxjr = db.Column(db.String(32), doc='是否为国家级专精特新小巨人企业', comment='是否为国家级专精特新小巨人企业') # 国家级专精特新小巨人企业 zjtx_gjjxjr = db.Column(db.String(32), doc='是否为国家级专精特新小巨人企业', comment='是否为国家级专精特新小巨人企业') # 国家级专精特新小巨人企业
zjtg_sjxjr = db.Column(db.String(32), doc='是否为省级专精特新小巨人企业', comment='是否为省级专精特新小巨人企业') # 省级专精特新小巨人企业 zjtx_sjxjr = db.Column(db.String(32), doc='是否为省级专精特新小巨人企业', comment='是否为省级专精特新小巨人企业') # 省级专精特新小巨人企业
fianacing = db.Column(db.String(32), doc='是否为有融资企业', comment='是否为有融资企业') # 是否为有融资企业 fianacing = db.Column(db.String(32), doc='是否为有融资企业', comment='是否为有融资企业') # 是否为有融资企业
fianacing_rounds = db.Column(db.String(32), doc='融资轮次', comment='融资轮次') # 融资轮次 fianacing_rounds = db.Column(db.String(32), doc='融资轮次', comment='融资轮次') # 融资轮次
roundid = db.Column(db.Integer, index=True, roundid = db.Column(db.Integer, index=True,
...@@ -234,9 +233,9 @@ class Company(db.Model): ...@@ -234,9 +233,9 @@ class Company(db.Model):
company_info = db.Column(db.Text, doc='公司简介', comment='公司简介') # 公司简介 company_info = db.Column(db.Text, doc='公司简介', comment='公司简介') # 公司简介
sxmon = db.Column(db.String(32), doc='是否山西民营100强', comment='是否山西民营100强') # 是否山西民营100强(2019年) sxmon = db.Column(db.String(32), doc='是否山西民营100强', comment='是否山西民营100强') # 是否山西民营100强(2019年)
zjtg = db.Column(db.String(32), doc='是否为山西专精特新企业', comment='是否为山西专精特新企业') # 山西专精特工企业 zjtx = db.Column(db.String(32), doc='是否为山西专精特新企业', comment='是否为山西专精特新企业') # 山西专精特工企业
zjtg_gjjxjr = db.Column(db.String(32), doc='是否为国家级专精特新小巨人企业', comment='是否为国家级专精特新小巨人企业') # 国家级专精特新小巨人企业 zjtx_gjjxjr = db.Column(db.String(32), doc='是否为国家级专精特新小巨人企业', comment='是否为国家级专精特新小巨人企业') # 国家级专精特新小巨人企业
zjtg_sjxjr = db.Column(db.String(32), doc='是否为省级专精特新小巨人企业', comment='是否为省级专精特新小巨人企业') # 省级专精特新小巨人企业 zjtx_sjxjr = db.Column(db.String(32), doc='是否为省级专精特新小巨人企业', comment='是否为省级专精特新小巨人企业') # 省级专精特新小巨人企业
unicorn = db.Column(db.String(32), doc='独角兽企业', comment='独角兽企业') # 独角兽企业 unicorn = db.Column(db.String(32), doc='独角兽企业', comment='独角兽企业') # 独角兽企业
dengl = db.Column(db.String(32), doc='瞪羚', comment='瞪羚') # 瞪羚 dengl = db.Column(db.String(32), doc='瞪羚', comment='瞪羚') # 瞪羚
hncode = db.Column(db.String(32), doc='高企证书编号', comment='高企证书编号') # 高企证书编号 hncode = db.Column(db.String(32), doc='高企证书编号', comment='高企证书编号') # 高企证书编号
......
alembic==1.3.2
alibabacloud-credentials==0.1.4
alibabacloud-endpoint-util==0.0.3
alibabacloud-openapi-util==0.1.4
alibabacloud-tea==0.2.6
alibabacloud-tea-openapi==0.2.5
alibabacloud-tea-util==0.3.4
alibabacloud-vod20170321==2.0.2
aliyun-python-sdk-core==2.13.31
aliyun-python-sdk-core-v3==2.13.11
aliyun-python-sdk-dysmsapi==1.0.0
aliyun-python-sdk-vod==2.15.12
asn1crypto==0.24.0
attrs==19.1.0
Automat==0.7.0
blinker==1.4
boto==2.49.0
boto3==1.12.39
botocore==1.15.39
cachelib==0.1.1
certifi==2019.11.28
cffi==1.12.3
chardet==3.0.4
Click==7.0
constantly==15.1.0
cryptography==3.4.7
cssselect==1.1.0
docker==4.4.4
docutils==0.15.2
elasticsearch==7.12.0
english==2020.7.0
filetype==1.0.7
Flask==1.1.1
Flask-Cors==3.0.10
Flask-Mail==0.9.1
Flask-Migrate==2.7.0
Flask-QiniuStorage==0.9.5
Flask-Script==2.0.6
Flask-Session==0.3.2
Flask-SQLAlchemy==2.5.1
Flask-WTF==0.14.3
hyperlink==19.0.0
idna==2.8
incremental==17.5.0
itsdangerous==1.1.0
Jinja2==2.10.1
jmespath==0.9.5
lazy-object-proxy==1.4.2
lxml==4.4.2
Mako==1.1.0
MarkupSafe==1.1.1
monotonic==1.5
neotime==1.7.4
numpy==1.18.0
packaging==20.9
pandas==1.1.0
pansi==2020.7.3
parsel==1.5.2
prompt-toolkit==2.0.10
py2neo==4.3.0
pyasn1==0.4.7
pyasn1-modules==0.2.6
pycparser==2.19
PyDispatcher==2.0.5
Pygments==2.3.1
PyHamcrest==1.9.0
PyMySQL==1.0.2
pyOpenSSL==19.0.0
pyparsing==2.4.7
python-dateutil==2.8.1
python-editor==1.0.4
pytz==2019.2
pywin32==227
qiniu==7.3.0
queuelib==1.5.0
redis==3.3.8
requests==2.22.0
s3transfer==0.3.3
scipy==1.4.1
Scrapy==1.7.3
service-identity==18.1.0
six==1.15.0
smart-open==1.11.1
soupsieve==1.9.5
SQLAlchemy==1.3.12
sqlparse==0.3.0
Twisted==19.7.0
typed-ast==1.4.0
urllib3==1.24.3
w3lib==1.21.0
wcwidth==0.1.7
websocket-client==0.58.0
Werkzeug==0.16.0
wrapt==1.11.2
WTForms==2.3.3
xlrd==1.2.0
XlsxWriter==1.3.8
xlwt==1.3.0
zope.interface==4.6.0
alembic==1.7.4
aliyun-python-sdk-core==2.13.35
aliyun-python-sdk-kms==2.15.0
aliyun-python-sdk-vod==2.15.12
altgraph==0.16.1
amqp==5.1.1
APScheduler==3.9.1
asgiref==3.4.1
asn1crypto==0.24.0
atomicwrites==1.4.0
attrs==21.2.0
Automat==20.2.0
backports.csv==1.0.7
backports.zoneinfo==0.2.1
billiard==3.6.4.0
blinker==1.4
buildozer==0.39
cached-property==1.5.2
cachelib==0.4.1
celery==5.0.5
certifi==2018.8.24
cffi==1.15.0
chardet==3.0.4
click==7.1.2
click-didyoumean==0.3.0
click-plugins==1.1.1
click-repl==0.3.0
colorama==0.4.1
constantly==15.1.0
construct==2.5.3
coreapi==2.3.3
coreschema==0.0.4
cpca==0.5.5
crcmod==1.7
cryptography==35.0.0
cssselect==1.0.3
curve==0.1.0
cycler==0.10.0
Cython==0.29.13
dataclasses==0.8
defusedxml==0.6.0
diff-match-patch==20181111
distlib==0.3.7
Django==2.2.16
django-ckeditor==5.8.0
django-comment-migrate==0.1.5
django-cors-headers==2.5.3
django-crispy-forms==1.7.2
django-crontab==0.7.1
django-filter==2.1.0
django-formtools==2.1
django-import-export==1.2.0
django-js-asset==1.2.2
django-ranged-response==0.2.0
django-redis==4.10.0
django-reversion==3.0.4
django-timezone-field==4.2.3
djangorestframework==3.12.2
djangorestframework-jwt==1.11.0
dnspython==1.16.0
docker==5.0.3
document==1.0
docutils==0.15.2
docx==0.2.4
echarts==0.0.0
elasticsearch==7.15.1
english==2020.7.0
et-xmlfile==1.0.1
excel2json==1.0.1
fdfs-client-py==1.2.6
filelock==3.4.1
filetype==1.0.8
Flask==0.10.1
Flask-APScheduler==1.12.3
Flask-Cors==3.0.10
Flask-Docs==0.5.8
Flask-Mail==0.9.1
Flask-Migrate==2.7.0
Flask-QiniuStorage==0.9.5
Flask-Script==2.0.6
Flask-Session==0.4.0
Flask-SQLAlchemy==2.5.1
Flask-WTF==1.0.0
fsspec==2022.1.0
future==0.17.1
geographiclib==1.52
geopy==2.2.0
gevent==22.10.2
greenlet==2.0.2
haystack==0.42
httplib2==0.12.3
hyperlink==18.0.0
idna==2.7
importlib-metadata==4.8.3
importlib-resources==5.4.0
incremental==17.5.0
inflection==0.5.1
iniconfig==1.1.1
interchange==2021.0.3
itsdangerous==0.24
itypes==1.1.0
jdcal==1.4.1
Jinja2==2.10
jmespath==0.10.0
Kivy==1.11.1
kivy-deps.angle==0.1.9
kivy-deps.glew==0.1.12
kivy-deps.gstreamer==0.1.17
kivy-deps.sdl2==0.1.22
Kivy-examples==1.11.1
Kivy-Garden==0.1.4
kiwisolver==1.1.0
kombu==5.1.0
line==0.8.2
lxml==4.4.2
macholib==1.11
Mako==1.1.5
Markdown==3.3.4
MarkupSafe==1.0
matplotlib==3.1.2
mongoengine==0.24.2
monotonic==1.6
more-itertools==7.2.0
mutagen==1.42.0
mysql==0.0.2
mysqlclient @ file:///C:/Users/zy130/Downloads/mysqlclient-1.4.6-cp36-cp36m-win32.whl
Naked==0.1.31
ndg-httpsclient==0.5.1
neo4j-driver==1.6.2
neotime==1.0.0
nodejs==0.1.1
numpy==1.17.4
odfpy==1.4.0
opencv-python==4.5.3.56
openpyxl==2.6.3
optional-django==0.1.0
oss2==2.15.0
packaging==21.0
pandas==1.1.5
pansi==2020.7.3
pbr==4.2.0
pefile==2019.4.18
peppercorn==0.6
pexpect==4.7.0
Pillow==8.1.0
platformdirs==2.4.0
pluggy==1.0.0
prettytable==0.7.2
prompt-toolkit==3.0.36
psutil==5.8.0
psycopg2==2.8
ptyprocess==0.6.0
py==1.11.0
py2neo==4.1.1
pyahocorasick==1.4.4
pyasn1==0.4.4
pyasn1-modules==0.2.2
pycparser==2.19
pycryptodome==3.11.0
pydantic==1.9.2
PyDispatcher==2.0.5
pyecharts==1.2.0
pyecharts-jupyter-installer==0.0.3
Pygments==2.2.0
PyHamcrest==1.9.0
PyInstaller==3.4
PyJWT==1.7.1
pymongo==3.11.3
PyMySQL==0.9.3
pyOpenSSL==18.0.0
pyparsing==2.4.5
pypinyin==0.49.0
pypiwin32==223
pyquery==1.4.0
pytest==6.2.5
python-crontab==3.0.0
python-dateutil==2.8.1
python-docx==0.8.11
python-dotenv==0.20.0
python-ptrace==0.9.3
pytz==2021.1
pytz-deprecation-shim==0.1.0.post0
pywin32==227
pywin32-ctypes==0.2.0
PyYAML==5.1.2
qiniu==7.5.0
queuelib==1.5.0
redis==3.5.3
requests==2.19.1
rest-framework-auth0==0.5.0
rsa==4.0
ruamel.yaml==0.17.32
ruamel.yaml.clib==0.2.7
selenium==3.14.1
service-identity==17.0.0
sh==1.12.14
shellescape==3.8.1
six==1.15.0
SQLAlchemy==1.4.25
sqlparse==0.4.1
stevedore==1.29.0
tablib==0.13.0
thrift==0.11.0
toml==0.10.2
torch-vision==0.1.6.dev0
tqdm==4.32.1
Twisted==19.7.0
twisted-iocpsupport==1.0.2
typing-extensions==3.10.0.2
tzdata==2022.1
tzlocal==4.2
ua-parser==0.18.0
UNKNOWN==0.0.0
uritemplate==3.0.0
urllib3==1.22
user-agents==2.2.0
vine==5.0.0
virtualenv==20.17.1
virtualenv-clone==0.3.0
virtualenvwrapper==4.8.2
wcwidth==0.2.5
websocket-client==1.2.1
Werkzeug==0.14.1
win10toast==0.9
WTForms==3.0.0
xadmin-py3==2.0.4
xlrd==2.0.1
XlsxWriter==3.0.2
xlutils==2.0.0
xlwings==0.26.3
xlwt==1.3.0
xmltodict==0.13.0
zipp==3.6.0
zope.event==4.6
zope.interface==4.6.0
import os
import os
import json
import base64
import requests
import hashlib
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
class Signature:
'''
爱城市网扫码登录
https://open.icity24.cn/
'''
def __init__(self, params):
# self.url = "https://auth.icity24.cn/icity/auth2.0/token"
self.params = params
self.privetkey_file_path = os.path.dirname(os.path.dirname(__file__)) + "/utils/json/ty_rsa"
self.privetkey = self.read_privet_key()
self.unsign_data = self.generate_sign(self.params)
# 读取私钥
def read_privet_key(self):
with open(self.privetkey_file_path, mode="r", encoding="utf-8") as f:
privetkey = "".join(f.readlines()[1:-1])
privetkey = privetkey.encode(encoding='utf-8')
return privetkey
# HASH-sha256
def generate_sign(self, param):
'''生成hash'''
# 按ASCII拼接字符串
stringA = "&".join([f"{k}={param[k]}" for k in sorted(param)])
# SHA256加密
hash_sha256 = hashlib.sha256(stringA.encode('utf8')).hexdigest()
return hash_sha256
# 生成签名
def gen_sign(self, secret=None):
"""
生成签名:是直接读取私钥的方式和未加签的数据
:return: 签名数据
"""
rsaKey = RSA.importKey(base64.b64decode(self.privetkey), passphrase=secret)
signer = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(self.unsign_data.encode('utf8'))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
return signature.decode()
'''1、获取token'''
appid = "fea79d4c-9906-408c-86a5-8a092fda49b3"
code = "c417598b-5892-4217-81be-c3b6080e9fa1"
# code换取token
params = {
'appid': appid, # 爱城市网appID
'code': code, # 授权成功后产生的code
'grant_type': "authorization_code"
}
# 获取签名sign
s = Signature(params)
sign_value = s.gen_sign()
params["sign"] = sign_value
# 认证获取token
resp = requests.post(url="https://auth.icity24.cn/icity/auth2.0/token", data=params)
resp = json.loads(resp.text)
token = resp["token"]
'''2、token获取baseinfo'''
params = {
'appid': appid, # 爱城市网appID
'auth_token': token, # token
}
# 获取新签名sign
s = Signature(params)
sign_value = s.gen_sign()
params["sign"] = sign_value
# 获取基本信息
resp = requests.post(url="https://auth.icity24.cn/icity/auth2.0/get_base_info", data=params)
resp = json.loads(resp.text)
mobile_phon = resp["mobile_phon"] # 手机号
import os
import os
import json
import base64
import requests
import hashlib
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
"""
function 2:
openssl genrsa -out ./myPrivateKey.pem -passout pass:"密码" -des3 2048
openssl rsa -pubout -in ./myPrivateKey.pem -passin pass:"密码" -out ./myPublicKey.pem
"""
def gen_sig_(unsign_data, secret):
"""
两种方式生成签名:
这是第一种
1. 打开文件方式,见所有被注释的部分,文件为.pem
2. passphrase 的参数为文件加密的密码
:return: 签名数据
"""
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
doc = os.path.join(path, 'myPrivateKey.pem')
with open(doc) as pk:
key_data = pk.read()
rsaKey = RSA.importKey(key_data, passphrase="密码")
signer = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(unsign_data.encode('utf8'))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
print(signature)
return signature
def verify_sign_(data, sign, secret):
"""
读取公钥文件,验签
"""
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
doc = os.path.join(path, 'myPrivateKey.pem')
with open(doc) as pk:
key_data = pk.read()
rsaKey = RSA.importKey(key_data, passphrase=b'mima')
verifier = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(data.encode('utf8'))
is_verify = verifier.verify(digest, base64.b64decode(sign))
print(is_verify)
return is_verify
def gen_sign(private_key, unsign_data, secret):
"""
两种方式生成签名:
1. 是直接读取私钥的方式和未加签的数据
:return: 签名数据
"""
rsaKey = RSA.importKey(base64.b64decode(private_key), passphrase=secret)
signer = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(unsign_data.encode('utf8'))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
return signature.decode()
def verify_sign(pubkey, data, sign, secret):
"""
直接传公钥方式
"""
rsaKey = RSA.importKey(base64.b64decode(pubkey), passphrase=secret)
verifier = Signature_pkcs1_v1_5.new(rsaKey)
digest = SHA256.new()
digest.update(data.encode('utf8'))
is_verify = verifier.verify(digest, base64.b64decode(sign))
print(is_verify)
return is_verify
def generate_sign(param):
'''生成hash'''
stringA = "&".join([f"{k}={param[k]}" for k in sorted(param)])
# SHA256加密
hash_sha256 = hashlib.sha256(stringA.encode('utf8')).hexdigest()
return hash_sha256
if __name__ == '__main__':
# 读取私钥
with open("ty_rsa", mode="r", encoding="utf-8") as f:
privetkey = "".join(f.readlines()[1:-1])
privetkey = privetkey.encode(encoding='utf-8')
# 生成hash
params = {
'appid': "fea79d4c-9906-408c-86a5-8a092fda49b3", # 爱城市网appID
'code': "c417598b-5892-4217-81be-c3b6080e9fa1", # 授权成功后产生的code
'grant_type': "authorization_code"
}
hash_value = generate_sign(params)
# 签名
sign_value = gen_sign(privetkey, hash_value, None)
params["sign"] = sign_value
# 换取token
resp = requests.post(url="https://auth.icity24.cn/icity/auth2.0/token", data=params)
resp = json.loads(resp.text)
print(resp)
if resp["code"] != 1000:
print("验证失败")
-----BEGIN PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIICWgIBAAKBgQCbhcu70wIoXnVhhGimrJWaQ1y5M3F8oDM6maLSjiVmaN0Kc7AN
EFF+jOtiN3C0xNxyaAINxi0J53Az1ezYIsa83vfZT0J0W53LtDXmfJQkuTFF333Z
PFZheRQqDrH08mDEL2S/aLgll1GyrKYP8IEO39xvkEuoAHK1Qcsjb4VQiQIDAQAB
An8m4UwNqLLhZLvzpSaEhKDh7/U+V54HigVEoSQTf3XaJF0eP83DdlDpUlGGPFXw
20ZBU78vsluQHkvuqYyMfCUyrrTgZYCCUgguWt0nbdc8YcFKiXn2P8ki5pEzt4mV
UwGoWIB7WQ4wVscghwE+6uFhi+0IzW3C2eigg3jqDIUBAkEAwCuda9LRlZIn2PDQ
CvEB574BNcU3vvaRemK5WnZ/Iep23ENf0nyE2CLgELxcu4aY6vZSNvrUD2T9+Gub
PYd8HwJBAM8t/3nsA3vhok8XDUWoee18k36mopZiRT/hB5FGQl4aX+p+EDAVeytQ
9WNim4R5RD+rym92ktJfzZj50hxBnlcCQCPZfxqYT6T5iRl9gzInV9WlqpAfZJDp
aqZMOIvZw0nOdbINl5iqxhWUG/zDRwFs0KY0oY3EKT9d9cscN++4kL0CQQC33Ll6
SSL6YM67Y9jKde7m/QSkhFuMHGAahalCmtixTLTMlN3m3ll1op5zegJMOZaA7wNz
kgZQnucGGMcHfpB3AkAr249EUriJXa8MfzolpCq2aWD974vFOINgz7GMj+B/a0fO
jzQ9j/fWp7330spy1lllWuVSYyA2OuhiH7HZHSSg
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu8FSZc7KcJcHXXaUIkFBj59q8
SdFZ6lYwROzPpNh5dxNa0/Umcxfk7Wg/vHDmxN/4Nk/KzpuQjUhUYl8ot15ZQbEt
/0kmjlBtZQk5lno/6FxnRlK+OtqW3uCG6nPLTZNGOfzQsaSioXg5OfK3a1bIGXXX
NTSlC+xC0iGfury6sQIDAQAB
-----END PUBLIC KEY-----
# 爱城市网app,PC网站扫码登录指南
# 爱城市网app,PC网站扫码登录指南
''''''
'''1、app扫码授权'''
# 1、 打开认证界面(扫码界面),第三方需要在PC网站拼接地址,打开扫码页面。可以使用ifream形式,并自定义样式
# 具体请求如下:
# url(GET) https://new3.icity24.cn/platformcenter/scan-code-pc/index.html
# 参数
# 名字 类型 是否必需 最大长度 描述 示例
# app_id String 是 32 爱城市网分配给第三方应用的AppId fea79d4c-9906-408c-86a5-8a092fda49b3
# redirect_uri String 是 - 授权成功后回调页面,需转义,此url的域名必须和约定2中的一致 https://www.baidu.com?XXX=XXX
# scope String 是 - 接口权限值,多个以","分隔 base_info,auth_user
# Result 备注 用户授权成功后会跳转至开发者定义的回调页面,爱城市会在回调页面地址后面
# 拼接app_id,code,open_id,scope等参数。若用户取消授权,将关闭认证页面。
# 示例:https://auth.icity24.cn/icity/auth2.0/authorize?app_id=7f4ba7d2-0c44-4c65-866d-7f5e754360a3&redirect_uri=http%3A%2F%2Ftyzhaoshanggraph.industrychain.online&scope=base_info,auth_user
'''2、code -换取-> token'''
# 应用在拿到code之后应尽快去爱城市授权中心换取token, code过期时间为五分钟,过期将不可在用,且一个code只能使用一次。
# url(POST) https://auth.icity24.cn/icity/auth2.0/token
# 名字 类型 是否必需 最大长度 描述 示例
# app_id String 是 32 爱城市网分配给第三方应用的AppId fea79d4c-9906-408c-86a5-8a092fda49b3
# code String 是 32 授权成功后产生的code c417598b-5892-4217-81be-c3b6080e9fa1
# grant_type String 是 - authorization_code或者refresh_token,其中authorization_code代表使用code获取,refresh_token代表使用refresh_token authorization_code
# refresh_token String 是 - 当token过期时可用refresh_token刷新获取新token c417598b-5892-4217-81be-c3b6080e9fa1
# sign String 是 - 签名,具体签名规则见附录 VJMIgEqAIe6928LVvKC8VFHHZhmW0WHVfjqTZpN8H5fhOlB+raGnMZGfRfPhv+LfJ236mq/lCSKIS14uS0cc7PvBFLlX0ks//aLdPySzsdsziWWPsPh9Jt2Wu/Z/yrCRjK1Ev4PVbXmOw2PDvWti2e0pO0mscgOiwPTHKgAaL84=
# 签名算法
import hashlib
def generate_sign(param):
'''生成hash'''
stringA = "&".join([f"{k}={param[k]}" for k in sorted(param)])
# SHA256加密
hash_sha256 = hashlib.sha256(stringA.encode('utf8')).hexdigest()
return hash_sha256
params = {
'appid': "fea79d4c-9906-408c-86a5-8a092fda49b3", # 爱城市网appID
'code': "c417598b-5892-4217-81be-c3b6080e9fa1", # 授权成功后产生的code
'grant_type': "authorization_code"
}
print(generate_sign(params))
# RSASSA-PKCS1-V1_5-SIGN使用私钥对hash签名
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment