We’ve migrated our documentation to a new site, which means some URLs have changed.
Subscriptions

PayU Latam - Colombia

payu.png

PayU Latam Colombia Overview

Our integration with PayU Latam via PaymentsOS offers a dedicated payment provider setup for clients in this region. With a dedicated payment provider for Colombia, they can offer local payment processing methods relevant to Colombian customers. PayU is one of the most active investors in the fintech space and is always looking for opportunities to further innovation. PayU is a leader in payments in Colombia.

Merchant Requirements

Please review this guide on how to set up a PayU Hub account needed for this PayU Latam Colombia payment provider integration.

For more information about merchant requirements, please review the frequently asked questions here and reach out to PayU directly in case of any further questions.

Limitations

Does not support CVV and voiding transactions. Restricted to clients from Colombia, if needed other options for clients from the Latam region are listed here.

PSE Direct Debit is only supported for fixed-time terms (non-renewing one-off payments).

In order for the 3DS screen for PSE Direct Debit to be shown on a full page instead of only an iframe (smaller) window, please reach out to our Support Team at support@piano.io for further assistance.

The following code needs to be included into the Payment Components template under ManageTemplates in the Piano dashboard:

<script type="text/ng-template" id="/frontend/providers/components/payucolombiapse/checkout/component.shtml">
<div class="payu-colombia-pse-wrapper new-card-form">
    <div class="row">
        <div class="cc_new_card" ng-show="cc.payWithNew &amp;&amp; cc.initiated">
            <div desktop class="go-back-to-cards-wrapper">
                <h4>
                    <t>Payment details</t>
                </h4>
            </div>
            <form class="new-card-form" name="ccForm" role="form">
                <dynamic-base-inputs-component name="providerName"
                                             credit-card="credit_card"></dynamic-base-inputs-component>
                <div class="payment-system-condition"/>
            </form>
        </div>
        <div consents-list></div>
        <div class="footer-modal">
            <div ng-show="isConfirmStepEnabled()" class="complete-purchase-button" goto-confirmation-button
                 title="{{'Complete Purchase' | t}}"></div>
            <div ng-show="!isConfirmStepEnabled()" class="complete-purchase-button" complete-purchase-button
                 title="{{'Complete Purchase' | t}}"></div>
        </div>
    </div>
</div>

</script>

