| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #coding=utf-8
- import hashlib
- import json
- import random
- import requests
- import time
- from collections import OrderedDict
- from Crypto.PublicKey import RSA
- from Crypto.Hash import MD5, SHA1, SHA256
- from Crypto.Signature import PKCS1_v1_5 as Signature_PKC
- import base64
- from requests_toolbelt.multipart.encoder import MultipartEncoder
- # 接口调用地址,
- # 正式环境:https://oapi.acsign.cn
- # 沙箱环境域名:https://prev.acsign.cn
- #构建post请求
- class HttpUtils(object):
- # 构建请求头
- @staticmethod
- def doPOST(url, reqBodyData, appId, appKey, pathstr=None, file_key=None, file_name=None):
- accept = "*/*"
- # 请求的与实体对应的MIME信息
- contentType = "multipart/form-data; charset=UTF-8"
-
- # 对请求的url进行签名
- accountsApiUrl = url
- # 毫米时间戳获取
- t = time.time()
- # 毫秒级时间戳
- _timestamp = str(round(t * 1000) + 1000 * 60)
- # 按照阿拉伯字符排序
- jsonstr = json.dumps(reqBodyData, sort_keys=True,separators=(',',':'), ensure_ascii=False)
- data = dict()
- data["appId"] = appId
- data["timestamp"] = _timestamp
- data["bizData"] = jsonstr
- #计算md5值
- m = hashlib.md5()
- m.update(jsonstr.encode('utf-8'))
- # 二进制数据字符串值
- md5_str = m.hexdigest()
- sign_str = '%s%s%s%s' % (jsonstr, md5_str, appId, _timestamp)
- # 打印签名值
- private_keyBytes = base64.b64decode(appKey)
- rsakey = RSA.importKey(private_keyBytes)
- signer = Signature_PKC.new(rsakey)
- # 根据SHA256算法处理签名内容data
- sha_data = SHA1.new(sign_str.encode("utf-8"))
- # 私钥进行签名
- signature = base64.b64encode(signer.sign(sha_data))
-
- if(pathstr != None):
- m = MultipartEncoder(
- fields={
- 'appId': appId,
- 'bizData': jsonstr,
- 'timestamp': _timestamp,
- 'Content-Type': 'application/octet-stream',
- 'type': 'application/octet-stream',
- file_key: (file_name, open(pathstr, 'rb'), 'application/octet-stream')
- },
- boundary='-----------------------------' + str(random.randint(1e28, 1e29 - 1)))
- else:
- m = MultipartEncoder(
- fields={
- 'appId': appId,
- 'bizData': jsonstr,
- 'timestamp': _timestamp,
- 'Content-Type': 'application/octet-stream',
- 'type': 'application/octet-stream'
- },
- boundary='-----------------------------' + str(random.randint(1e28, 1e29 - 1)))
- #添加文件
- # 构建请求头
- headers = {
- 'Content-Type': contentType,
- 'Accept': accept,
- 'sign': signature
- }
- headers['Content-Type'] = m.content_type
- r = requests.post(accountsApiUrl, data=m, headers=headers)
- return r.text
|