1) Download the 2C2P Public Key from the 2C2P Merchant Portal: Go to Account > Options > 2C2P Public Keys > JWE -- change dir as per set up requirement i.e test-keys or prod-keys -- store it in file "sandbox-jwt-2c2p.demo.2.1.public.cer" 2) Use rsa.php (in raw_code folder) to create public and private keys (x509 format) and store them in separate pem files. Commands to prepare keys: -- change dir as per set up requirement i.e test-keys or prod-keys -- php ../raw_code/rsa.php -- vim private.pem and paste rsa private key -- vim public.pem and paste rsa public key 3) Run the following commands: (steps also mentioned in 2c2p_certGen_bash_pem_crt_2048_v2.0.sh file) -- openssl req -new -key private.pem -out certfile.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:sg State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: -- openssl x509 -req -days 3650 -in certfile.csr -signkey private.pem -out upload.crt Signature ok subject=C = sg, ST = Some-State, O = Internet Widgits Pty Ltd Getting Private key -- cat private.pem > main.pem -- cat upload.crt >> main.pem -- rm certfile.csr 4) Now upload 'upload.crt' file (generated public key) to the 2C2P Merchant Portal without header and footer Log in and go to Account > Options > Merchant Public Keys. Add the public key and set it as default. 5) To compile java file, run the below command: -- change dir cd ../ -- complie PGW_JWT.java for prod set up and PGW_JWT_TEST.java for test set up -- EXAMPLE: javac -cp ".:java-jar/json-smart-1.3.1.jar:java-jar/jcip-annotations-1.0-1.jar:java-jar/bcprov-jdk15on-1.55.jar:java-jar/bcpkix-jdk15on-1.55.jar:java-jar/nimbus-jose-jwt-4.34.2.jar" PGW_JWT.java 6) To create token / payload, run the below command: (change xml request) -- run PGW_JWT for prod set up and PGW_JWT_TEST for test set up -- Example of add card request: java -cp ".:java-jar/json-smart-1.3.1.jar:java-jar/jcip-annotations-1.0-1.jar:java-jar/bcprov-jdk15on-1.55.jar:java-jar/bcpkix-jdk15on-1.55.jar:java-jar/nimbus-jose-jwt-4.34.2.jar" PGW_JWT createJWEToken "2.32003231314477027020000021465555555555554444702SGAdityaaditycse@gmail.com1224A" -- Expected output: eyJ0eXAiOiJKV1QiLCJhbGciOiJQUzI1NiJ9.ZXlKbGJtTWlPaUpCTWpVMlIwTk5JaXdpWVd4bklqb2lVbE5CTFU5QlJWQWlmUS5QZHQ3ck84WmlhMVpLMFJZUnhjc2s0SHVYR250RGZfYUlKQm1pTHBHZmJROFhXNXJRbVdrQjVGQjRpWDZwZ1VyN3ZlZlBIVlhLMkItZktEM0Nac3F2N0trVHlPUlpweDdTSzNuSWtwd2E2anV3eFhSRlY1aTE5MzBVTnoyUEJ4WEVuR0lteEJ0cmdnWDdZYUJrSlRQaVhKYzBsRFFsMkhGaC1yd2lDX2tUOHN1VFJNNUlkcWhxaThYSHNHcXdyVGpkYVk2eFNsbDZac1RVWnJ0U2tTNVBLQ3NOQTdOSkU5bjBJRWxyVlFKNjR3Mkx2UDA2TUpsRWJTZmpjU2hRMFp2ZHBBQl9kQzB6RW5tV1cwdTFaN085d3hhTjRKRFQ4UERRM0FQZndhRXotZDVhc0ctWG1ITFdtQ3dXN0hwdUVyRUU2Y05EdkFUbkVZUkZ5OHZUeHpmLUEua2lGQk9YcEVVTGVFODRnUC5uWUpuNF9OWlJLX1hOZFBFb19Yck5sc0QxeTlKR2ZOeENSRDVoSjNRQzlLaU4yNlA0VzZScExYeHBmN1lPUzRWa3RpTUNlZlh0SW9WOHVBWlZ1VjBDOEJ1ZTBxa21wRFBlLUNEV19BV2ZYd09mTk52ZHJ1WmgzelJaV2owRFdDVWRsWnJfcWFRUUpWY24zeVF2TUZ4czJTUnVFYUlncnZjbmpKRG1oWEl4WE80SEtLUmNGU3NIWklfMk5CdkQwdkVaNTFmbGlFVlY2WTRiNVlnaEppQk5yLVh3aklUSkljQlVMZ19BOVJ2N1VybXdBOVoxZ01PY19XdDdLdGo1V3lWZjJFUUdXR3dxZmRaRFY5b1NuUFlKVlF2dTV4eURaV0ZUVmdBbzUyQ2daNnRvRWVSV3hrTk9ISmU4aFJZNHpkOWNPMmpyMjZUQjRGYVRjSzcxUlhiUE00MzZ2cEtaemJnUlg5QkJKQzBXSDFqamhndGEzTjQwTEh6Y3RZV1VYNkstRElrajhtRkFTUUhabE0zSFdyYXQ5RmlEbjU3c0dIM0JVX2xPWFRoYXg5U1VxQXNVckNRblBOT2VibjJEeUJaMjg5U3lLRXppTF9nYWVLZURIQ0l1c0VnSnpkMXloZXJhQzlFUm5Db2NBN2J1TW9uUnpydTBweE5OVjRNYzlJcEN6UjEwc2Rnd2cwM2ZMbEZhYUUuTVpqYXFWcXZoY3FpdkNsZFIyTmZhQQ.iMyFtlIjSLmuNFWuw3SsoK2sIeIZiidVjwjb3MTmiDoJxjzrTZQhRaJbwCrkLiZ9UPxv6NvPNGZjGBYQQlr-orRLl7RUokTi9QSDdQJ1iufMyeeYARSNrRXJsOcaS-3im2ASK1SCxSlrb01AnwIkZ5R1o3Lg2Bmb47JySn7S42b4MadF6-dlbl28rcBjt73SNz5TeVr1JOzcwKDd-UFGIRjc7Lq1RE3bc3PVIG_3DBskoS78IepJNJFoHj6GB84lzMp7Mx3K0cOJ1bAKYcI9LBL610nOduZz8YW03KcExbyMRX4UPmoCnqIGGQmM6fvNxyje595hpE2BDgM9DEREiQ 7) Hit 2c2p add card api, with the above output -- curl --location --request POST 'https://demo2.2c2p.com/2C2PFrontend/PaymentAction/2.0/action' --header 'Content-Type: text/plain' --data-raw '' -- Example: curl --location --request POST 'https://demo2.2c2p.com/2C2PFrontend/PaymentAction/2.0/action' --header 'Content-Type: text/plain' --data-raw 'eyJ0eXAiOiJKV1QiLCJhbGciOiJQUzI1NiJ9.ZXlKbGJtTWlPaUpCTWpVMlIwTk5JaXdpWVd4bklqb2lVbE5CTFU5QlJWQWlmUS5QZHQ3ck84WmlhMVpLMFJZUnhjc2s0SHVYR250RGZfYUlKQm1pTHBHZmJROFhXNXJRbVdrQjVGQjRpWDZwZ1VyN3ZlZlBIVlhLMkItZktEM0Nac3F2N0trVHlPUlpweDdTSzNuSWtwd2E2anV3eFhSRlY1aTE5MzBVTnoyUEJ4WEVuR0lteEJ0cmdnWDdZYUJrSlRQaVhKYzBsRFFsMkhGaC1yd2lDX2tUOHN1VFJNNUlkcWhxaThYSHNHcXdyVGpkYVk2eFNsbDZac1RVWnJ0U2tTNVBLQ3NOQTdOSkU5bjBJRWxyVlFKNjR3Mkx2UDA2TUpsRWJTZmpjU2hRMFp2ZHBBQl9kQzB6RW5tV1cwdTFaN085d3hhTjRKRFQ4UERRM0FQZndhRXotZDVhc0ctWG1ITFdtQ3dXN0hwdUVyRUU2Y05EdkFUbkVZUkZ5OHZUeHpmLUEua2lGQk9YcEVVTGVFODRnUC5uWUpuNF9OWlJLX1hOZFBFb19Yck5sc0QxeTlKR2ZOeENSRDVoSjNRQzlLaU4yNlA0VzZScExYeHBmN1lPUzRWa3RpTUNlZlh0SW9WOHVBWlZ1VjBDOEJ1ZTBxa21wRFBlLUNEV19BV2ZYd09mTk52ZHJ1WmgzelJaV2owRFdDVWRsWnJfcWFRUUpWY24zeVF2TUZ4czJTUnVFYUlncnZjbmpKRG1oWEl4WE80SEtLUmNGU3NIWklfMk5CdkQwdkVaNTFmbGlFVlY2WTRiNVlnaEppQk5yLVh3aklUSkljQlVMZ19BOVJ2N1VybXdBOVoxZ01PY19XdDdLdGo1V3lWZjJFUUdXR3dxZmRaRFY5b1NuUFlKVlF2dTV4eURaV0ZUVmdBbzUyQ2daNnRvRWVSV3hrTk9ISmU4aFJZNHpkOWNPMmpyMjZUQjRGYVRjSzcxUlhiUE00MzZ2cEtaemJnUlg5QkJKQzBXSDFqamhndGEzTjQwTEh6Y3RZV1VYNkstRElrajhtRkFTUUhabE0zSFdyYXQ5RmlEbjU3c0dIM0JVX2xPWFRoYXg5U1VxQXNVckNRblBOT2VibjJEeUJaMjg5U3lLRXppTF9nYWVLZURIQ0l1c0VnSnpkMXloZXJhQzlFUm5Db2NBN2J1TW9uUnpydTBweE5OVjRNYzlJcEN6UjEwc2Rnd2cwM2ZMbEZhYUUuTVpqYXFWcXZoY3FpdkNsZFIyTmZhQQ.iMyFtlIjSLmuNFWuw3SsoK2sIeIZiidVjwjb3MTmiDoJxjzrTZQhRaJbwCrkLiZ9UPxv6NvPNGZjGBYQQlr-orRLl7RUokTi9QSDdQJ1iufMyeeYARSNrRXJsOcaS-3im2ASK1SCxSlrb01AnwIkZ5R1o3Lg2Bmb47JySn7S42b4MadF6-dlbl28rcBjt73SNz5TeVr1JOzcwKDd-UFGIRjc7Lq1RE3bc3PVIG_3DBskoS78IepJNJFoHj6GB84lzMp7Mx3K0cOJ1bAKYcI9LBL610nOduZz8YW03KcExbyMRX4UPmoCnqIGGQmM6fvNxyje595hpE2BDgM9DEREiQ' -- Expected output: eyJhbGciOiJQUzI1NiIsImtpZCI6IjEifQ.ZXlKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V5TlRaSFEwMGlMQ0pyYVdRaU9pSWlmUS5TV3FKUXIwdHVKNS1YNkRHMmtOT1dPQUZLQ183aGluR0E5VU1ySm42UTl6c1NHcGhpMG1jY1N5SWltRFQ5ZGlLYXc0alhQVy1JT2hGUmkzcVJ5REZGQVMtV1hiQ2lyeERjZUQ0emZCRVl4Tk5aMk15UlY5dFJVM1Z6dnYyeDFiQUthc0wxQ1FhVDNZVkNJaGFQTDdsUEkzcVRCTHhBSk51S2ExN3AyMWpQUVZqaFVFSFUtRTJqZnhfT1paTjZrb0NzdVpqSW5sN0tkcnhTVHJRMGZyX2hFYXF6ZE9DdVUwbTFiZHFobVA0enNLbWRneGw0S0lLLXV6OHVqYVBGN0pSM3lsbFN4NVc2MWQxbllsa0RwVFo3bVJ0R2paQm4wenpvekJYdDhFUng0bFYybG1xVS1aQWxTWURyTEpUZUhoREQyMjhxTUp1Q2FFNEtLS3JGb3drbWcuamI5eUlYTHNTQ2h6ZnhiUS5rQ0VGVXVoVnZUVUtTTTlkam9iYzh2Q2t5LVhWeU1kSG9Ma3ZzN0FfVkdfQ0lHUjVTX2MwMUttbWpJbHJQUXRjRUhRWmJBSHVPY3dNYkFCR0JmUVl6ek5fSE01c3ZjdE1ybFBLWEJ6Yk5XRkNDU19qVVA5SEhWai14MzljNUpVRk03dmRtZDV2X2JialliNHRKcWVCdkptVlduTldPY2w1QWZjNGR2NFNCcWQ0U0E2X0pGQ1gtbjhrOVdYV2RrLUxkb0kwTUtubmZjel9vNmRLNlZyTWk2QThwX3lEeFh2LWF0VVpZYUlUVG1tV3hIMEZXcVZwX09iMDV0WTdtOVFLSFhyZ250bDg3MTRKd2g4RUtJTTk4UHRUNk1rUUVheUJQNmZOV3pOTVhFOW9pMDNINGpTcDFOWGlsd2s1N0dScTlvYmJtc29mb1dYN3hYOE1rc2R1SUZuMXZPMThPVjRrcUJfMWtyN044UHNqN280NFRzcVI5TDYzNXJSSjYtS3VCWjJ6SUctWmZoMTdRSzF0ZUtsbm9KdEhsal90R05NOGU4eDk1QlN1ZEVRMVQ2Y0o1RDg2SkU1OF85NXh6Q3I2cURBQVY2OF91a2tDWkVuRGNraWdxTHU3Nmw1R0syeGktN2tSdnR4QW1iaFFlOEhieWl4Q3RFRHFsNnM4cmI0SEdka05jQ0JKa3R1LWhxUVB4emdJZTdSUnZRREF0UGZoYXJub0pCX01VMG9iSjRCeVB1ZnVCUk9aVk1EMm9wdnVfXzdIYUZMS0V3WWRnTEl6eDBCODVVWWVtTXZpb2ZvMGtybEVDc1MwMGN3bExjQzIzYlFRa2FYNnJJSmJWR3F0UEdic0cySnE1c1M2VVI1OElvZy5Iek80MGV1eEV2emZFeWw3NlhmRXdn.Ik20TLrPDkSvWqdrKk9_G2fyi18ianPbWRPS6l5ebBN_4A-a6Ua7fNw509Fkd3FUbwMbqJJ0SIROkMPCjnTtWb31LPA22XwJ4wZsPEbcjup-moumdz41NZDaEDRIQaeT8_U7iPMQSHL3wqmtEvlCUkvyf3wLrR1cRh5_JxHtsJzjw36Ryzccy8fUaIf6fYSghu_CtZ0KH8__8zUbipawkPVsTo9scPppbENplI7lTZ-6YHUufhDZOqBfAtPlYFS4rBJGxjkfx1vodKKhHblOGxjanVQgzU85E8hFSuwqQvnNJMKdsi8d2udJc6IZGjWvu6SBXo2nhmBz9uRBhJTSDA 8) to decrypt the response payload, run the below command: (change the output) -- run PGW_JWT for prod set up and PGW_JWT_TEST for test set up -- java -cp ".:java-jar/json-smart-1.3.1.jar:java-jar/jcip-annotations-1.0-1.jar:java-jar/bcprov-jdk15on-1.55.jar:java-jar/bcpkix-jdk15on-1.55.jar:java-jar/nimbus-jose-jwt-4.34.2.jar" PGW_JWT decryptJWEToken "" -- Example: java -cp ".:java-jar/json-smart-1.3.1.jar:java-jar/jcip-annotations-1.0-1.jar:java-jar/bcprov-jdk15on-1.55.jar:java-jar/bcpkix-jdk15on-1.55.jar:java-jar/nimbus-jose-jwt-4.34.2.jar" PGW_JWT decryptJWEToken "eyJhbGciOiJQUzI1NiIsImtpZCI6IjEifQ.ZXlKaGJHY2lPaUpTVTBFdFQwRkZVQ0lzSW1WdVl5STZJa0V5TlRaSFEwMGlMQ0pyYVdRaU9pSWlmUS5TV3FKUXIwdHVKNS1YNkRHMmtOT1dPQUZLQ183aGluR0E5VU1ySm42UTl6c1NHcGhpMG1jY1N5SWltRFQ5ZGlLYXc0alhQVy1JT2hGUmkzcVJ5REZGQVMtV1hiQ2lyeERjZUQ0emZCRVl4Tk5aMk15UlY5dFJVM1Z6dnYyeDFiQUthc0wxQ1FhVDNZVkNJaGFQTDdsUEkzcVRCTHhBSk51S2ExN3AyMWpQUVZqaFVFSFUtRTJqZnhfT1paTjZrb0NzdVpqSW5sN0tkcnhTVHJRMGZyX2hFYXF6ZE9DdVUwbTFiZHFobVA0enNLbWRneGw0S0lLLXV6OHVqYVBGN0pSM3lsbFN4NVc2MWQxbllsa0RwVFo3bVJ0R2paQm4wenpvekJYdDhFUng0bFYybG1xVS1aQWxTWURyTEpUZUhoREQyMjhxTUp1Q2FFNEtLS3JGb3drbWcuamI5eUlYTHNTQ2h6ZnhiUS5rQ0VGVXVoVnZUVUtTTTlkam9iYzh2Q2t5LVhWeU1kSG9Ma3ZzN0FfVkdfQ0lHUjVTX2MwMUttbWpJbHJQUXRjRUhRWmJBSHVPY3dNYkFCR0JmUVl6ek5fSE01c3ZjdE1ybFBLWEJ6Yk5XRkNDU19qVVA5SEhWai14MzljNUpVRk03dmRtZDV2X2JialliNHRKcWVCdkptVlduTldPY2w1QWZjNGR2NFNCcWQ0U0E2X0pGQ1gtbjhrOVdYV2RrLUxkb0kwTUtubmZjel9vNmRLNlZyTWk2QThwX3lEeFh2LWF0VVpZYUlUVG1tV3hIMEZXcVZwX09iMDV0WTdtOVFLSFhyZ250bDg3MTRKd2g4RUtJTTk4UHRUNk1rUUVheUJQNmZOV3pOTVhFOW9pMDNINGpTcDFOWGlsd2s1N0dScTlvYmJtc29mb1dYN3hYOE1rc2R1SUZuMXZPMThPVjRrcUJfMWtyN044UHNqN280NFRzcVI5TDYzNXJSSjYtS3VCWjJ6SUctWmZoMTdRSzF0ZUtsbm9KdEhsal90R05NOGU4eDk1QlN1ZEVRMVQ2Y0o1RDg2SkU1OF85NXh6Q3I2cURBQVY2OF91a2tDWkVuRGNraWdxTHU3Nmw1R0syeGktN2tSdnR4QW1iaFFlOEhieWl4Q3RFRHFsNnM4cmI0SEdka05jQ0JKa3R1LWhxUVB4emdJZTdSUnZRREF0UGZoYXJub0pCX01VMG9iSjRCeVB1ZnVCUk9aVk1EMm9wdnVfXzdIYUZMS0V3WWRnTEl6eDBCODVVWWVtTXZpb2ZvMGtybEVDc1MwMGN3bExjQzIzYlFRa2FYNnJJSmJWR3F0UEdic0cySnE1c1M2VVI1OElvZy5Iek80MGV1eEV2emZFeWw3NlhmRXdn.Ik20TLrPDkSvWqdrKk9_G2fyi18ianPbWRPS6l5ebBN_4A-a6Ua7fNw509Fkd3FUbwMbqJJ0SIROkMPCjnTtWb31LPA22XwJ4wZsPEbcjup-moumdz41NZDaEDRIQaeT8_U7iPMQSHL3wqmtEvlCUkvyf3wLrR1cRh5_JxHtsJzjw36Ryzccy8fUaIf6fYSghu_CtZ0KH8__8zUbipawkPVsTo9scPppbENplI7lTZ-6YHUufhDZOqBfAtPlYFS4rBJGxjkfx1vodKKhHblOGxjanVQgzU85E8hFSuwqQvnNJMKdsi8d2udJc6IZGjWvu6SBXo2nhmBz9uRBhJTSDA" -- Expected output: 2.320032313144770270200000214600Success29032315013081531915SGAdityaaditycse@gmail.com555555XXXXXX444489564E35391D5811C0F9D8E323E4903411E75A81 9) use php for finally processing request[Step 1 to 8 used for java setup and checking] -- base url example: http://localhost/pup/frontend_payment_gateway/branches/test_branch -- Example of php curl request: curl --location '/card_enc_2c2p/CardEnc2c2p.php' \ --header 'Content-Type: application/json' \ --data-raw '{ "card_details": { "version": 2.3, "timeStamp": 200323131447, "merchantID": 702702000002146, "pan": 5555555555554444, "panCurrency": 702, "panCountry": "SG", "cardholderName": "Aditya", "cardholderEmail": "aditycse@gmail.com", "panExpiry": 1224, "action": "A" }, "card_management_2c2p_url": "https://demo2.2c2p.com/2C2PFrontend/PaymentAction/2.0/action" }' -- Expected output: {"response":{"version":"2.3","timeStamp":"200323131447","merchantID":"702702000002146","respCode":"00","respReason":"Success","storeCardUniqueID":"29032315013081531915","panBank":{},"panCountry":"SG","cardholderName":"Aditya","cardholderEmail":"aditycse@gmail.com","panMasked":"555555XXXXXX4444","hashValue":"89564E35391D5811C0F9D8E323E4903411E75A81"}}