API Reference NAV Navbar
curl php node.js

Introduction

The Uviba API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.

You can use the Uviba API in test mode, which does not affect your live data. The API key you use to authenticate the request determines whether the request is the live mode or test mode.

API libraries

Official libraries for the Uviba API are available in several languages.

Setup

Library Installation

**compile**
Download <a target="_blank" href="https://github.com/uviba/uvipay-php/" style="color: #0099e5;text-decoration: none;border: none;">php library</a> from here <a href="https://github.com/uviba/uvipay-node/archive/master.zip" target="_blank" style="
    background: #0f75d4;
    border: none;
    padding: 4px 14px;
    border-radius: 3px;
">Download</a>

npm i uvipay --save

To setup you need to do just 4 things:

Official libraries for the Uviba API are available in several languages. You can install our libraries via codes or from links below:

JavaScript (Node.js): https://github.com/uviba/uvipay-node/archive/master.zip

PHP: https://github.com/uviba/uvipay-php/archive/master.zip

Authentication

Example request:

$ curl https://api.uviba.com/pay/v1/balance \
  -u your_private_key:
    # The colon prevents curl from asking for a password.

<?php 
use \Uviba\UviPay;
include 'UviPay/init.php'; //path/to/UviPay library
UviPay::setPrivateKey('your_private_key');
const uvipay = require('./uvipay')('your_private_key');

The Uviba API uses API keys to authenticate requests. You can view and manage your API keys in the Uviba Dashboard.

Test mode secret keys have the prefix sk_test_, public keys have the prefix pk_test_, and live mode secret keys have the prefix sk_live_, public keys have the prefix pk_live_.

Your API keys carry many privileges, so be sure to keep them secure! Do not share your secret API keys in publicly accessible areas such as GitHub, client-side code, and so forth.

Authentication to the API is performed via HTTP Basic Auth. Provide your API key as the basic auth username value. You do not need to provide a password.

Errors

Example error response:

{
"status":false,
"error":{
    "message":"Description of error"
    }
}

Handling errors:

<?php 
//any library function, process will contain json
$process = UviPay::get_balance(); //any library function
if($process['status']){
    //success
}else{
    //error
    echo $process['error']['message'];
}
//any library function, process will contain json
const res =  uvipay.get_balance().then(function (response) {
   if(response.status){
     //success
   }else{
     //error
     console.log(response.error.message);
   }
});

The Uviba API always returns json object, and inside of it, there always will be status variable. If status is not true, there will be an error object: "error":{"message":"Description of error"}. You can use this object to show the error.

Payment Button

Adding button:

<form   action="your-server-side-code" method="post"  >
 <script 
    src="https://api.uviba.com/js/checkout.js" 
    class="uviPay-button" 
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
    data-submit-ajax="1">
 </script>
</form>

Result :

**compile**
<form   action="your-server-side-code" method="post"  >
 <script 
    src="https://api.uviba.com/js/checkout.js" 
    class="uviPay-button"
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
    data-submit-ajax="1">
 </script>
</form>

There are two integration ways. One is a button, and another is inline integration. This section will explain button integration. Copy html code, and put it into the page that you want to charge your customer. This will insert button inside of the form.

How it works


<form   action="your-server-side-code" method="post"  >
 <div 
    class="uviPay-button" 
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
    data-submit-ajax="1">
 </div>
</form>

<script type="text/javascript" src="https://api.uviba.com/js/checkout.js" ></script>

Result:

**compile**
<form   action="your-server-side-code" method="post"  >
 <div 
    class="uviPay-button" 
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
    data-submit-ajax="1">
 </div>
</form>

<script type="text/javascript" src="https://api.uviba.com/js/checkout.js" ></script>

Using Button Attributes, you can customize what users see as a button text, amount, item image, description when they pay. You can also set email which will be used to inform them about payment, change the behavior of button such as making it subscription payment, or submitting payment using ajax instead of loading new page.

Button Attributes

