Skip to main content

API wrapper for Payu written in Python

Project description

# payu-python

payu-python is an API wrapper for Payu written in Python. Currently only works for supported credit cards in the supported countries in Latam.

Supported countries:
* Argentina
* Brazil
* Chile
* Colombia
* Mexico
* Panama
* Peru
* Chile

Read [Utils](https://github.com/GearPlug/payu-python#utils) section to find out how to get the supported credit cards for a country.

Read [TODO](https://github.com/GearPlug/payu-python#todo) section to find out what's missing in this library.


## Installing
```
pip install payu-python
```

## Django implementation

If you are going to use this with your Django application, we recommend you to use our django implementation:

[django-payu-latam](https://github.com/GearPlug/django-payu-latam)

## Usage

### Client instantiation in sandbox mode (test)
```
TEST_API_LOGIN = 'pRRXKOl8ikMmt9u'
TEST_API_KEY = '4Vj8eK4rloUd272L48hsrarnUA'
TEST_MERCHANT_ID = 508029
TEST_ACCOUNT_ID = 512321

client = Client(TEST_API_LOGIN, TEST_API_KEY, TEST_MERCHANT_ID, TEST_ACCOUNT_ID, test=True, language='en', debug=True)
```

### Example data for sandbox mode
```
BUYER_EXAMPLE = {
"merchantBuyerId": "1",
"fullName": "First name and second buyer name",
"emailAddress": "buyer_test@test.com",
"contactPhone": "7563126",
"dniNumber": "5415668464654",
"shippingAddress": {
"street1": "calle 100",
"street2": "5555487",
"city": "Medellin",
"state": "Antioquia",
"country": "CO",
"postalCode": "000000",
"phone": "7563126"
}
}

PAYER_EXAMPLE = {
"merchantPayerId": "1",
"fullName": "First name and second payer name",
"emailAddress": "payer_test@test.com",
"contactPhone": "7563126",
"dniNumber": "5415668464654",
"billingAddress": {
"street1": "calle 93",
"street2": "125544",
"city": "Bogota",
"state": "Bogota DC",
"country": "CO",
"postalCode": "000000",
"phone": "7563126"
}
}

CREDIT_CARD_EXAMPLE = {
"number": "4097440000000004",
"securityCode": "321",
"expirationDate": "2022/12",
"name": "APPROVED"
}

EXTRA_EXAMPLE = {
"INSTALLMENTS_NUMBER": 1
}
```

### Payments Module

#### Ping service
```
r = client.payments.ping()
```

#### Get payments method
```
r = client.payments.get_payments_methods()
```

#### Make a payment (AUTHORIZATION AND CAPTURE)
```
r = client.payments.make_payment(reference_code='TestPayU01', description='Test Payment', tx_value=1000, tx_tax=0,
tx_tax_return_base=0, currency='COP', buyer=BUYER_EXAMPLE, payer=PAYER_EXAMPLE,
credit_card=CREDIT_CARD_EXAMPLE, payment_method='VISA', payment_country='CO',
device_session_id='vghs6tvkcle931686k1900o6e1',
ip_address='127.0.0.1', cookie='pt1t38347bs6jc9ruv2ecpv7o2',
user_agent='Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0',
extra_parameters=EXTRA_EXAMPLE,
notify_url='https://ed60769e.ngrok.io/payu/notification/')
```

#### Make authorization (ONLY AUTHORIZATION)
```
r = client.payments.make_authorization(reference_code='TestPayU02', description='Test Payment', tx_value=1000, tx_tax=0,
tx_tax_return_base=0, currency='COP', buyer=BUYER_EXAMPLE, payer=PAYER_EXAMPLE,
credit_card=CREDIT_CARD_EXAMPLE, payment_method='VISA', payment_country='CO',
device_session_id='vghs6tvkcle931686k1900o6e1',
ip_address='127.0.0.1', cookie='pt1t38347bs6jc9ruv2ecpv7o2',
user_agent='Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0',
extra_parameters=EXTRA_EXAMPLE,
notify_url='https://ed60769e.ngrok.io/payu/notification/')
```

#### Make capture (ONLY CAPTURE)
```
r = client.payments.make_capture(order_id='844928300', parent_transaction_id='4d7f240d-084a-426f-aa27-42c3b2a2b265')
```

#### Refund a payment
```
r = client.payments.refund_payment(order_id='844928300', parent_transaction_id='4d7f240d-084a-426f-aa27-42c3b2a2b265',
reason='Client asked for refund.')
```

### Tokenization Module

#### Create a single token
```
r = client.tokenization.create_single_token(payer_id='1', name='Full name', identification_number='32144457',
payment_method='VISA', number='4111111111111111', expiration_date='2022/01')
```

#### Make a payment
```
r = client.tokenization.make_payment(reference_code='TestPayU03', description='Test Payment', tx_value=1000,
currency='COP', buyer=BUYER_EXAMPLE, payer=PAYER_EXAMPLE, payment_method='VISA',
payment_country='CO', device_session_id='vghs6tvkcle931686k1900o6e1',
ip_address='127.0.0.1', cookie='pt1t38347bs6jc9ruv2ecpv7o2',
user_agent='Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0',
credit_card_token_id='b01877c3-b044-455a-99f5-82aed33795e9')
```

#### Make authorization (ONLY AUTHORIZATION)
```
r = client.tokenization.make_authorization(reference_code='TestPayU03', description='Test Payment', tx_value=1000,
currency='COP', buyer=BUYER_EXAMPLE, payer=PAYER_EXAMPLE, payment_method='VISA',
payment_country='CO', device_session_id='vghs6tvkcle931686k1900o6e1',
ip_address='127.0.0.1', cookie='pt1t38347bs6jc9ruv2ecpv7o2',
user_agent='Mozilla/5.0 (Windows NT 5.1; rv:18.0) Gecko/20100101 Firefox/18.0',
credit_card_token_id='b01877c3-b044-455a-99f5-82aed33795e9')
```

#### Make capture (ONLY CAPTURE)
```
r = client.tokenization.make_capture(order_id='844928300', parent_transaction_id='4d7f240d-084a-426f-aa27-42c3b2a2b265')
```

#### Get tokens for a payer (for the last year)
```
import datetime

r = client.tokenization.get_tokens(payer_id='1', credit_card_token_id='b65c63e9-ec0c-49ac-a67d-1414c3dc3ccc',
start_date=datetime.datetime.now().replace(year=2017),
end_date=datetime.datetime.now()))
```

#### Remove a token
```
r = client.tokenization.remove_token(payer_id='1', credit_card_token_id='d70889d2-0f82-482d-a2ed-3c0a2813d57c')
```

### Recurring Payments Module

#### Create a plan
```
r = client.recurring.create_plan(plan_code='PLAN_CODE', description='Test Plan', interval='MONTH', interval_count=1,
max_payments_allowed=12, payment_attempts_delay=1, plan_value=1000, plan_tax=0,
plan_tax_return_base=0, currency='COP')
```

#### Get a plan
```
r = client.recurring.get_plan('PLAN_CODE')
```

#### Remove a plan
```
r = client.recurring.delete_plan('PLAN_CODE')
```

#### Create a customer
```
r = client.recurring.create_customer(full_name='Full name', email='customer_test@test.com')
```

#### Get a customer
```
r = client.recurring.get_customer('CUSTOMER_ID')
```

#### Delete a customer
```
r = client.recurring.delete_customer('CUSTOMER_ID')
```

#### Create a credit card
```
r = client.recurring.create_credit_card(customer_id='CUSTOMER_ID', name'Full name', document='32144457',
number='4111111111111111', exp_month='01', exp_year='2022', type='VISA',
address='calle 93 125544 Bogota')
```

#### Get a credit card
```
r = client.recurring.get_credit_card('CREDIT_CARD_ID')
```

#### Delete a credit card
```
r = client.recurring.delete_credit_card(customer_id='CUSTOMER_ID', credit_card_id='CREDIT_CARD_ID')
```

#### Create a subscription
```
r = client.recurring.create_subscription(customer_id='CUSTOMER_ID', credit_card_token='CREDIT_CARD_ID',
plan_code='PLAN_CODE')
```

#### Get a subscription
```
r = client.recurring.get_subscription('SUBSCRIPTION_ID')
```

#### Update a subscription
```
r = client.recurring.update_subscription(subscription_id='SUBSCRIPTION_ID', credit_card_token='CREDIT_CARD_TOKEN')
```

#### Delete a subscription
```
r = client.recurring.delete_subscription('SUBSCRIPTION_ID')
```

#### Create an additional charge
```
r = client.recurring.create_additional_charge(subscription_id='SUBSCRIPTION_ID', description='TEST CHARGE',
plan_value=1000, plan_tax=0, plan_tax_return_base=0,
currency='COP')
```

#### Get an additional charge by identifier
```
r = client.recurring.get_additional_charge_by_identifier('RECURRING_BILLING_ID')
```

#### Get an additional charge by description
```
r = client.recurring.get_additional_charge_by_description('DESCRIPTION')
```

#### Get an additional charge by subscription
```
r = client.recurring.get_additional_charge_by_subscription('SUBSCRIPTION_ID')
```

#### Update an additional charge
```
r = client.recurring.update_additional_charge(recurring_billing_id='RECURRING_BILLING_ID', description='TEST CHARGE',
plan_value=1000, plan_tax=0, plan_tax_return_base=0, currency='COP')
```

#### Delete an additional charge
```
r = client.recurring.delete_additional_charge('RECURRING_BILLING_ID')
```

#### Get recurring bill by client
```
import datetime

r = client.recurring.get_recurring_bill_by_client(customer_id='CUSTOMER_ID',
date_begin=datetime.datetime.now().replace(year=2017),
date_final=datetime.datetime.now())
```

#### Get recurring bill by subscription
```
r = client.recurring.get_recurring_bill_by_subscription('SUBSCRIPTION_ID')
```

### Queries Module

#### Get order by identifier
```
r = client.queries.get_order_by_identifier('ORDER_ID')
```

#### Get order by reference code
```
r = client.queries.get_order_by_reference('REFERENCE_CODE')
```

#### Get order by transaction
```
r = client.queries.get_transaction_response('TRANSACTION_ID')
```

## Utils

#### Get supported credit cards for payments in a country
```
from payu.utils import get_available_franchise_for_payment
from payu.enumerators import Country, TransactionType

r = get_available_franchise_for_payment(Country.COLOMBIA, TransactionType.AUTHORIZATION)
r = get_available_franchise_for_payment(Country.COLOMBIA, TransactionType.AUTHORIZATION_AND_CAPTURE)
```

#### Get supported credit cards for tokenization in a country
```
from payu.utils import get_available_franchise_for_tokenization
from payu.enumerators import Country, TransactionType

r = get_available_franchise_for_tokenization(Country.COLOMBIA, TransactionType.AUTHORIZATION)
r = get_available_franchise_for_tokenization(Country.COLOMBIA, TransactionType.AUTHORIZATION_AND_CAPTURE)
```

#### Check if tokenized payment needs credit card CVV
```
from payu.utils import has_franchise_cvv_tokenization
from payu.enumerators import Country, Franchise, TransactionType

r = get_available_franchise_for_tokenization(Franchise.VISA, Country.COLOMBIA, TransactionType.AUTHORIZATION_AND_CAPTURE)
```

## TODO

### Payments
* cancel_payment()
* Support for cash / bank payment methods
* Support for bank transfer methods

### Tokenization
* create_multiple_tokens()
* make_multiple_payments()

### Recurring Payments
* update_plan()
* update_customer()
* update_credit_card()

## Requirements
* [requests](https://github.com/requests/requests)

## Contributing
We are always grateful for any kind of contribution including but not limited to bug reports, code enhancements, bug fixes, and even functionality suggestions.

#### You can report any bug you find or suggest new functionality with a new [issue](https://github.com/GearPlug/payu-python/issues).

#### If you want to add yourself some functionality to the wrapper:
1. Fork it ( https://github.com/GearPlug/payu-python )
2. Create your feature branch (git checkout -b my-new-feature)
3. Commit your changes (git commit -am 'Adds my new feature')
4. Push to the branch (git push origin my-new-feature)
5. Create a new Pull Request

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

payu-python-0.1.5.tar.gz (14.5 kB view details)

Uploaded Source

File details

Details for the file payu-python-0.1.5.tar.gz.

File metadata

  • Download URL: payu-python-0.1.5.tar.gz
  • Upload date:
  • Size: 14.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.0 setuptools/32.3.1 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/3.6.7

File hashes

Hashes for payu-python-0.1.5.tar.gz
Algorithm Hash digest
SHA256 2d68c17f55dbafa51d20705de76760c103c8342e1b440938d3f0145d6948e946
MD5 7465e3d21bdd8647f6df70072e1b2399
BLAKE2b-256 06a64f480862d5a29f6458c836a72c79260aedee72bc8b25b2bfedf579a4e420

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page