zhongtian.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. """
  4. 目前三江和朗鑫支持对中天物业的南向接口
  5. """
  6. import datetime
  7. import hashlib
  8. import json
  9. import logging
  10. from collections import OrderedDict
  11. import requests
  12. from django.conf import settings
  13. logger = logging.getLogger(__name__)
  14. """
  15. 对接中天测试代码
  16. """
  17. """
  18. payload 相关
  19. 参数名称 参数类型 必选 参数说明
  20. level string 是 告警级别:1、普通;2、重要;3、严重
  21. eventCode string 是 告警类型编码
  22. description string 是 事件描述
  23. createTime string 是 创建时间
  24. deviceCode string 是 设备编号
  25. groupName string 是 地址分组名称
  26. address string 是 地址信息
  27. orderNo string 是 订单编号
  28. backMoney float 否 退款金额
  29. backCoins float 否 退款金币
  30. """
  31. # prod_url = "http://app.ztcnwy.com/api/gateway"
  32. prod_url = "http://119.27.178.214/api/gateway"
  33. test_url = "http://apptest.ztcnwy.com/api/gateway"
  34. # internal_test_url = "http://211.159.224.10/api/test/zhongtian"
  35. if settings.DEBUG:
  36. app_key = "37097f1ac2214d7ea735518d0181f33a"
  37. secret = "b55a8167c0dd4b438e0fa70b2b70ab9a"
  38. url = test_url
  39. else:
  40. app_key = "fa801fe50d8b43d0b9c0381fbc2dacc8"
  41. secret = "71d0d180f1e644a68f40b58208d1b1ca"
  42. url = prod_url
  43. def concat(secret, payload):
  44. """
  45. 拼接签名准备文本, 格式为 secret + 升序的字典文本keyvalue直接拼接 + secret
  46. """
  47. raw = secret
  48. for _ in sorted(payload.iteritems()):
  49. raw += ''.join(_)
  50. raw += secret
  51. return raw
  52. def encode(text):
  53. return hashlib.md5(text).hexdigest().upper()
  54. def sign(secret, payload):
  55. return encode(concat(secret, payload))
  56. def get_payload(orderNo, eventCode, deviceCode, groupName, address, refundable = False, level = '1', description = '',
  57. **kwargs):
  58. currentDateTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  59. data = OrderedDict(
  60. [
  61. ("level", level),
  62. ("eventCode", eventCode),
  63. ("description", description),
  64. ("createTimeStr", currentDateTime),
  65. ("deviceCode", deviceCode),
  66. ("groupName", groupName),
  67. ("address", address),
  68. ("orderNo", orderNo),
  69. ("refundable", refundable)
  70. ]
  71. )
  72. for k, v in kwargs.iteritems():
  73. data[k] = v
  74. payload = {
  75. "Method": "chargeapi.chargereturn",
  76. "AppKey": app_key,
  77. "Format": "Json",
  78. "TimeStamp": currentDateTime,
  79. "Data": json.dumps(data, separators = (',', ':'))
  80. }
  81. signed = sign(secret, payload)
  82. payload['Sign'] = signed
  83. return payload
  84. def send(payload):
  85. return requests.post(url, data = payload, timeout = 15).json()
  86. def report_zhongtian_service_complete(event_code, record, orderNo, deviceCode,
  87. groupName, address, actualNeedTime,
  88. leftTime, finishedState, description = u'充电完成'):
  89. """
  90. :param event_code:
  91. :param record:
  92. :param orderNo:
  93. :param deviceCode:
  94. :param groupName:
  95. :param address:
  96. :param actualNeedTime:
  97. :param leftTime:
  98. :param finishedState:
  99. :param description:
  100. :return:
  101. """
  102. payload = get_payload(
  103. eventCode = event_code,
  104. orderNo = orderNo,
  105. deviceCode = deviceCode,
  106. groupName = groupName,
  107. address = address,
  108. description = description,
  109. actualNeedTime = actualNeedTime,
  110. leftTime = leftTime,
  111. finishedState = finishedState
  112. )
  113. result = send(payload)
  114. logger.debug('report_zhongtian_service_complete result=%s' % result)
  115. updated = record.update(postActionTriggered = True, set__postActionResult__complete = result,
  116. set__sentPayload = payload)
  117. if not updated:
  118. logger.error('update api start device record failed report_zhongtian_refund')
  119. return result
  120. def report_zhongtian_refund(eventCode, record, orderNo, deviceCode, groupName, address, actualNeedTime, leftTime,
  121. finishedState, backMoney, backCoins, description = u'退费'):
  122. """
  123. :param record:
  124. :param orderNo:
  125. :param deviceCode:
  126. :param groupName:
  127. :param address:
  128. :param actualNeedTime:
  129. :param leftTime:
  130. :param finishedState:
  131. :param backMoney:
  132. :param backCoins:
  133. :param description:
  134. :return:
  135. """
  136. payload = get_payload(
  137. eventCode = eventCode,
  138. deviceCode = deviceCode,
  139. groupName = groupName,
  140. address = address,
  141. orderNo = orderNo,
  142. refundable = True,
  143. description = description,
  144. backMoney = backMoney,
  145. backCoins = backCoins,
  146. actualNeedTime = actualNeedTime,
  147. leftTime = leftTime,
  148. finishedState = finishedState
  149. )
  150. result = send(payload)
  151. logger.debug('report_zhongtian_refund result=%s' % result)
  152. updated = record.update(postActionTriggered = True, set__postActionResult__refund = result,
  153. set__sentPayload = payload)
  154. if not updated:
  155. logger.error('update api start device record failed report_zhongtian_refund')
  156. return result