PaySecure Pinless Web Services 2023:07:03:07

<back to all web services

AchRefundRequest

The following routes are available for this service:
POST/ACHRefund
import datetime
import decimal
from marshmallow.fields import *
from servicestack import *
from typing import *
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json, LetterCase, Undefined, config
from enum import Enum, IntEnum


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class InOutTimes:
    pass


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class RequestTimestamps:
    app_layer: Optional[InOutTimes] = None
    parent_lookup: Optional[InOutTimes] = None
    retry_lookup: Optional[InOutTimes] = None
    get_card_data: Optional[InOutTimes] = None
    card_tokenize: Optional[InOutTimes] = None
    card_encrypt: Optional[InOutTimes] = None
    db_insert: Optional[InOutTimes] = None
    backend_process: Optional[InOutTimes] = None
    db_update: Optional[InOutTimes] = None
    parent_update: Optional[InOutTimes] = None
    network: Optional[InOutTimes] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class PaysecureResponseInternal:
    timestamps: Optional[RequestTimestamps] = None


class CardInfoType(str, Enum):
    CARD_NUMBER = 'CardNumber'
    TOKEN = 'Token'
    TRACK = 'Track'
    EMV = 'EMV'
    ENCRYPTED = 'Encrypted'
    DPAN = 'DPAN'
    APPLE_PAY = 'ApplePay'
    GOOGLE_PAY = 'GooglePay'
    SAMSUNG_PAY = 'SamsungPay'
    CP_TOKEN = 'CPToken'
    ENCRYPTED_ENHANCED = 'EncryptedEnhanced'
    ENCRYPTED_J_W_E = 'EncryptedJWE'


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class CardAccountUpdaterDescriptor:
    card_data_type: Optional[CardInfoType] = None
    card_number_info: Optional[str] = None
    expiry_date: Optional[str] = None
    status: Optional[str] = None
    error_code: Optional[str] = None
    card_token: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ExtendedResponse:
    card_account_updater: Optional[CardAccountUpdaterDescriptor] = None
    product_id: Optional[str] = None
    network_response_code: Optional[str] = None
    network_transaction_id: Optional[str] = None
    ch_email_addr_result: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class PaysecureVersion(PaysecureResponseInternal):
    local_date_time: Optional[str] = None
    token: Optional[str] = None
    extended_data: Optional[ExtendedResponse] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Refund(PaysecureVersion):
    tran_id: Optional[str] = None
    approval_code: Optional[str] = None
    response_code: Optional[str] = None
    network: Optional[str] = None
    error_message: Optional[str] = None
    error_code: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class RequestorCredentials:
    # @Required()
    merchant_id: Optional[str] = None

    # @Required()
    user_name: Optional[str] = None

    # @Required()
    password: Optional[str] = None

    # @Required()
    version: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class MerchantDataElements:
    refund_settlement_type_details: int = 0
    send_recurring_p_o_s_entry_mode_feature: bool = False
    use_org_p_o_s_code: bool = False


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class MerchantDescriptorBase:
    data_elements: Optional[MerchantDataElements] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class MerchantDescriptor(MerchantDescriptorBase):
    name: Optional[str] = None
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    zip: Optional[str] = None
    country: Optional[str] = None
    customer_service_number: Optional[str] = None
    mcc: Optional[str] = None
    fn_snum: Optional[str] = None
    email: Optional[str] = None


class TelephoneType(str, Enum):
    D = 'D'
    H = 'H'
    N = 'N'
    W = 'W'


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class Avs:
    address: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    zip: Optional[str] = None
    country: Optional[str] = None
    email: Optional[str] = None
    ip_address: Optional[str] = None
    telephone_number: Optional[str] = None
    telephone_type: Optional[TelephoneType] = None
    delivery_method: int = 0
    first_name: Optional[str] = None
    middle_name: Optional[str] = None
    last_name: Optional[str] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class ACHExtendedData:
    cashback_amount: int = 0
    connect_pay_sub_scriber_id: Optional[str] = None
    organization_id: Optional[str] = None
    device_finger_print: Optional[str] = None
    merchant_session_id: Optional[str] = None
    currency_code: Optional[str] = None
    payment_type: Optional[str] = None
    verify_customer: bool = False
    customer_external_id: Optional[str] = None
    description: Optional[str] = None
    customer_name: Optional[str] = None
    address_line1: Optional[str] = None
    address_line2: Optional[str] = None
    city: Optional[str] = None
    state: Optional[str] = None
    zip: Optional[str] = None
    country: Optional[str] = None
    email: Optional[str] = None
    telephone_number: Optional[str] = None
    return_url: Optional[str] = None
    cancel_url: Optional[str] = None
    establish_data: Optional[str] = None
    redirect_url: Optional[str] = None
    retry_attempt_count: int = 0
    signature_hash_version: Optional[str] = None
    deadline_hash_date: Optional[datetime.datetime] = None


