# -*- coding: utf-8 -*- # !/usr/bin/env python import base64 import json import sys from hashlib import md5 import pymssql import requests from apps import serviceCache reload(sys) # noinspection PyUnresolvedReferences sys.setdefaultencoding("utf-8") class YuChuanApi(object): def __init__(self, url=None, systemName=None, termId=None, bagCode=None, roomNumb=None, HOST=None, PART=None, USER=None, PASSWORD=None, DATABASE=None, TABLE=None): self.url = url self.systemName = systemName self.termId = termId self.bagCode = bagCode self.roomNumb = roomNumb self.HOST = HOST self.PART = PART self.USER = USER self.PASSWORD = PASSWORD self.DATABASE = DATABASE self.TABLE = TABLE def get_token(self): #1 存缓存 token = serviceCache.get('YuChuanApiToken') if token: return token #2 缓存中没有访问api继续调用 url = "{}/webapi/query/system/api/v1/login/{}".format(self.url,self.systemName) headers = { 'content-type': "application/json" } response = requests.request("GET", url, headers=headers, timeout = 15) if response.status_code == 200: # 存缓存 token = response.json().get('data').get('token') serviceCache.set('YuChuanApiToken',token,60*30) return token def update_token(self): token = serviceCache.get('YuChuanApiToken') if token: serviceCache.delete('YuChuanApiToken') return self.get_token() def get_user_info(self,factoryFixId): token = self.get_token() url = "{}/webapi/query/account/api/v1/balancebycard/{}".format(self.url,factoryFixId) headers = { 'content-type': "application/json", 'key': token, 'username': self.systemName, } response = requests.request("GET", url, headers=headers, timeout = 15) if response.status_code == 200: return response.json().get('data') else: return None def get_mac(self,factoryFixId, userNumb, consumeValue, termId, roomNumb, bagCode, orderSerial,token): macStr = "" macStr += "consumevalue=" + str(consumeValue) macStr += "&userNumb=" + str(userNumb) macStr += "&factoryfixid=" + str(factoryFixId) macStr += "&termid=" + str(termId) macStr += "&orderserial=" + str(orderSerial) macStr += "&roomnumb=" + str(roomNumb) macStr += "&bagcode=" + str(bagCode) macStr += "&token=" + str(token) try: md5_data = md5(macStr.encode('utf-8')).hexdigest().decode('hex') base64mac = base64.b64encode(md5_data) except Exception as e: raise e return base64mac def pay_order(self,orderSerial,userNumb,factoryFixId,consumeValue): """ :param consumeValue: 消费金额,精确到小数点后面2位 :type str :param userNumb: 人员编号 :type str :param factoryFixId: 物理卡号 :param orderSerial: 长度为20的订单序号,消费系统全局维一 :return: """ token = self.get_token() # print 'token>>' ,token username = self.systemName url = "{}/consume/v1/KlsdConsumes/order".format(self.url) payload={ "orderSerial": orderSerial, "userNumb": userNumb, "factoryFixId": factoryFixId, "bagCode": self.bagCode, "termId": self.termId, "consumeValue": consumeValue, "roomNumb": self.roomNumb, "token": token } # print payload querystring = {'mac': self.get_mac(**payload)} # print 'mac>>',querystring payload.pop("token") headers = { 'Content-Type': "application/json", 'key': token, 'username': username, } response = requests.request("POST", url, data=json.dumps(payload), headers=headers, params=querystring, timeout = 15) # return response.json() if response.status_code == 200: return response.json() # 余额不足 if response.status_code == 403: return response.json() # 已经扣费 if response.status_code == 401: return response.json() # 人员编号错误 if response.status_code == 400: return response.json() def sql_get_user_info(self,userNumb): try: connect = pymssql.connect(host='{}:{}'.format(self.HOST,self.PART), user=self.USER, password=self.PASSWORD, database=self.DATABASE) # 服务器名,账户,密码,数据库名 cursor = connect.cursor() cursor.execute("SELECT factoryFixId,mobilePhone,userName,userNumb FROM USER_CARDINFO WHERE userNumb=%s",(userNumb,)) row = cursor.fetchone() connect.commit() cursor.close() connect.close() except Exception as e: raise e fields = ['factoryFixId', 'mobilePhone', 'userName', 'userNumb'] dic = {} for i, filed in enumerate(fields): dic[fields[i]] = row[i] return dic # if __name__ == '__main__': # url = 'http://120.237.110.50:7622' # systemName = 'schooladmin' # yc = YuChuanApi() # dic = { # "orderSerial": "12314747292574254198", # "userNumb": "123456", # "factoryFixId": "2869422464", # "bagCode": "1", # "termId": "199", # "consumeValue": "0.01", # "roomNumb": "12345", # } # print json.dumps(yc.pay_order(**dic),encoding='utf-8', ensure_ascii=False) # {"message": "扣费成功!", "code": 200, "data": {"consumeValue": 11.26, "subsidyValue": 0}, "success": true}