yuchuanApi.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import base64
  4. import json
  5. import sys
  6. from hashlib import md5
  7. import pymssql
  8. import requests
  9. from apps import serviceCache
  10. reload(sys)
  11. # noinspection PyUnresolvedReferences
  12. sys.setdefaultencoding("utf-8")
  13. class YuChuanApi(object):
  14. def __init__(self, url=None, systemName=None, termId=None, bagCode=None, roomNumb=None, HOST=None, PART=None,
  15. USER=None, PASSWORD=None, DATABASE=None, TABLE=None):
  16. self.url = url
  17. self.systemName = systemName
  18. self.termId = termId
  19. self.bagCode = bagCode
  20. self.roomNumb = roomNumb
  21. self.HOST = HOST
  22. self.PART = PART
  23. self.USER = USER
  24. self.PASSWORD = PASSWORD
  25. self.DATABASE = DATABASE
  26. self.TABLE = TABLE
  27. def get_token(self):
  28. #1 存缓存
  29. token = serviceCache.get('YuChuanApiToken')
  30. if token:
  31. return token
  32. #2 缓存中没有访问api继续调用
  33. url = "{}/webapi/query/system/api/v1/login/{}".format(self.url,self.systemName)
  34. headers = {
  35. 'content-type': "application/json"
  36. }
  37. response = requests.request("GET", url, headers=headers, timeout = 15)
  38. if response.status_code == 200:
  39. # 存缓存
  40. token = response.json().get('data').get('token')
  41. serviceCache.set('YuChuanApiToken',token,60*30)
  42. return token
  43. def update_token(self):
  44. token = serviceCache.get('YuChuanApiToken')
  45. if token:
  46. serviceCache.delete('YuChuanApiToken')
  47. return self.get_token()
  48. def get_user_info(self,factoryFixId):
  49. token = self.get_token()
  50. url = "{}/webapi/query/account/api/v1/balancebycard/{}".format(self.url,factoryFixId)
  51. headers = {
  52. 'content-type': "application/json",
  53. 'key': token,
  54. 'username': self.systemName,
  55. }
  56. response = requests.request("GET", url, headers=headers, timeout = 15)
  57. if response.status_code == 200:
  58. return response.json().get('data')
  59. else:
  60. return None
  61. def get_mac(self,factoryFixId, userNumb, consumeValue, termId, roomNumb, bagCode, orderSerial,token):
  62. macStr = ""
  63. macStr += "consumevalue=" + str(consumeValue)
  64. macStr += "&userNumb=" + str(userNumb)
  65. macStr += "&factoryfixid=" + str(factoryFixId)
  66. macStr += "&termid=" + str(termId)
  67. macStr += "&orderserial=" + str(orderSerial)
  68. macStr += "&roomnumb=" + str(roomNumb)
  69. macStr += "&bagcode=" + str(bagCode)
  70. macStr += "&token=" + str(token)
  71. try:
  72. md5_data = md5(macStr.encode('utf-8')).hexdigest().decode('hex')
  73. base64mac = base64.b64encode(md5_data)
  74. except Exception as e:
  75. raise e
  76. return base64mac
  77. def pay_order(self,orderSerial,userNumb,factoryFixId,consumeValue):
  78. """
  79. :param consumeValue: 消费金额,精确到小数点后面2位 :type str
  80. :param userNumb: 人员编号 :type str
  81. :param factoryFixId: 物理卡号
  82. :param orderSerial: 长度为20的订单序号,消费系统全局维一
  83. :return:
  84. """
  85. token = self.get_token()
  86. # print 'token>>' ,token
  87. username = self.systemName
  88. url = "{}/consume/v1/KlsdConsumes/order".format(self.url)
  89. payload={
  90. "orderSerial": orderSerial,
  91. "userNumb": userNumb,
  92. "factoryFixId": factoryFixId,
  93. "bagCode": self.bagCode,
  94. "termId": self.termId,
  95. "consumeValue": consumeValue,
  96. "roomNumb": self.roomNumb,
  97. "token": token
  98. }
  99. # print payload
  100. querystring = {'mac': self.get_mac(**payload)}
  101. # print 'mac>>',querystring
  102. payload.pop("token")
  103. headers = {
  104. 'Content-Type': "application/json",
  105. 'key': token,
  106. 'username': username,
  107. }
  108. response = requests.request("POST", url, data=json.dumps(payload), headers=headers, params=querystring, timeout = 15)
  109. # return response.json()
  110. if response.status_code == 200:
  111. return response.json()
  112. # 余额不足
  113. if response.status_code == 403:
  114. return response.json()
  115. # 已经扣费
  116. if response.status_code == 401:
  117. return response.json()
  118. # 人员编号错误
  119. if response.status_code == 400:
  120. return response.json()
  121. def sql_get_user_info(self,userNumb):
  122. try:
  123. connect = pymssql.connect(host='{}:{}'.format(self.HOST,self.PART), user=self.USER, password=self.PASSWORD,
  124. database=self.DATABASE) # 服务器名,账户,密码,数据库名
  125. cursor = connect.cursor()
  126. cursor.execute("SELECT factoryFixId,mobilePhone,userName,userNumb FROM USER_CARDINFO WHERE userNumb=%s",(userNumb,))
  127. row = cursor.fetchone()
  128. connect.commit()
  129. cursor.close()
  130. connect.close()
  131. except Exception as e:
  132. raise e
  133. fields = ['factoryFixId', 'mobilePhone', 'userName', 'userNumb']
  134. dic = {}
  135. for i, filed in enumerate(fields):
  136. dic[fields[i]] = row[i]
  137. return dic
  138. # if __name__ == '__main__':
  139. # url = 'http://120.237.110.50:7622'
  140. # systemName = 'schooladmin'
  141. # yc = YuChuanApi()
  142. # dic = {
  143. # "orderSerial": "12314747292574254198",
  144. # "userNumb": "123456",
  145. # "factoryFixId": "2869422464",
  146. # "bagCode": "1",
  147. # "termId": "199",
  148. # "consumeValue": "0.01",
  149. # "roomNumb": "12345",
  150. # }
  151. # print json.dumps(yc.pay_order(**dic),encoding='utf-8', ensure_ascii=False)
  152. # {"message": "扣费成功!", "code": 200, "data": {"consumeValue": 11.26, "subsidyValue": 0}, "success": true}