<script type="text/ng-template" id="/frontend/providers/components/payucolombiapse/common/baseTemplate.shtml">
<div class="cc-fields-layout">
  <div class="cc-fields-layout__flex-row">
    <div class="cc-fields-layout__field cc-fields-layout__bank">
      <credit-card-dropdown-component ng-model="credit_card.bank.value"
                                      on-element-select="credit_card.bank.onElementSelect"
                                      ng-disabled="credit_card.bank.disabled"
                                      ng-required="credit_card.bank.required"
                                      ng-readonly="credit_card.bank.readonly"
                                      placeholder="'Bank' | t"
                                      valid="credit_card.bank.valid"
                                      items="credit_card.bank.items"
                                      title="credit_card.bank.title"
                                      data-e2e="cc_bank"
                                      icon="'bank'"
                                      name="'bank'">
      </credit-card-dropdown-component>
    </div>
    <div class="cc-fields-layout__field cc-fields-layout__user-type">
      <credit-card-dropdown-component ng-model="credit_card.userType.value"
                                      on-element-select="credit_card.userType.onElementSelect"
                                      ng-disabled="credit_card.userType.disabled"
                                      ng-required="credit_card.userType.required"
                                      ng-readonly="credit_card.userType.readonly"
                                      placeholder="'User type' | t"
                                      valid="credit_card.userType.valid"
                                      items="credit_card.userType.items"
                                      title="credit_card.userType.title"
                                      data-e2e="cc_userType"
                                      icon="'client'"
                                      name="'userType'">
      </credit-card-dropdown-component>
    </div>
  </div>
  <div class="cc-fields-layout__flex-row">
    <div class="cc-fields-layout__field cc-fields-layout__identification-type">
      <credit-card-identification-type-component ng-model="credit_card.identificationType.value"
                                                 on-identification-type-select="credit_card.identificationType.onIdentificationTypeSelect"
                                                 ng-disabled="credit_card.identificationType.disabled"
                                                 ng-required="credit_card.identificationType.required"
                                                 ng-readonly="credit_card.identificationType.readonly"
                                                 placeholder="'Identification type' | t"
                                                 valid="credit_card.identificationType.valid"
                                                 is-dropdown-shown="credit_card.identificationType.isDropdownShown"
                                                 identification-types="credit_card.identificationType.items"
                                                 title="credit_card.identificationType.title"
                                                 data-e2e="cc_identificationType"
                                                 icon="'identification-type'"
                                                 name="'identificationType'">
      </credit-card-identification-type-component>
    </div>
    <div class="cc-fields-layout__field cc-fields-layout__identification-number">
      <cc-text-input placeholder="'Identification number' | t"
                     ng-model="credit_card.identificationNumber.value"
                     ng-readonly="credit_card.identificationNumber.readonly"
                     ng-required="credit_card.identificationNumber.required"
                     ng-disabled="credit_card.identificationNumber.disabled"
                     icon="'national-id'"
                     class="cc-field-wrap fs-block"
                     class-name="className"
                     on-change="credit_card.identificationNumber.onChangeCallback"
                     name="'identificationNumber'"
                     data-e2e="cc_identificationNumber"
                     valid="credit_card.identificationNumber.valid">
      </cc-text-input>
    </div>
  </div>
  <div class="cc-fields-layout__flex-row">
    <div class="cc-fields-layout__field cc-fields-layout__first-name">
      <cc-text-input placeholder="'First name' | t"
                     ng-model="credit_card.firstName.value"
                     on-change="credit_card.firstName.onChangeCallback"
                     ng-disabled="credit_card.firstName.disabled"
                     icon="'client'"
                     ng-required="credit_card.firstName.required"
                     ng-readonly="credit_card.firstName.readonly"
                     maxlength="credit_card.firstName.maxlength"
                     valid="credit_card.firstName.valid"
                     name="'firstName'"
                     data-e2e="cc_first_name">
      </cc-text-input>
    </div>

    <div class="cc-fields-layout__field cc-fields-layout__last-name">
      <cc-text-input placeholder="'Last name' | t"
                     ng-model="credit_card.lastName.value"
                     on-change="credit_card.lastName.onChangeCallback"
                     ng-disabled="credit_card.lastName.disabled"
                     icon="'client'"
                     ng-required="credit_card.lastName.required"
                     ng-readonly="credit_card.lastName.readonly"
                     maxlength="credit_card.lastName.maxlength"
                     valid="credit_card.lastName.valid"
                     name="'lastName'"
                     data-e2e="cc_last_name">
      </cc-text-input>
    </div>
  </div>

  <div class="cc-fields-layout__field cc-fields-layout__address">
    <cc-text-input placeholder="'Address' | t"
                   ng-model="credit_card.address.value"
                   on-change="credit_card.address.onChangeCallback"
                   ng-disabled="credit_card.address.disabled"
                   ng-required="credit_card.address.required"
                   ng-readonly="credit_card.address.readonly"
                   maxlength="credit_card.address.maxlength"
                   icon="'map'"
                   valid="credit_card.address.valid"
                   name="'address'"
                   data-e2e="cc_address">
    </cc-text-input>
  </div>
  <div class="cc-fields-layout__flex-row">
    <div class="cc-fields-layout__field cc-fields-layout__country">
      <credit-card-country-component ng-model="credit_card.country.value"
                                     ng-disabled="credit_card.country.disabled"
                                     ng-required="credit_card.country.required"
                                     ng-readonly="credit_card.country.readonly"
                                     on-change="credit_card.country.onChangeCallback"
                                     on-country-select="credit_card.country.onCountrySelect"
                                     valid="credit_card.country.valid"
                                     placeholder="'Country' | t"
                                     countries="credit_card.country.items"
                                     title="credit_card.country.title"
                                     icon="'globe'"
                                     name="'country'"
                                     data-e2e="cc_county">
      </credit-card-country-component>
    </div>
    <div class="cc-fields-layout__field cc-fields-layout__state">
      <credit-card-state-component ng-model="credit_card.state.value"
                                   ng-disabled="credit_card.state.disabled"
                                   ng-required="credit_card.state.required"
                                   ng-readonly="credit_card.state.readonly"
                                   on-change="credit_card.state.onChangeCallback"
                                   on-state-select="credit_card.state.onStateSelect"
                                   valid="credit_card.state.valid"
                                   placeholder="'State' | t"
                                   is-dropdown-shown="credit_card.state.isDropdownShown"
                                   states="credit_card.state.items"
                                   title="credit_card.state.title"
                                   icon="'map'"
                                   name="'state'"
                                   data-e2e="cc_state">
      </credit-card-state-component>
    </div>
  </div>
  <div class="cc-fields-layout__flex-row">
    <div class="cc-fields-layout__field cc-fields-layout__city">
      <credit-card-city-component ng-model="credit_card.city.value"
                                  ng-disabled="credit_card.city.disabled"
                                  ng-required="credit_card.city.required"
                                  ng-readonly="credit_card.city.readonly"
                                  on-change="credit_card.city.onChangeCallback"
                                  on-city-select="credit_card.city.onCitySelect"
                                  valid="credit_card.city.valid"
                                  placeholder="'City' | t"
                                  is-dropdown-shown="credit_card.city.isDropdownShown"
                                  cities="credit_card.city.items"
                                  title="credit_card.city.title"
                                  icon="'map'"
                                  name="'city'"
                                  data-e2e="cc_city">
      </credit-card-city-component>
    </div>

    <div class="cc-fields-layout__field cc-fields-layout__postal-code">
      <credit-card-postal-code placeholder="'ZIP/Postal code' | t"
                               ng-model="credit_card.zip.value"
                               on-change="credit_card.zip.onChangeCallback"
                               ng-disabled="credit_card.zip.disabled"
                               ng-required="credit_card.zip.required"
                               ng-readonly="credit_card.zip.readonly"
                               maxlength="credit_card.zip.maxlength"
                               valid="credit_card.zip.valid"
                               name="'zip'">
      </credit-card-postal-code>
    </div>
  </div>
  <div class="cc-fields-layout__flex-row">
    <div class="cc-fields-layout__field cc-fields-layout__phone-number">
      <cc-phone-number-component placeholder="'Phone number' | t"
                                 ng-model="credit_card.phone.value"
                                 on-change="credit_card.phone.onChangeCallback"
                                 ng-disabled="credit_card.phone.disabled"
                                 ng-required="credit_card.phone.required"
                                 ng-readonly="credit_card.phone.readonly"
                                 maxlength="credit_card.phone.maxlength"
                                 valid="credit_card.phone.valid"
                                 name="'phone'">
      </cc-phone-number-component>
    </div>
    <div class="cc-fields-layout__field"></div>
  </div>
