def do_J5(token, amount, card_expiration, billing_transaction, callback_args=None): billing_transaction.change_status(BillingStatus.PENDING, BillingStatus.PROCESSING) lang_code = get_language_code_for_credit_guard(billing_transaction.order.language_code) params = { 'card_id' : token, 'card_expiration' : card_expiration, 'total' : amount, 'billing_transaction_id' : billing_transaction.id, 'request_id' : get_unique_id(), 'validation' : "Verify", 'language' : lang_code } if settings.DEV: # bypass authorization if running on test server params.update({"auth_number": "0000000"}) result = do_credit_guard_trx(params) if not result: billing_transaction.comments = "CreditGuard transaction failed" billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.FAILED) #calls save billing_failed_signal.send(sender="do_J5", obj=billing_transaction) return HttpResponse("OK") status_code = get_text_from_element(result, "status") billing_transaction.provider_status = status_code auth_number = get_text_from_element(result, "authNumber") transaction_id = get_text_from_element(result, "tranId") billing_transaction.transaction_id = transaction_id if int(status_code): # failed message = get_text_from_element(result, "message") billing_transaction.comments = message billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.FAILED) #calls save billing_failed_signal.send(sender="do_J5", obj=billing_transaction) else: billing_transaction.auth_number = auth_number billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.APPROVED) #calls save if billing_transaction.order.change_status(old_status=PENDING, new_status=APPROVED): billing_approved_signal.send(sender="do_J5", obj=billing_transaction, callback_args=callback_args) billing_transaction.charge() # setup J4 else: # order is not PENDING (it can be marked as IGNORED when submitting to algorithm) billing_transaction.comments = _("We are sorry but booking for the selected time is closed, please choose a different time.<br/>Your billing information was saved, you will not be asked to provide it again.") billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.FAILED) #calls save logging.info("J5 FAILED: order status is %s (expected PENDING)" % billing_transaction.order.get_status_label()) return HttpResponse("OK")
def confirm_sms_cellact(request): confirmation_xml = unquote(request.GET.get("CONFIRMATION")) logging.info(confirmation_xml) dom = xml.dom.minidom.parseString(confirmation_xml) sms_id = get_text_from_element(dom, "BLMJ") raw_status = get_text_from_element(dom, "EVT") reason = get_text_from_element(dom, "REASON") status = SMSStatus.NOK if raw_status == "mt_del": # delivered status = SMSStatus.OK sms_data = memcache.get(sms_id, namespace=SMS_STATUS_MEMCACHE_NS) or {} sms_data.update({'status': status, 'raw_status': raw_status, 'reason': reason}) memcache.set(sms_id, sms_data, namespace=SMS_STATUS_MEMCACHE_NS)
def send_sms_cellact(destination, text, sms_config): provider_url = sms_config[SMS_PROVIDER_URL] params = { 'destination': destination, 'text': text, 'is_test': "false", 'confirmation_url': sms_config[SMS_CALLBACK_URL] } params.update(sms_config) c = Context(params) t = get_template("cellact_send_sms.xml") rendered_payload = t.render(c) logging.info("sms payload: %s" % rendered_payload) payload = str("XMLString=" + urlquote_plus(rendered_payload)) try: result = fetch(provider_url, method="POST", payload=payload, deadline=50) respone_content = unquote(result.content) logging.info("cellact response %s" % respone_content) if respone_content.find("<RESULTCODE>0</RESULTCODE>") == -1: logging.error("error sending sms: %s" % result.content) return None else: dom = xml.dom.minidom.parseString(respone_content) sms_id = get_text_from_element(dom, "BLMJ") logging.info("cellact send success sms_id=%s" % sms_id) return sms_id except DeadlineExceededError: logging.warn("SMS sending failed due to DeadlineExceededError, retrying") return send_sms_cellact(destination, text, sms_config)
def do_J4(token, amount, card_expiration, billing_transaction): if billing_transaction.status == BillingStatus.CANCELLED or billing_transaction.order.status in [IGNORED, CANCELLED, FAILED]: return HttpResponse("Cancelled") billing_transaction.change_status(BillingStatus.APPROVED, BillingStatus.PROCESSING) lang_code = get_language_code_for_credit_guard(billing_transaction.order.language_code) params = { 'card_id' : token, 'card_expiration' : card_expiration, 'total' : amount, 'billing_transaction_id' : billing_transaction.id, 'request_id' : get_unique_id(), 'validation' : "AutoComm", 'auth_number' : billing_transaction.auth_number, 'language' : lang_code } result = do_credit_guard_trx(params) if not result: billing_transaction.comments = "CreditGuard transaction failed" billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.FAILED) #calls save billing_failed_signal.send(sender="do_J4", obj=billing_transaction) return HttpResponse("OK") status_code = get_text_from_element(result, "status") billing_transaction.provider_status = status_code auth_number = get_text_from_element(result, "authNumber") transaction_id = get_text_from_element(result, "tranId") billing_transaction.transaction_id = transaction_id if int(status_code): message = get_text_from_element(result, "message") billing_transaction.comments = message billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.FAILED) #calls save billing_failed_signal.send(sender="do_J4", obj=billing_transaction) else: billing_transaction.auth_number = auth_number billing_transaction.change_status(BillingStatus.PROCESSING, BillingStatus.CHARGED) #calls save billing_transaction.order.change_status(new_status=CHARGED) billing_charged_signal.send(sender="do_J4", obj=billing_transaction) return HttpResponse("OK")
def confirm_sms_cellact(request): confirmation_xml = unquote(request.GET.get("CONFIRMATION")) logging.info(confirmation_xml) dom = xml.dom.minidom.parseString(confirmation_xml) sms_id = get_text_from_element(dom, "BLMJ") raw_status = get_text_from_element(dom, "EVT") reason = get_text_from_element(dom, "REASON") status = SMSStatus.NOK if raw_status == "mt_del": # delivered status = SMSStatus.OK sms_data = memcache.get(sms_id, namespace=SMS_STATUS_MEMCACHE_NS) or {} sms_data.update({ 'status': status, 'raw_status': raw_status, 'reason': reason }) memcache.set(sms_id, sms_data, namespace=SMS_STATUS_MEMCACHE_NS)
def send_sms_cellact(destination, text, sms_config): provider_url = sms_config[SMS_PROVIDER_URL] params = { 'destination': destination, 'text': text, 'is_test': "false", 'confirmation_url': sms_config[SMS_CALLBACK_URL] } params.update(sms_config) c = Context(params) t = get_template("cellact_send_sms.xml") rendered_payload = t.render(c) logging.info("sms payload: %s" % rendered_payload) payload = str("XMLString=" + urlquote_plus(rendered_payload)) try: result = fetch(provider_url, method="POST", payload=payload, deadline=50) respone_content = unquote(result.content) logging.info("cellact response %s" % respone_content) if respone_content.find("<RESULTCODE>0</RESULTCODE>") == -1: logging.error("error sending sms: %s" % result.content) return None else: dom = xml.dom.minidom.parseString(respone_content) sms_id = get_text_from_element(dom, "BLMJ") logging.info("cellact send success sms_id=%s" % sms_id) return sms_id except DeadlineExceededError: logging.warn( "SMS sending failed due to DeadlineExceededError, retrying") return send_sms_cellact(destination, text, sms_config)