Skip to main content

This is the Official Python API client / library for NICEPAY Payment API

Project description

NICEPAY - PYTHON

Python PyPI Package

The Nicepay Python provides integration access to the Nicepay APIs.
This is designed to make it easier for developers to call Nicepay’s REST APIs in Python applications.

Information

This library provides access to Nicepay APIs :

  • SNAP
  • V1 Enterprise (Direct)
  • V1 Professional (Redirect)
  • V2 Enterprise (Direct)
  • V2 Professional (Redirect)

For more information about the product, please refer to the NICEPAY Docs for detailed technical guidance

1. Install the Package

a. PyPI

pip install python-nicepay

You can also view the package at: https://pypi.org/project/python-nicepay/1.1.1/

b. Manually Installation

You can clone or download our source code, then import PYTHON-NICEPAY manually into your project.

Clone Repository :

git clone https://github.com/nicepay-dev/python-nicepay.git

2. Usage

Get your credentials from Nicepay Dashboard initialize Nicepay config

Notes : If the merchant uses their own IMID, please configure the data using the setter method (setSnapConfiguration or setNonSnapConfiguration) in constantGeneral. For usage examples, refer to the following files:

  • For SNAP: testAccessToken.py
# Case if merchant using different config with the constant
class testAccessToken:
    clientKey = "_CLIENT_KEY_MERCHANT"
    clientSecret = "_CLIENT_SECRET_MERCHANT"
    privateKey= "_PRIVATE_KEY_MERCHANT"

    ConstantsGeneral.setSnapConfiguration(clientKey, clientSecret, privateKey)
  • For Non SNAP : testEwallet.py
# Case if merchant using different config with the constant
class testEwallet:
    imid = "_YOUR_I_MID"
    merchantKey = "_YOUR_MERCHANT_KEY"
    callbackUrl = "_YOUR_CALLBACK_URL"
    dbProcessUrl = "_YOUR_DB_PROCESS_URL"
    billingPhone = "_YOUR_BILLING_PHONE"
    ConstantsGeneral.setNonSnapConfiguration(imid, merchantKey, dbProcessUrl, callbackUrl)
    ConstantsGeneral.setBillingPhone(billingPhone)

2.1 Client Initialization and Configuration

Credentials used here are for testing purposes

# Instantiate SNAP API instance
class ConstantsGeneral:
_CLIENT_KEY = "_YOUR_CLIENT_KEY"
_PRIVATE_KEY = "_YOUR_PRIVATE_KEY"
_CLIENT_SECRET = "_YOUR_CLIENT_SECRET"
# Instantiate Non SNAP API instance
class ConstantsGeneral:
_I_MID = "_YOUR_I_MID"
_MERCHANT_KEY = "_YOUR_MERCHANT_KEY"
# Instantiate change if production environment
environment = (builderEnvironment.BuildEnvirontment()
                   .isCloud(False)
                   .isProduction(True)
                   .build())

2.2 Request for Access-Token

# create for access token
class testAccessToken:
    bodyCreateToken = (
        builderAccessToken.BuildAccessToken()
        .setGrantType("client_credentials")
        .setAdditionalInfo("")
        .build()
    )
environment = (builderEnvironment.BuildEnvirontment()
                   .isCloud(False)
                   .isProduction(False)
                   .build())

Result = SnapService.serviceOAUTH(bodyCreateToken.jsonAccessToken())

Here's the sample result

AccessToken : eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJJT05QQVlURVNUIiwiaXNzIjoiTklDRVBBWSIsIm5hbWUiOiJCRElOIiwiZXhwIjoiMjAyNC0xMS0xMlQyMDowNTo1NFoifQ==.RfeDzCn7sk5VT54f8NTPnbbeQvaPmQg6wtLWXIbmBCI=

2.3 Request for Generate VA SNAP (i.e. Virtual Account)

class testVirtualAccount:
    bodyCreateToken = (
        builderAccessToken.BuildAccessToken()
        .setGrantType("client_credentials")
        .setAdditionalInfo("")
        .build()
    )

    totalAmount = {"value": "10000.00",
                   "currency": "IDR"
                   }

    additionalInfo = {"bankCd": "BRIN",
                      "goodsNm": "Merchant Goods 1",
                      "dbProcessUrl": "_YOUR_DB_PROCESS_URL",
                      "vacctValidDt": "",
                      "vacctValidTm": "",
                      "msId": "",
                      "msFee": "",
                      "msFeeType": "",
                      "mbFee": "",
                      "mbFeeType": ""
                      }

    bodyCreateVA = (
        builderVirtualAccount.BuildCreateVA()
        .setPartnerServiceId("_MANDATORY_")
        .setCustomerNo("_MANDATORY_")
        .setVirtualAccountNo("")
        .setVirtualAccountName("John Doe")
        .setTrxId("123")
        .setTotalAmount(totalAmount)
        .setAdditionalInfo(additionalInfo)
        .build()
    )

    result = SnapService.serviceTransaction(bodyCreateToken.jsonAccessToken(),
                                            bodyCreateVA.jsonVACreate(),
                                            ConstantsEndpoints.createVA())

Here's the sample result

