Rev 23120 | Blame | Compare with Previous | Last modification | View Log | RSS feed
from suds.client import Clientimport base64, refrom xml.dom.minidom import parseStringimport loggingfrom datetime import datetimeimport timefrom shop2020.config.client.ConfigClient import ConfigClientfrom decimal import Decimalfrom shop2020.thriftpy.model.v1.order.ttypes import RechargeModefrom suds.cache import NoCacheimport sslfrom functools import wrapsdef sslwrap(func):@wraps(func)def bar(*args, **kw):kw['ssl_version'] = ssl.PROTOCOL_TLSv1return func(*args, **kw)return barssl.wrap_socket = sslwrap(ssl.wrap_socket)logging.basicConfig(level=logging.INFO)username = base64.b64encode('saholic20')password = base64.b64encode('ap2020sh')account_url = "file:///recharge-wsdls/AccountApiMcomm.xml"recharge_url = "file:///recharge-wsdls/RechargeApiMcomm.xml"aclient = Noneraclient = Noneallow_recharge = Falsestore_map = {'H01':'105','H02':'109','H03':'113','H04':'115','H05':'116','H06':'119','H07':'120','H08':'125','H09':'129','H10':'130','H11':'131','H12':'132','H13':'133','H14':'134','H15':'135','H16':'141','H17':'143','H18':'144','H19':'146','H20':'147','H21':'150','H22':'151','H23':'153','H24':'159','H25':'164','H26':'189','H27':'226','H28':'230','H29':'253','H30':'254','H31':'265','H32':'281','H33':'296','H34':'327','H35':'358','H36':'425','H37':'427','H38':'440','H39':'441','H40':'469','H41':'475','H42':'502','H43':'C31','H44':'C33','H45':'C34','H46':'C52','H47':'C70','H48':'C76','H49':'C86','H50':'C87','H51':'CA6','H52':'CB7','H53':'CC5','H54':'CC9','H55':'CE0','H56':'CF6','H57':'CF8','H58':'CG3','H59':'CQ0','H60':'CQ9','H61':'CR4','H62':'CS0','H70':'M01','H71':'M02','H72':'M07','H73':'M08','H74':'MB5','H75':'CM8','H76':'M78','H77':'112','H78':'137','H79':'138','H80':'165','H81':'255','H82':'317','H83':'347','H84':'476','H85':'477','H86':'518','H87':'C49','H88':'CC4','H89':'CF9','H90':'178','H91':'183','H92':'200','H93':'239','H94':'309','H95':'CD1','H96':'CD8','H97':'CE1','H98':'CI5','H99':'CK6','HA0':'CL2','HA1':'CN5','HA2':'G02','HA3':'G03','HA4':'G04','HA5':'G05','HA6':'G06','HA7':'G07','HA8':'G10','HA9':'G12','HB0':'G14','HB1':'G15','HB2':'G17','HB3':'M49','HB4':'M51','HB5':'M54','HB6':'353','HB7':'414','HB8':'431','HB9':'CA0','HC0':'CK4','HC1':'M26','HC2':'M27','HC3':'208','HC4':'215','HC5':'231','HC6':'240','HC7':'252','HC8':'289','HC9':'383','HD0':'CB3','HD1':'CD7','HD2':'CJ0','HD3':'CM3','HD4':'CN9','HD5':'CO3','HD6':'CQ1','HD7':'M46','HD8':'424','HD9':'M64','HE0':'145','HE1':'160','HE2':'328','HE3':'331','HE4':'343','HE5':'393','HE6':'460','HE7':'C25','HE8':'C84','HE9':'CB2','HF0':'CC3','HF1':'CC7','HF2':'CH5','HF3':'CP3','HF7':'M15','HF8':'471','HF9':'472','HG0':'481','HG1':'483','HG2':'484','HG3':'486','HG4':'C14','HG5':'C15','HG6':'C21','HG7':'C23','HG8':'C98','HG9':'CD2','HH0':'CD4','HH1':'CD5','HH2':'CG4','HH3':'CG5','HH4':'CG7','HH5':'CG8','HH6':'CI1','HH7':'CJ1','HH8':'CJ7','HH9':'CK1','HI0':'CK2','HI1':'CM1','HI2':'CM2','HI3':'CM5','HI4':'CN0','HI5':'CN4','HI6':'CO0','HI7':'CQ4','HI8':'CQ5','HI9':'CR8','H64':'CS3','H68':'CT4','H63':'CS1','H65':'CS6'}#allow_recharge_string = ConfigClient().get_property('allow_recharge')allow_recharge_string = 'True'if allow_recharge_string in ['True', 'true']:allow_recharge = Truedef getAccountClient():global aclientif aclient is None:aclient = Client(account_url, timeout=70,cache=NoCache())return aclientdef getRechargeClient():global raclientif raclient is None:raclient = Client(recharge_url, timeout=70,cache=NoCache())return raclientdef rechargeDevice(transactionId, rechargeType, strProviderCode, deviceNumber, amount, plan, storeCode = '', rechargeMode=None):if not allow_recharge:return 'S', '00', 'spiceTID', 'SUCCESS', 'aggTID', 'providerTID'if storeCode:if store_map.get(storeCode) is not None:storeCode = store_map.get(storeCode)spString = getRechargeClient().service.getRecharge(username, password, '919650889334', 'SOAP', '115.249.47.66', transactionId, rechargeType, strProviderCode, deviceNumber, amount, 'DEBIT', plan, storeCode)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)response = dom.getElementsByTagName('ActiveServicesPojo')[0]retStatus = response.getElementsByTagName('resStatus')[0].childNodes[0].dataretCode = response.getElementsByTagName('respCode')[0].childNodes[0].dataspiceTID = response.getElementsByTagName('SpiceTID')[0].childNodes[0].dataretDesc = response.getElementsByTagName('shotDesc')[0].childNodes[0].datatry:aggTID = response.getElementsByTagName('aggregatorId')[0].childNodes[0].dataproviderTID = response.getElementsByTagName('ProviderTID')[0].childNodes[0].dataexcept:aggTID = ''providerTID = ''if (retCode !='00' or retStatus !='S') and rechargeMode == RechargeMode._NAMES_TO_VALUES.get('SYNC'):try:if (checkTransactionStatus('',transactionId))[0]:return 'S','00', spiceTID, retDesc, aggTID, providerTIDexcept:passreturn retStatus, retCode, spiceTID, retDesc, aggTID, providerTIDdef checkTransactionStatus(spiceTID='', merchantTxnId=''):if not allow_recharge:return True, ''spString = getRechargeClient().service.getCheckStatus(username,password,spiceTID,merchantTxnId)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)response = dom.getElementsByTagName('CheckStatusObj')[0]transStatus = response.getElementsByTagName('transStatus')[0].childNodes[0].dataresponseCode = response.getElementsByTagName('ResponseCode')[0].childNodes[0].datatry:responseDescription = response.getElementsByTagName('ResponseDescription')[0].childNodes[0].dataexcept:responseDescription = ""aggregatorRespCode = response.getElementsByTagName('aggregatorRespCode')[0].childNodes[0].dataif responseCode == '00' and transStatus == 'S':return True, responseDescriptionelif responseCode == 'STP' and transStatus == 'S':raise Exception(111, "Still status is not known")elif responseCode in ('STO','US', 'UP') and transStatus == 'S':if aggregatorRespCode == '00':return True, responseDescriptionif aggregatorRespCode != 'NA':return False, responseDescriptionraise Exception(111, "Still status is not known")else:return False, responseDescriptiondef getAccountdetail():return getAccountClient().service.getAccountdetail(username, password)def getBalance():spString = getAccountClient().service.getBalance(username, password)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)response = dom.getElementsByTagName('BalancePojo')[0]balanceAmount = response.getElementsByTagName('balance_amt')[0].childNodes[0].datareturn Decimal(balanceAmount)def checkServiceProviderApi(strServiceCode, strDeviceNumber):spString = getAccountClient().service.checkServiceProviderApi(username, password, strServiceCode, strDeviceNumber)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)response = dom.getElementsByTagName('CheckServiceProviderPojo')[0]providerCode = response.getElementsByTagName('providerCode')[0].childNodes[0].datatry:operatorCircle = response.getElementsByTagName('operatorCircle')[0].childNodes[0].dataexcept:operatorCircle = ""return providerCode, operatorCircledef validateService(strServiceCode, strProviderCode, strDeviceNumber, dbAmount, strPlan):return getAccountClient().service.validateService(username, password, strServiceCode, strProviderCode, strDeviceNumber, dbAmount, strPlan)def getAvailableServices():spString = getAccountClient().service.getServiceApi(username, password)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)serviceApis = dom.getElementsByTagName('ServiceApiPojo')services = {}for serviceApi in serviceApis:services[serviceApi.getElementsByTagName('serviceCode')[0].childNodes[0].data] = serviceApi.getElementsByTagName('serviceDescription')[0].childNodes[0].datareturn servicesdef getServiceProvidersForMobile():return getServiceProvider('MTP')def getServiceProvidersForDTH():return getServiceProvider('RCH')def getServiceProvider(strServiceCode):spString = getAccountClient().service.getServiceProvider(username, password, strServiceCode)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)providers = dom.getElementsByTagName('ServicesProviderPojo')serviceProviders = {}for provider in providers:serviceProviders[provider.getElementsByTagName('providerCode')[0].childNodes[0].data] = provider.getElementsByTagName('providerDescription')[0].childNodes[0].datareturn serviceProvidersdef getServiceDetails(strServiceCode, strProviderCode):spString = getAccountClient().service.getServiceDetail(username, password, strServiceCode, strProviderCode)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)details = dom.getElementsByTagName('ServiceDetailPojo')serviceDetails = {}for detail in details:serviceDetails['Denomination Type'] = detail.getElementsByTagName('DenominationType')[0].childNodes[0].dataserviceDetails['Denomination Value'] = detail.getElementsByTagName('DenominationValue')[0].childNodes[0].datareturn serviceDetailsdef getRefunds(forDate):spString = getRechargeClient().service.checkRefundHistory(username, password, '3306', forDate.strftime("%d-%m-%Y"))print spStringrefundDetails = {}if spString is None or spString == "":return refundDetailsspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)refunds = dom.getElementsByTagName('checkRefundHistoryPojo')for refund in refunds:try:respStatus = refund.getElementsByTagName('respStatus')[0].childNodes[0].datarespCode = refund.getElementsByTagName('respCode')[0].childNodes[0].datarespDesc = refund.getElementsByTagName('respDesc')[0].childNodes[0].datarefundAmmount = refund.getElementsByTagName('refundAmmount')[0].childNodes[0].datatransId = refund.getElementsByTagName('transId')[0].childNodes[0].datadeviceNo = refund.getElementsByTagName('deviceNo')[0].childNodes[0].datarefundDateString = refund.getElementsByTagName('refundDate')[0].childNodes[0].datatransactionDate = refund.getElementsByTagName('transactionDate')[0].childNodes[0].dataopenningBalance = refund.getElementsByTagName('openningBalance')[0].childNodes[0].dataclosingBalance = refund.getElementsByTagName('closingBalance')[0].childNodes[0].datarefundTime = time.strptime(refundDateString, "%Y-%m-%d %H:%M:%S.0")refundDate = datetime(*refundTime[0:6])refundDetails[transId] = int(refundAmmount), refundDateexcept:continuereturn refundDetailsdef getAllTransactions(startDate, endDate):spString = getRechargeClient().service.getTransactionHistory(username, password, startDate.strftime("%d-%m-%Y"), endDate.strftime("%d-%m-%Y"))txnDetails = {}transactions = []if spString is None or spString == "":return txnDetailsspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)try:transactions = dom.getElementsByTagName('TransactionHistoryPojo')except:passreturn transactionsdef getRechargeStatus(spiceTID='', merchantTxnId=''):spString = getRechargeClient().service.getCheckStatus(username,password,spiceTID,merchantTxnId)print spStringspString = re.sub('<\?.*\?>','',spString)spString = "<dom>" + spString + "</dom>"dom = parseString(spString)response = dom.getElementsByTagName('CheckStatusObj')[0]transStatus = response.getElementsByTagName('transStatus')[0].childNodes[0].dataresponseCode = response.getElementsByTagName('ResponseCode')[0].childNodes[0].datatry:responseDescription = response.getElementsByTagName('ResponseDescription')[0].childNodes[0].dataexcept:responseDescription = ""return responseCode, responseDescriptiondef main():getBalance()print rechargeDevice(9999999999,'MTP','ART','9811524460',10,'')#print rechargeDevice(20180102,'RCH','ATV','3010059202',100,'')print checkTransactionStatus("", 9999999999)getBalance()if __name__=='__main__':main()