@dataclass_json(letter_case=LetterCase.CAMEL, undefined=Undefined.EXCLUDE)
@dataclass
class AchRefundRequest:
    credentials: Optional[RequestorCredentials] = None
    tran_id: Optional[str] = None
    amount: int = 0
    reference_key: Optional[str] = None
    merchant_details: Optional[MerchantDescriptor] = None
    custom1: Optional[str] = None
    custom2: Optional[str] = None
    custom3: Optional[str] = None
    custom4: Optional[str] = None
    custom5: Optional[str] = None
    signature_hash: Optional[str] = None
    avs: Optional[Avs] = None
    extended_data: Optional[ACHExtendedData] = None

Python AchRefundRequest DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /ACHRefund HTTP/1.1 
Host: api.paysecure.acculynk.net 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	Credentials: 
	{
		MerchantId: String,
		UserName: String,
		Password: String,
		Version: String
	},
	TranId: String,
	Amount: 0,
	ReferenceKey: String,
	MerchantDetails: 
	{
		Name: String,
		Address: String,
		City: String,
		State: String,
		Zip: String,
		Country: String,
		CustomerServiceNumber: String,
		MCC: String,
		FNSnum: String,
		Email: String,
		DataElements: 
		{
			RefundSettlementTypeDetails: 0,
			SendRecurringPOSEntryModeFeature: False,
			UseOrgPOSCode: False
		}
	},
	Custom1: String,
	Custom2: String,
	Custom3: String,
	Custom4: String,
	Custom5: String,
	SignatureHash: String,
	AVS: 
	{
		Address: String,
		City: String,
		State: String,
		Zip: String,
		Country: String,
		Email: String,
		IPAddress: String,
		TelephoneNumber: String,
		TelephoneType: D,
		DeliveryMethod: 0,
		FirstName: String,
		MiddleName: String,
		LastName: String
	},
	ExtendedData: 
	{
		CashbackAmount: 0,
		ConnectPaySubScriberId: String,
		OrganizationId: String,
		DeviceFingerPrint: String,
		MerchantSessionId: String,
		CurrencyCode: String,
		PaymentType: String,
		VerifyCustomer: False,
		CustomerExternalId: String,
		Description: String,
		CustomerName: String,
		AddressLine1: String,
		AddressLine2: String,
		City: String,
		State: String,
		Zip: String,
		Country: String,
		Email: String,
		TelephoneNumber: String,
		ReturnUrl: String,
		CancelUrl: String,
		EstablishData: String,
		RedirectUrl: String,
		RetryAttemptCount: 0,
		SignatureHashVersion: String,
		DeadlineHashDate: 0001-01-01
	}
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	TranId: String,
	ApprovalCode: String,
	ResponseCode: String,
	Network: String,
	ErrorMessage: String,
	ErrorCode: String,
	LocalDateTime: String,
	Token: String,
	ExtendedData: 
	{
		CardAccountUpdater: 
		{
			CardDataType: CardNumber,
			CardNumberInfo: String,
			ExpiryDate: String,
			Status: String,
			ErrorCode: String,
			CardToken: String
		},
		ProductId: String,
		NetworkResponseCode: String,
		NetworkTransactionId: String,
		CHEmailAddrResult: String
	},
	Timestamps: 
	{
		AppLayer: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		ParentLookup: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		RetryLookup: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		GetCardData: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		CardTokenize: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		CardEncrypt: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		DBInsert: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		BackendProcess: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		DBUpdate: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		ParentUpdate: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		},
		Network: 
		{
			InTime: 0001-01-01,
			OutTime: 0001-01-01
		}
	}
}