Ejemplo n.º 1
0
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")
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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")
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)