Euronet will validate every request is valid or not using signature that calculated using RSA256 algorithm and the secret is secret key that we generated.
Utils.kt
... override fun getSignature(data: String): String { val privateKey = Base64.getDecoder().decode(euronetConfiguration.cms.euronetKey) val key = KeyFactory.getInstance("RSA") val encoded = PKCS8EncodedKeySpec(privateKey) val sign = Signature.getInstance("SHA256withRSA") sign.initSign(key.generatePrivate(encoded)) sign.update(data.toByteArray(Charsets.UTF_8)) return Base64.getEncoder().encodeToString(sign.sign()) } ...
that method already created within Utils.kt and will generate the signature.
How to use:
We need to convert the object to be json string and pass it as argument of the methods
... request.signature = signatureService.generateSignature(utils.toStringRequest(request))
results:
{ "getCardDetailsRequest": { "appHeader": { "partID": "2500", "serviceName": "GETCARDDTL", "channelID": "SAFIAPPS", "userId": "suser", "reqID": "a8d9f2e8-bfa7-46af-a2e7-cc1358d84cb2", "reqDateTime": "2022-10-14 10:25:09" }, "cardParams": { "cardValueIndicator": "1", "proxyCardNumber": "683448986" } }, "getCardDetailsResponse": { "appHeader": { "partID": "2500", "serviceName": "GETCARDDTL", "channelID": "SAFIAPPS", "userId": "suser", "reqID": "a8d9f2e8-bfa7-46af-a2e7-cc1358d84cb2", "reqDateTime": "2022-10-14 10:25:09" }, "cardParams": { "cardValueIndicator": "1", "proxyCardNumber": "683448986" } }, "signature": "aCbjblg71x9LdvfpjgY4iG5GxZXt3cgBZ3944IgemaP7GFHYjFbX6bFAhBR2xn212ube6XTigpQiWMZucYbM3bxH1OFqjTmfnb3sRdxXHuDtVJQrmQ52BHL6dnOdOZ6xpLr+YVJD/fnKVioi+SA0ybmzeU9rUxFlNDOaVXk3d1t3hv67exc3dRK05BC1SF6xgf2/sRecNXSRFjvx4bYai89mJPUUYd6nT67MvwKVKrNiSiCY3Jo4+QgEZmU8MLTiC08+kB0/aGEcW5Quy4wqqtUIv4jcRUmn3Xl6ld1/1llsVz+/WmkyAsQ/9i//jovt/sjKtFt7SptEDa0HmgLXxg==" }