from trumputils.httputils import ClientRequest
import base64
import asyncio
import hashlib
import json
from collections import OrderedDict
base_url = "https://dev.zhilesong.com"
client = ClientRequest()
#json排序
async def sortSource(params):
params = OrderedDict(sorted(params.items()))
result = ""
for key, value in params.items():
result += f'|{key}={value if value else ""}'
if result.find("|") == 0:
result = result[1:]
return result
# base64加密
async def base64Query(string):
base64_string = base64.b64encode(string.encode("utf-8"))
base64_string = str(base64_string,'utf-8')
return base64_string
# md5加密
async def md5(string):
md5_string = hashlib.md5(string.encode(encoding='UTF-8')).hexdigest()
return str(md5_string)
# 营销券列表查询 (GET)
async def get_marketing_list():
post_url = "/v1/mkm/coupon/queryCouponList_sign?reqData="
#手机号
mblNo = "18399917685"
#可选,营销活动编号
mktId = "2018001"
#可选,营销券模板编号
prizeId = "1001"
#可选,券状态, D:可用, U:已用, E:过期
bonSts = ""
#可选,券实例Id
bonId = ""
#签名
sign = "3587db6754e14690a0d38023630577aa"
#渠道code
channel_code = "hq"
params = "mblNo="+mblNo+"&mktId="+mktId+"&prizeId="+prizeId+"&bonSts="+bonSts+"&bonId="+bonId
sourceSignStr = params+"&"+sign
print("签名原串:",sourceSignStr)
params_md5 = await md5(sourceSignStr)
print("md5加密串:",params_md5)
params = params+"&sign="+params_md5
print("base64原串:",params)
params = await base64Query(params)
print("base64之后串:",params)
url = base_url+post_url+params
print("url:",url)
result = await client.get(url,headers={"channel-code":channel_code})
print(result)
result_text = await result.text()
return result_text
# 订单可用营销券查询 (GET)
async def order_marketing_available():
post_url = "/v1/mkm/coupon/queryOrderUseableCouponList_sign?reqData="
# 手机号
mblNo = "18399917685"
# 主产品id
productId = "170614172906508137"
# 订单金额, 为空则默认为0
orderAmount = ""
# 签名
sign = "3587db6754e14690a0d38023630577aa"
# 渠道code
channel_code = "hq"
params = "mblNo=" + mblNo + "&productId=" + productId + "&orderAmount=" + orderAmount
sourceSignStr = params + "&" + sign
print("签名原串:", sourceSignStr)
params_md5 = await md5(sourceSignStr)
print("md5加密串:", params_md5)
params = params + "&sign=" + params_md5
print("base64原串:", params)
params = await base64Query(params)
print("base64之后串:", params)
url = base_url + post_url + params
result = await client.get(url, headers={"channel-code": channel_code})
result_text = await result.text()
return result_text
# 营销券发放 (POST)
async def marketing_issue():
# 营销活动id
mktId= "2018001"
# 营销奖励id
prizeId = "1001"
# 用户手机号
mblNo = "18399917685"
channel_sign = "3587db6754e14690a0d38023630577aa"
market_dict = {}
market_dict["mktId"] = mktId
market_dict["prizeId"] = prizeId
market_dict["mblNo"] = mblNo
params =await sortSource(market_dict)
params = params+"|"+channel_sign
print("签名后的串:",params)
sign = await md5(params)
print("签名后的MD5",sign)
market_dict["sign"]=sign
print("最终签名后的body:",market_dict)
post_url = "/v1/mkm/prize/issue"
url = base_url + post_url
result = await client.post(url,json.dumps(market_dict),headers={"Content-Type": "application/json","channel-code":"hq"})
result_text = await result.text()
return result_text
#营销券状态确认(POST)
async def marketing_status_confirm():
# 营销券实例id
bonid = "123"
# 锁定订单号
orderNo = "123"
#F: failed, 订单失败释放; S: success, 订单成功, 确认使用
status = "S"
#签名
channel_sign = "3587db6754e14690a0d38023630577aa"
market_dict = {}
market_dict['bonid'] = bonid
market_dict['orderNo'] = orderNo
market_dict['status'] = status
params =await sortSource(market_dict)
params = params+"|"+channel_sign
print("签名后的串:",params)
sign = await md5(params)
print("签名后的MD5:",sign)
market_dict['sign'] = sign
print("最终签名后的body:",market_dict)
post_url = "/v1/mkm/coupon/confirmCouponStatus"
url = base_url+post_url
channel_code = "hq"
result = await client.post(url,json.dumps(market_dict),headers={"Content-Type":"application/json","channel-code":channel_code})
print(result)
result_text = await result.text()
return result_text
#营销券锁定(POST)
async def marketing_lock():
# 营销券实例id
bonid = "123"
# 锁定订单号
orderNo = "123"
# 签名
channel_sign = "3587db6754e14690a0d38023630577aa"
market_dict = {}
market_dict['bonid'] = bonid
market_dict['orderNo'] = orderNo
params = await sortSource(market_dict)
params = params+"|"+channel_sign
print("签名后的串:", params)
sign = await md5(params)
print("签名后的MD5:", sign)
market_dict['sign'] = sign
print("最终签名的body:",market_dict)
post_url = "/v1/mkm/coupon/lockCouponWithOrder"
url = base_url + post_url
channel_code = "hq"
result = await client.post(url, json.dumps(market_dict),
headers={"Content-Type": "application/json", "channel-code": channel_code})
result_text = await result.text()
return result_text
if __name__:
loop = asyncio.get_event_loop()
rs = loop.run_until_complete(marketing_lock())
print(rs)
loop.close()
import aiohttp
import asyncio
import uuid
import logging
from logging.handlers import RotatingFileHandler
import os
import traceback
# 10 seconds default timeout
DEFAULT_TIMEOUT = 10
class ClientRequest:
def __init__(self,
name=None,
log_file='/srv/log/httputils.log',
log_maxbytes=104857600,
log_backup_count=10,
log_level=logging.INFO,
log_formatter=logging.Formatter(fmt='%(asctime)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')):
if name is None:
name = uuid.uuid1().hex
dir = os.path.dirname(log_file)
if not os.path.isdir(dir):
os.makedirs(dir)
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
ch = RotatingFileHandler(log_file, maxBytes=log_maxbytes, backupCount=log_backup_count)
ch.setLevel(log_level)
ch.setFormatter(log_formatter)
logger.addHandler(ch)
self.logger = logger
async def post(self, url, data, headers=None, timeout=DEFAULT_TIMEOUT):
req_id = uuid.uuid1().hex
self.logger.info(f"post[{req_id}]:begin: {url}\t{data}\t{headers}")
async with aiohttp.ClientSession(headers=headers) as session:
try:
result = await session.post(url, timeout=120, data=data)
result_text = await result.text()
except asyncio.TimeoutError as e:
self.logger.info(f"post[{req_id}]:end: err:[Connection timeout(timeout={timeout})]")
raise (e)
except Exception as e:
self.logger.error(f"post[{req_id}]:end: err:[{traceback.format_exc()}]")
raise (e)
self.logger.info(f"post[{req_id}]:end: content=[{result_text}], result=[{result}] ")
return result
async def get(self, url, headers=None, timeout=DEFAULT_TIMEOUT, **kwargs):
req_id = uuid.uuid1().hex
self.logger.info(f"get[{req_id}]:begin: {url}\t{headers}")
async with aiohttp.ClientSession(headers=headers) as session:
try:
result = await session.get(url, data=kwargs, timeout=timeout)
result_text = await result.text()
except asyncio.TimeoutError as e:
self.logger.info(f"get[{req_id}]:end: err:[Connection timeout(timeout={timeout})]")
raise (e)
except Exception as e:
self.logger.error(f"get[{req_id}]:end: err:[{traceback.format_exc()}]")
raise (e)
self.logger.info(f"get[{req_id}]:end: content=[{result_text}], result=[{result}] ")
return result