</div>
</script>

Supported Countries

For this payment provider, Piano supports the following countries:

Supported Countries

Colombia

Please reach out to your Piano Account representative in case a country supported by this payment provider is not listed in the table above.

Supported Currency

For this payment provider, Piano supports the following currencies:

Supported Currencies

COP

USD*

*Supports USD when converted by PayU.

Note, that Piano may support only selected currencies available in the payment providers dashboard.

Supported payment methods

Piano supports the following payment methods for this payment provider:

Payment method name

Are renewals supported?

Credit card (MasterCard, Visa, Amex, Diners Club, Credito Facil Codensa, Banco de Bogota)

Yes*

PSE direct debit

No

*Recurring payments through one-step auth and capture are supported. Two-step auth and capture, as well as partial capture, is not supported.

Supported features and functionality

Feature/Functionality

Supported?

Refunds

No*

Apply Terms Wizard

Yes**

Upgrades

Yes

My Account - Add payment method

Yes**

My Account - Edit payment method

No

My Account - Delete payment method

Yes**

Publisher dashboard  - Add payment method

Yes**

Publisher dashboard  - Edit payment method

No

Publisher dashboard  - Delete payment method

Yes**

Tax Providers and Types 

Not supported

Transaction descriptors

Not supported

Frictionless

No

