加密排序调取第三方算法

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值