# -*- coding: utf-8 -*- # !/usr/bin/env python """ 目前三江和朗鑫支持对中天物业的南向接口 """ import datetime import hashlib import json import logging from collections import OrderedDict import requests from django.conf import settings logger = logging.getLogger(__name__) """ 对接中天测试代码 """ """ payload 相关 参数名称 参数类型 必选 参数说明 level string 是 告警级别:1、普通;2、重要;3、严重 eventCode string 是 告警类型编码 description string 是 事件描述 createTime string 是 创建时间 deviceCode string 是 设备编号 groupName string 是 地址分组名称 address string 是 地址信息 orderNo string 是 订单编号 backMoney float 否 退款金额 backCoins float 否 退款金币 """ # prod_url = "http://app.ztcnwy.com/api/gateway" prod_url = "http://119.27.178.214/api/gateway" test_url = "http://apptest.ztcnwy.com/api/gateway" # internal_test_url = "http://211.159.224.10/api/test/zhongtian" if settings.DEBUG: app_key = "37097f1ac2214d7ea735518d0181f33a" secret = "b55a8167c0dd4b438e0fa70b2b70ab9a" url = test_url else: app_key = "fa801fe50d8b43d0b9c0381fbc2dacc8" secret = "71d0d180f1e644a68f40b58208d1b1ca" url = prod_url def concat(secret, payload): """ 拼接签名准备文本, 格式为 secret + 升序的字典文本keyvalue直接拼接 + secret """ raw = secret for _ in sorted(payload.iteritems()): raw += ''.join(_) raw += secret return raw def encode(text): return hashlib.md5(text).hexdigest().upper() def sign(secret, payload): return encode(concat(secret, payload)) def get_payload(orderNo, eventCode, deviceCode, groupName, address, refundable = False, level = '1', description = '', **kwargs): currentDateTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') data = OrderedDict( [ ("level", level), ("eventCode", eventCode), ("description", description), ("createTimeStr", currentDateTime), ("deviceCode", deviceCode), ("groupName", groupName), ("address", address), ("orderNo", orderNo), ("refundable", refundable) ] ) for k, v in kwargs.iteritems(): data[k] = v payload = { "Method": "chargeapi.chargereturn", "AppKey": app_key, "Format": "Json", "TimeStamp": currentDateTime, "Data": json.dumps(data, separators = (',', ':')) } signed = sign(secret, payload) payload['Sign'] = signed return payload def send(payload): return requests.post(url, data = payload, timeout = 15).json() def report_zhongtian_service_complete(event_code, record, orderNo, deviceCode, groupName, address, actualNeedTime, leftTime, finishedState, description = u'充电完成'): """ :param event_code: :param record: :param orderNo: :param deviceCode: :param groupName: :param address: :param actualNeedTime: :param leftTime: :param finishedState: :param description: :return: """ payload = get_payload( eventCode = event_code, orderNo = orderNo, deviceCode = deviceCode, groupName = groupName, address = address, description = description, actualNeedTime = actualNeedTime, leftTime = leftTime, finishedState = finishedState ) result = send(payload) logger.debug('report_zhongtian_service_complete result=%s' % result) updated = record.update(postActionTriggered = True, set__postActionResult__complete = result, set__sentPayload = payload) if not updated: logger.error('update api start device record failed report_zhongtian_refund') return result def report_zhongtian_refund(eventCode, record, orderNo, deviceCode, groupName, address, actualNeedTime, leftTime, finishedState, backMoney, backCoins, description = u'退费'): """ :param record: :param orderNo: :param deviceCode: :param groupName: :param address: :param actualNeedTime: :param leftTime: :param finishedState: :param backMoney: :param backCoins: :param description: :return: """ payload = get_payload( eventCode = eventCode, deviceCode = deviceCode, groupName = groupName, address = address, orderNo = orderNo, refundable = True, description = description, backMoney = backMoney, backCoins = backCoins, actualNeedTime = actualNeedTime, leftTime = leftTime, finishedState = finishedState ) result = send(payload) logger.debug('report_zhongtian_refund result=%s' % result) updated = record.update(postActionTriggered = True, set__postActionResult__refund = result, set__sentPayload = payload) if not updated: logger.error('update api start device record failed report_zhongtian_refund') return result