Skip to main content

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

Project description

PYTHON - NICEPAY

Python PyPI Package

NICEPAY ❤️ Python! 🐍

This is the Official Python API client / library for NICEPAY Payment API. Visit Nicepay. More information about the product and see documentation at NICEPAY Docs for more technical details.

This library provides access to Nicepay APIs :

  • SNAP
  • V1 Enterprise & Professional
  • V2 Enterprise & Professional

1. Installation

a. Using PyPi

pip install python-nicepay

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": "", "customerNo": "", "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_CLINET_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. Other Sample

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

4. 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.0.tar.gz (94.6 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.0-py3-none-any.whl (173.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: python-nicepay-1.1.0.tar.gz
  • Upload date:
  • Size: 94.6 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.0.tar.gz
Algorithm Hash digest
SHA256 0d915c81f6e5ae8793fcbe3e19aeded5a926f75a9639b8f2ba246f0b51dfbd3b
MD5 c16885ae19a9de50df1bdcb95a4742ef
BLAKE2b-256 64a20379304b529503acaa3ec9f04f4f97979b2586be4e3707c9cf9ae0086ada

See more details on using hashes here.

File details

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

File metadata

  • Download URL: python_nicepay-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 173.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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5c6d7ac0a3a737edd2093eb6ec2492732883c0f2a927f0476eb9f40ec93ff6fd
MD5 ca278ee59b6145edd4735410feb1ba57
BLAKE2b-256 c3c78c55b0595efb28e2a24ed9ddce6415284b26e12b500da4d7c4fd105c0e12

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