body request :
{"partnerServiceId": "", "customerNo": "", "virtualAccountNo": "", "virtualAccountName": "John Doe", "trxId": "123", "totalAmount": {"value": "10000.00", "currency": "IDR"}, "additionalInfo": {"bankCd": "BRIN", "goodsNm": "Merchant Goods 1", "dbProcessUrl": "https://webhook.site/e15ef201-98a9-428c-85d4-a0c6458939c3", "vacctValidDt": "", "vacctValidTm": "", "msId": "", "msFee": "", "msFeeType": "", "mbFee": "", "mbFeeType": ""}}

body response :
{"responseCode": "2002700", "responseMessage": "Successful", "virtualAccountData": {"partnerServiceId": "88480004", "customerNo": "0254370152", "virtualAccountNo": "884800040254370152", "virtualAccountName": "John Doe", "trxId": "123", "totalAmount": {"value": "10000.00", "currency": "IDR"}, "additionalInfo": {"msId": "", "msFee": "", "msFeeType": "", "mbFee": "", "mbFeeType": "", "bankCd": "BRIN", "tXidVA": "IONPAYTEST022024111302543xxxxx", "goodsNm": "Merchant Goods 1", "vacctValidDt": "20241115", "vacctValidTm": "025437"}}}

2.4 Verify Signature

  • for Access Token
class Signature:
    log = Log()

    @staticmethod
    def signSHA256RSA(stringToSign, privateKey):
        try:
            b1 = base64.b64decode(privateKey)
            key = RSA.importKey(b1)
            signer = PKCS1_v1_5.new(key)
            digest = SHA256.new()
            digest.update(stringToSign.encode('utf-8'))
            signature = signer.sign(digest)
            hexSignature = base64.b64encode(signature).decode('utf-8')
            return hexSignature
        except Exception as e:
            Signature.log.error("Error Generate Signature:" + e)
            return ''

@staticmethod
    def sha256EncodeHex(data):
        sha256Hash = hashlib.sha256(data.encode('utf-8')).digest()
        hexEncoded = sha256Hash.hex()
        return hexEncoded

Notes : stringToSign = "_YOUR_CLIENT_KEY" + "|" + "_TIMESTAMP";

  • for Signature Service
@staticmethod
    def getSignature(accessToken, requestBody, endpoint, timestamp, staticKey, httpMethod):
        Signature.log.info("util - Request Endpoint : " + endpoint)
        data = f"{httpMethod}:{endpoint}:{accessToken}:{requestBody}:{timestamp}"
        Signature.log.info("util - StringDataToSign: " + data)
        try:
            sign = Signature.hmacSHA512EncodeBase64(staticKey, data)
            Signature.log.info("util - Signature: " + sign)
            return sign
        except:
            Signature.log.error("Error Generate Signature - getSignature")

 @staticmethod
    def hmacSHA512EncodeBase64(key, data):
        hmacObj = hmac.new(key.encode('utf-8'), data.encode('utf-8'), hashlib.sha512)
        hmacBytes = hmacObj.digest()
        base64Encoded = base64.b64encode(hmacBytes).decode('utf-8')
        return base64Encoded

Here’s the result of create VA signature service.

StringDataToSign: POST:/api/v1.0/transfer-va/create-va:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJJT05QQVlURVNUIiwiaXNzIjoiTklDRVBBWSIsIm5hbWUiOiJCRElOIiwiZXhwIjoiMjAyNC0xMS0xMlQyMDowOTozN1oifQ==.4djzd9Z1jZE8AXkFRmCrxm8IMfdhuk2RjFz0LSzRXIY=:d04af00b1f17c7045dde178f377b77e385a3d6cecd22fe6822de1ee053489078:2024-11-13T02:54:37+07:00

Signature: w7BpJ392jzRkAgvWC79Zawvztm/l1D+bxIJWgGq59xih0SuAi4PoTtUAUIXcOLuvZ3pYaSs8Mc1QZxhbVMMBqQ==

You can view a code example in the following UtilSignature.py class.

3. Environments

Configured to use a different environment for making API calls.

Available environments are:

Name Description
Production Nicepay Live Environment
Development Default Nicepay Sandbox Environment

4. Other Sample

Integration test are available for SNAP :
Integration test are available for V2 APIs :

5. Get Help

Can't find answer you looking for? email to integration@nicepay.co.id

Thank you and Have a NICEPAY!

Logo

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

python-nicepay-1.1.1.tar.gz (104.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

python_nicepay-1.1.1-py3-none-any.whl (187.1 kB view details)

Uploaded Python 3

File details

Details for the file python-nicepay-1.1.1.tar.gz.

File metadata

  • Download URL: python-nicepay-1.1.1.tar.gz
  • Upload date:
  • Size: 104.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.11.9

File hashes

Hashes for python-nicepay-1.1.1.tar.gz
Algorithm Hash digest
SHA256 11120415f3f9e7b1b0106d228dfe2e272b2bc69d0ff1411111062d3697d041ab
MD5 2763ca4bff376f82e3515d4e7049cf68
BLAKE2b-256 d3713794db4c59c6641c7aecc1c037c26b771b35db59f7628ccb4a69c9a5d9a3

See more details on using hashes here.

File details

Details for the file python_nicepay-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: python_nicepay-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 187.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.11.9

File hashes

Hashes for python_nicepay-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ff5e69d19b5d3435502ed3f973e6b059ca5db6bf775cbf98d26818582ec35f4f
MD5 09ff6aaaa64ccfa0a7d5f460064e6dab
BLAKE2b-256 a468ab4341ee014b09bcd82291bf53fc70ea987fdfa9aff081c5af40611ca317

See more details on using hashes here.

Supported by

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