Attribute Description
data-submit-ajax If you set this to 1, form will be submitted via ajax, otherwise will be submitted without ajax.
class This should be uviPay-button.
data-public_key Insert your public key here to authorize.
data-amount It shows how many cents you will charge user. (100 = $1.00). Calculate your currency and convert it into cents.
data-amount_string Setting this attribute will allow you to show custom string to the user when they pay. You can use this function to show users how much in which currency they will be charged. In Payment page it will work like this: Pay {data-amount_string}. E.g., Pay 50 EURO, but user will pay data-amount cents. Make sure they are equal.
data-email This allows you to set email address for customers and should be valid email. Uviba will use this attribute to prevent you from chargebacks
data-name This should be the name of your business that customers will recognize. They will see it after they click to pay.
data-description Please write description of product, or if not possible, just general description of user's payment.
data-image Set it to url of image of the product or your business's logo.
data-verify This param should be used when you only want to verify the card instead of charging it. For now, this only accepts "verify_card" string, and then it will verify the card.
data-no-button This will hide the button completely, and will allow you to create your own button.

Setup Subscriptions

Extra Button Attributes for Subscriptions


<form   action="your-server-side-code" method="post"  >
 <script 
    src="https://api.uviba.com/js/checkout.js" 
    class="uviPay-button"
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
        data-subscription="true"
        data-subs_trial_days="14"
        subs_package_name="Company X PRO PLAN"
        data-subs_plan="monthly"
        data-button-text="Subscribe"
    data-submit-ajax="1">
 </script>
</form>

Result:

**compile**
<form   action="your-server-side-code" method="post"  >
 <script 
    src="https://api.uviba.com/js/checkout.js" 
    class="uviPay-button"
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
        data-subscription="true"
        data-subs_trial_days="14"
        data-subs_plan="monthly"
        data-button-text="Subscribe"
        data-subs_package_name="Company X PRO PLAN"
    data-submit-ajax="1">
 </script>
</form>

Attributes below should be used to create subscription (e.g. user pay each month/year) charges, but also in the back you should send them in charge method.

Attribute Description
data-subscription It takes true/false . If you set it to true, you will activate subscription mode, which means the user will pay monthly or yearly, not a one-time payment.
data-subs_trial_days In subscription mode, you can use this attribute to set trial days for users, so they will not pay until that time. E.g., if you set this to 7, they will be charged after 7 days.
data-subs_plan It takes monthly/yearly. Right after the first trial, it will begin to charge customers monthly/yearly.
subs_package_name What is the package - item - name that customer will subscribe for.

Customization & Callbacks

<form   action="your-server-side-code" method="post">
 <button data-amount="100"
    class="uviPay-button" 
    data-button-text="Button 1"></button>
</form>
<form   action="your-server-side-code" method="post">
 <button data-amount="200"
    class="uviPay-button" 
    data-button-text="Button 2"></button>
</form>
<script src="https://api.uviba.com/js/checkout.js" 
    data-public_key="your_public_key"
    data-description="description of item"
    data-name="Company Name" 
    data-image="Your logo url"
    data-submit-ajax="1" >
 </script><script>UviPay.render_buttons();</script>

Result:

**compile**
<form   action="your-server-side-code" method="post">
 <button data-amount="100"
    class="uviPay-button" 
    data-button-text="Button 1"></button>
</form>
<form   action="your-server-side-code" method="post">
 <button data-amount="200"
    class="uviPay-button" 
    data-button-text="Button 2"></button>
</form>
<script src="https://api.uviba.com/js/checkout.js" 
    data-public_key="your_public_key"
    data-description="description of item"
    data-name="Company Name" 
    data-image="Your logo url"
    data-submit-ajax="1" >
 </script><script>UviPay.render_buttons();</script>

You can build your own button designs, create multiple payment button in one page or let users enter the amount to pay using callbacks in javascript - UviPay Object.

Our javascript library (script tag you called) always gives you UviPay Javascript object that you can use to control payment flow, callbacks.

Multiple Buttons

If you need more than one button just add button code multiple times, and then use UviPay.render_buttons(); function at the end.

Callbacks


<script type="text/javascript">
UviPay.onModalClose(function(form_id,uviPay_response,user_did){
  if(user_did){
    console.log('user clicked close button and payment windows closed');
  }else{
    console.log('payment window closed because user finished payment successfully');
  }
});


UviPay.onPaymentSucceed(function(form_id,UvibaToken){
  //if you add here return false, 
  //our API will not submit the form
    //so you can store UvibaToken, and sent it to backend later
});
</script>

To build custom functionality, you can use callbacks as UviPay.on{EventName}. form_number argument will be included in each function which represent, in which form event happened. Here is the list of callbacks you can use:

Function Arguments Description
UviPay.onButtonReady form_number This function will be called when button that is connected to form_number is rendered.
UviPay.onModalClose form_num, user_did, server_data This function will be called when modal (Our Payment Screen) is closed. If user_did is true, then the user closed the Modal; otherwise, it closed automatically because the user made a successful purchase.
UviPay.onPaymentSucceed form_num, UvibaToken This function will be called when modal is closed, and we prepare the form data to submit to your server. If you add return false; inside of it, the form will not be submitted. You can take UvibaToken and send it to your backend to collect the payment - if you didn't add return false; we will send it to your backend automatically.
UviPay.onAjaxSuccess form_num, your_server_data This Ajax Request will happen only when you set data-submit-ajax=1 and will be called when request to your server is successful.
UviPay.onAjaxFailed form_num This Ajax Request will happen only when you set data-submit-ajax=1 and will be called when request fails due to your server errors.

Custom Buttons

Example of custom amounts and buttons:


<input class="bluef inputtext" type="text" max="99999999" 
name="" placeholder="Enter Amount" onkeyup="
var amount_val = $(this).val();
var max_amount = 99999999;
if(!$.isNumeric(amount_val) && $.trim(amount_val)!='' ){
amount_val=old_typed_money;
$(this).val(old_typed_money);
}
if(parseInt(amount_val)>max_amount){
$(this).val(old_typed_money);
amount_val=old_typed_money;
}
if($.trim(amount_val)==''){
amount_val=0;
}
old_typed_money=amount_val;
Uviba_amountInCents=amount_val*100;
$('.uviPay-button').attr('data-amount',Uviba_amountInCents);
$('.CustomuvibaForm').attr('action','your-server-url'+'?value='+Uviba_amountInCents);
                                    ">
<form action="your-server-url?value=0" class="CustomuvibaForm" method="post">
<script src="https://api.uviba.com/js/checkout.js" class="uviPay-button"
data-public_key="your_public_key" data-amount="0"
data-description="Enter Card Details" data-name="Company Name" 
data-submit-ajax="1" data-no-button=true>
                                    </script>

<div  onclick="uviPay_openPaymentModal(1);event.preventDefault();"  class="btndiv">
<button class="btnpop">Increase Balance</button></div>
                                    </form>

Result:

**compile**
<style>
.btndiv {
 height:100px; 
 margin-top:10px;
 margin-bottom:10px;
}

.btnpop {
    background: #3777c4;
    position: relative;
    padding: 12px 26px;
    border-top: 0px;
    border-left: 0px;
    border-right: 0px;
    border-bottom: 10px solid #265388;
    color: white;
    font-size: 17px;
    font-family: Lucida Sans Unicode, sans-serif;
    vertical-align: middle;
    -webkit-border-radius: 15px;
    -moz-border-radius: 15px;
    border-radius: 15px;
    -webkit-box-shadow: 0px 1px 15px 1px #999999;
    box-shadow: 0px 1px 15px 1px #999999;
    transition: all 0.1s;
}
.btnpop:hover { 
  top: -1px; 
  border-bottom: 12px solid #265388; 
  background: #4984cc;
}
.btnpop:active { 
  top: 8px; 
  border-bottom: 2px solid #265388;
  background: #4984cc; 
  -webkit-box-shadow:none;
  box-shadow:none;
}
</style>
<input style="cursor:text;padding: 2px 8px;width: 99px;padding: 6px 14px;margin-right: 7px;width: 233px;color: #1b293c;"
class="bluef inputtext" type="text" max="99999999" 
name="" placeholder="Enter Amount" onkeyup="
var amount_val = $(this).val();
var max_amount = 99999999;
if(!$.isNumeric(amount_val) && $.trim(amount_val)!='' ){
amount_val=old_typed_money;
$(this).val(old_typed_money);
}
if(parseInt(amount_val)>max_amount){
$(this).val(old_typed_money);
amount_val=old_typed_money;
}
if($.trim(amount_val)==''){
amount_val=0;
}
old_typed_money=amount_val;
Uviba_amountInCents=amount_val*100;
$('.uviPay-button').attr('data-amount',Uviba_amountInCents);
$('.CustomuvibaForm').attr('action','your-server-url'+'?value='+Uviba_amountInCents);
                                    ">
<form action="your-server-url?value=0" class="CustomuvibaForm" method="post">
<script src="https://api.uviba.com/js/checkout.js" class="uviPay-button"
data-public_key="your_public_key" data-amount="0"
data-description="Enter Card Details" data-name="Company Name" 
data-submit-ajax="1" data-no-button=true></script>
<div  onclick="uviPay_openPaymentModal(1);event.preventDefault();"  class="btndiv">
<button class="btnpop">Increase Balance</button></div>
                                    </form>

You can build your own payment button from scratch with your own rules.

1) Add data-no-button attribute into the element that have uviPay-button class.

2) Build your button and as an onclick event add uviPay_openPaymentModal(form_num). form_num should be the number of form; You can see it by just refreshing the page once and looking at HTML code from browser console.

Additionally, if you want to use JSON data to create fields for payment form submission you can use UviPay.addFields(JSON_DATA,form_num,{'input_type':'hidden|text'});.

Inline Integration

There are two integration ways. One is a button, and another is inline integration. This section will explain inline integration.

Usually, inline integrations should be inside of some form, so you can submit it to the server. Purpose of this integration is token that will be generated from payment information, so you can add it to the form and then send it to your server to process payment. You need to have one <div></div> element, and with CSS, it should look like all other input fields. Then let's give it some random id called a. Our iframe will be inside of it.



<style type="text/css">
    #a{margin-bottom: 4px;
    height: 16px;
    padding: 8px;
    border-radius: 2px;
    box-shadow: 0 1px 2px rgba(0,0,0,0.16), 0 1px 2px rgba(0,0,0,0.23);
    border-top: 1px solid #ccc;
        width: 260px;
    }
   </style>

<form>

<div id="a"></div>
<button id="example_submit_button"
onclick="
//we will add code here later.
"
>Submit</button>
</form>

Setup Scripts

Now we need to add script tags, set API key, and insert iframe.


<script src="https://api.uviba.com/js/checkout.js"></script>
<script type="text/javascript">
    var style='body{}'; //insert style tag inside of iframe.
    UviPay.setKey('your_public_key');
    var element_num = UviPay.createElement('#a',{style:style,amount:100});
    //We will use element_num to create token for that specific element
</script>


Create Token

Now when customer clicks submit button on the form, we need to create the token, and then insert it to the form as an hidden input name UvibaToken.


<button id="example_submit_button"
onclick="

UviPay.createElementToken(element_num,function(data){

        if(data.status){
            //success
            //data.token is UvibaToken that you can use to process charges; you need to insert it into this form.
      //then submit the form. Please look at the Charges section to see what to write on the server-side.
        }else{
          //error
            //you can receive error message using data.error.message, then show it to the user.
        }
    });
"
>Submit</button>

Result :

**compile**
   <style type="text/css">
    #a{margin-bottom: 4px;
    height: 16px;
    padding: 8px;
    border-radius: 2px;
    box-shadow: 0 1px 2px rgba(0,0,0,0.16), 0 1px 2px rgba(0,0,0,0.23);
    border-top: 1px solid #ccc;
        width: 260px;background: white;
    }
   </style>
<div id="a"></div>
<button style="
    color: black;
    padding: 5px 22px;
    border-radius: 5px;
    border: none;
"
onclick="
UviPay.createElementToken(element_num,function(data){
            console.log(data);

        if(data.status){
            //console.log(data);
        }else{
            //
        }
    });
"
>Submit</button>
    <script src="https://api.uviba.com/js/checkout.js"></script>
<script type="text/javascript">
    var style='body{}';
    var element_num=false;
    var t_u1 = setInterval(function(){
    if(typeof UviPay != "undefined" && UviPay !== null && UviPay !== false){
    clearInterval(t_u1);
    UviPay.setKey('pk_test_092896ddb928834ac61b69ba2f2585c5');
    element_num = UviPay.createElement('#a',{style:style,amount:100});
    }

    },100);
</script>

Charges

Charging user, considering form method was post:

$ curl https://api.uviba.com/pay/v1/charges \
  -u your_private_key:
    -d token="exampleTokenasiqwysaysnUAas_1"
    -d amount=10000
    # The colon prevents curl from asking for a password.

<?php 
use \Uviba\UviPay;
include 'UviPay/init.php'; //path/to/UviPay library
UviPay::setPrivateKey('your_private_key');


$process = UviPay::charge(
array(
'amount'=>10000,
//If request was post
'token'=>$_POST['UvibaToken'],
)
);
if($process['status']){
//success
$charge_id = $process['id'];
}else{
//error
echo $process['error']['message'];
}

const uvipay = require('./uvipay')('your_private_key');

const res =  uvipay.charge({
//If request was post, and request.body contains post data
token:request.body.UvibaToken,
amount:10000,
}).then(function (response) {
   if(response.status){
       //success
     console.log(response.id);
   }else{
       //error
     console.log(response.error.message);
   }
});

Create a file that your server-side codes will run (the file URL should be the same with action attribute of form tag).

Charge Function

Here is charge function params:

Parameter type Description
token required token of the charge that came from payment form submission.
amount required it shows how much money you want to charge. It should match with front end code.
verify optional Accepts verify_card, and when you do that, it will not charge the card, it will just verify that it is valid card.
subscription optional It could be true/false. Default is false which means one time charge. If you set it to true, user will pay each month/year.
subs_plan required if subscription is true It accepts monthly/yearly. Right after the first trial, it will begin to charge customers monthly/yearly. It should be the same with frontend's - button's - data-subs_plan attribute.
trial_days optional In subscription mode, you can use this attribute to set trial days for users, so they will not pay until that time. E.g., if you set this to 7, they will be charged after 7 days. It should be the same with frontend's - button's - data-subs_trial_days attribute.
triggers optional but strongly recommended if subscription is true In subscription mode, you should send trigger array/object. It will send you request, if trial ended, request failed, or successed.
triggers.success_url optional the url that we will send request when customer paid subscription fee for next month/year.
triggers.success_custom_data optional custom data you want us to send on successful payment
triggers.fail_url optional url that we will inform you when customer failed to pay subscription fee for next month/year.
triggers.fail_custom_data optional custom data you want us to send on failed payment
triggers.trial_end_url optional the url that we will send request when trial ends.
triggers.trial_end_custom_data optional custom data for trial end requestes.

Response Explanation

Example response from our server for successful charge:

{
  "status": true,
  "id": "ch_84.5730ceeb6d96ea1d1ab0e455eadf3b47",
  "card_id": "card_",
  "currency": "usd",
  "amount": 10000,
  "profit": 9630,
  "profit_in_bonus": 370,
  "paid": true,
  "email": "[email protected]",
  "created": "1552213902",
  "live": false,
  "source": {
        "type":"card",
    "brand": "Visa",
    "country": "US",
    "last4": "4242",
    "exp_month": 4,
    "exp_year": 2042,
    "funding": "credit",
    "cvc_check": "pass"
  }
}
Parameter Description
status could be true/false . If it is true, there is no error.
id This shows the ID of the charge, and you can use it to issue refund, or cancel subscription (if it is subscription payment) for this specific charge.
card_id This is id of the card that is being charged. It will return card_id when you do verify_card request, and you will be able to use that card number when you send payment in the future. Soon we will allow you to store card_id to charge them later.
currency in which currency charge is being made.
profit_in_bonus How much uvidollars, Uviba helped you to earn.
paid It could be true/false. It could be false when you do subscription charge, and allow user not to pay upfront.
live Request mode; false means test mode.
source source of the charge. This is the object that shows details of the source.
source.type this shows type of the source. E.g. card, paypal, ach.
source.funding If source.type was card, then source.funding represents card type: credit/debit.

Refunds

Refund:

$ curl https://api.uviba.com/pay/v1/refunds \
  -u your_private_key:
    -d charge="ch_84.5730ceeb6d96ea1d1ab0e455eadf3b47"

<?php 
use \Uviba\UviPay;
include 'UviPay/init.php'; //path/to/UviPay library
UviPay::setPrivateKey('your_private_key');

//charge_id comes from charge functions.
$charge_id = "ch_84.5730ceeb6d96ea1d1ab0e455eadf3b47"; 
//if amount is not defined, it will do full refund.
$process = UviPay::refund({charge:$charge_id,amount:1000});
if($process['status']){
//success;
}else{
//error
echo $process['error']['message'];
}

const uvipay = require('./uvipay')('your_private_key');

//charge_id comes from charge functions.
charge_id = "ch_84.5730ceeb6d96ea1d1ab0e455eadf3b47"; 
//if amount is not defined, it will do full refund.
const res =  uvipay.refund({charge:charge_id,amount:1000}).then(function (response) {
   if(response.status){
       //success
   }else{
       //error
     console.log(response.error.message);
   }
});

{
  "status": true
}

Doing refund is easy, you just need charge id that got when using charge function, and how much cents you want to refund.

Subscriptions

FrontEnd example code:

<form   action="your-server-side-code" method="post"  >
 <script 
    src="https://api.uviba.com/js/checkout.js" 
    class="uviPay-button"
    data-public_key="your_public_key"
    data-amount="10000"
    data-description="description of item"
    data-name="Item name" 
    data-image="Item or your picture,logo"
        data-subscription="true"
        data-subs_trial_days="14"
        subs_package_name="Company X PRO PLAN"
        data-subs_plan="monthly"
        data-button-text="Subscribe"
    data-submit-ajax="1">
 </script>
</form>

Backend example code:

$ curl https://api.uviba.com/pay/v1/charges \
  -u your_private_key:
    -d token="exampleTokenasiqwysaysnUAas_1"
    -d amount=10000
    -d subscription=true
    -d subs_plan=monthly
    -d triggers[success_url]='http://example.com/webhooks?success=true'
    -d triggers[success_custom_data][user_id]='custom_id'
    -d triggers[fail_url]='http://example.com/webhooks?fails=true'
    -d triggers[fail_custom_data][user_id]='custom_id'
    -d triggers[trial_end_url]='http://example.com/webhooks?trialend=true',
    -d triggers[trial_end_custom_data][user_id]='custom_id'
<?php
use \Uviba\UviPay;
include 'UviPay/init.php'; //path/to/UviPay library
UviPay::setPrivateKey('your_private_key');

$process = UviPay::charge(
array(
'amount'=>10000,
//If request was post
'token'=>$_POST['UvibaToken'],
'subscription'=>true,
'subs_plan'=>'monthly',
'triggers'=>array(
    'success_url'=>'http://example.com/webhooks?success=true',
    'success_custom_data'=>array('user_id'=>'custom_id'),
    'fail_url'=>'http://example.com/webhooks?fails=true',
    'fail_custom_data'=>array('user_id'=>'custom_id'),
    'trial_end_url'=>'http://example.com/webhooks?trialend=true',
    'trial_end_custom_data'=>array('user_id'=>'custom_id'),
),
  ));
if($process['status']){
//success
$charge_id = $process['id'];
}else{
//error
echo $process['error']['message'];
}
const uvipay = require('./uvipay')('your_private_key');

const res =  uvipay.charge({
//If request was post, and request.body contains post data
token:request.body.UvibaToken,
amount:10000,
'subscription':true,
'subs_plan':'monthly',
'triggers':{
    'success_url':'http://example.com/webhooks?success=true',
    'success_custom_data':{'user_id'=>'custom_id'},
    'fail_url':'http://example.com/webhooks?fails=true',
    'fail_custom_data':{'user_id'=>'custom_id'},
    'trial_end_url':'http://example.com/webhooks?trialend=true',
    'trial_end_custom_data':{'user_id'=>'custom_id'},
},

}).then(function (response) {
   if(response.status){
       //success
     console.log(response.id);
   }else{
       //error
     console.log(response.error.message);
   }
});

Setting up subscription is easy, it is just putting extra attributes/argument into payment button, and charge function.

1) Setting up Subscription button - click to get codes

2) Adding extra params in charge function - click to learn more

3) Do verification for triggers to make sure request came from Uviba servers. - click to learn more

Extras

Request Verifications

Request Verification:

$ curl /webhooks/?action=verify \
  -u your_private_key:
    -d request_id="{request_id}"

<?php 
use \Uviba\UviPay;
include 'UviPay/init.php'; //path/to/UviPay library
UviPay::setPrivateKey('your_private_key');

$json = file_get_contents('php://input');
$request = json_decode($json, true);

$verify_for='subscription';
$process = UviPay::verify_webhook($request['request_id'],$verify_for);

if($process['status']){
//we sent the request
}else{
//some else sent the request
}

const uvipay = require('./uvipay')('your_private_key');

var verify_for='subscription';
const res =  uvipay.verify_webhook({request.body.request_id,verify_for}).then(function (response) {
   if(response.status){
      //we sent the request
        }else{
        //some else sent the request
        }
});

Example response will be status false or true:

{
  "status": true
}

When we send you webhook (E.g., when subscription fails), you need to make sure that request came from us, if it didn't, you should block it. You can use our library to verify the request easily.