3DS / SCA

No

Fraud prevention

No

Passive churn prevention

Yes - Advanced support for CC

Payment token import support

Yes***

Trials

Free/Paid****

Minimum payment amount

300 COP*****

Country specific checkout fields

For PSE******

*Currently refunds are not supported.

**Not supported for PSE direct debit.

***For more information about the payment token import please visit this link.

****For free trials, we charge the minimum transaction amount (300 COP) and then immediately refund. If publishers do not have a configuration for a minimum transaction amount, then they need to set this up.

*****As per the input from PayU the minimum value allowed to process cards in Colombia is 300 COP. However, the merchant's account in PayU should be configured to allow this amount.

If this is required, the merchant must send a request to the PayU Latam customer care team through email comercios.co@payu.com, asking to configure the minimum amount required, as this needs to be done by the PayU team.

******Below is an example of the fields that are shown during checkout with PSE:

pse.jpg

Passive Churn Prevention

It's crucial to understand how the various error codes that may arise during a payment failure are handled by the Passive Churn Prevention feature. These error codes provide insights into why a renewal attempt may have failed, enabling you to take appropriate actions to prevent churn. This section details the specific error codes encountered during a payment failure and their mapping to a decline reason.

Decline reason

Error codes

Suspected fraud

ANTIFRAUD_REJECTED

BANK_FRAUD_REJECTED

Insufficient funds

INSUFFICIENT_FUNDS

Expired card

EXPIRED_CARD

Card is stolen or lost

RESTRICTED_CARD

Limit exceeded

EXCEEDED_AMOUNT

Network failure

PAYMENT_NETWORK_REJECTED

PAYMENT_NETWORK_NO_CONNECTION

PAYMENT_NETWORK_NO_RESPONSE

3DS failure

-

Call issuer

CONTACT_THE_ENTITY

Do not honor

NOT_ACCEPTED_TRANSACTION

INVALID_CARD

Everything else

All error codes not listed above

How to integrate PayU Latam Colombia with Piano

Credit Cards

In case you're a merchant from Colombia, please go to Edit Business → Payment Provider → PayU Colombia and click on Add New.

Enter your payment provider credentials in the available fields and pick a title for your configuration as shown below. If you would like to offer also renewal support, select On in the Status field and fill in the Renewal application's details. If you don't want to support renewals, select the option Off.

pp-columbia.png

  • Title of configuration: The name of your configuration. This name will not be exposed to your users.

  • App ID: The App ID from your PayU account.

  • Public API key: The Public API key from your PayU account.

  • Private API Key: The Private API key from your PayU account.

    pp-columbia1.png

  • Available currency: The only currency available for this configuration is COP (Colombian Peso).

Click Save to add this payment provider once you've finished the configuration.

If you need to retrieve additional transaction details that are passed to PayU during checkout, you can do so using the PaymentsOS API. For more details, see this FAQ.

PSE Direct Debit

To add PSE Direct Debit as a payment method, please go to Edit BusinessPayment ProviderPayU Colombia PSE and click on Add New.

pse.png

Fill in the same configuration fields as for PayU Colombia Credit Cards and add the following fields:

  • PayU Latam API key: Enter your PayU Latam API key.

  • PayU Latam API login:  Enter your PayU Latam API login.

In addition, a new webhook with your website needs to be configured in the PaymentsOS control panel under AccountWebhooksCreate a Webhook endpoint.

The webhook URL to be added is:

https://buy.tinypass.com/ipn/paymentsos - for the Production environment
https://sandbox.tinypass.com/ipn/paymentsos - for the Sandbox environment

Important: The full.redirect.3ds.enabled option should be enabled by Admin (in Application Settings).

If you need to retrieve additional transaction details that are passed to PayU during checkout, you can do so using the PaymentsOS API. For more details, see

this FAQ

.

Last updated: