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 Manage → Templates 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 && 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:
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.
-
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.
-
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 Business → Payment Provider → PayU Colombia PSE and click on Add New.
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 Account → Webhooks → Create 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
.