Re: Message Level Encryption

Solved! Go to solution
dev-tired
Dabbler

Message Level Encryption

Hi, I'm new to visa developer and API implementation.

I am trying to implement MLE using python but I am not sure how to do it since the API I'm working with requires it to function.

 

Here's my code:

 

#  *(c) Copyright 2018 - 2020 Visa. All Rights Reserved.**
#
#  *NOTICE: The software and accompanying information and documentation (together, the “Software”) remain the property of and are proprietary to Visa and its suppliers and affiliates. The Software remains protected by intellectual property rights and may be covered by U.S. and foreign patents or patent applications. The Software is licensed and not sold.*
#
#  * By accessing the Software you are agreeing to Visa's terms of use (developer.visa.com/terms) and privacy policy (developer.visa.com/privacy).In addition, all permissible uses of the Software must be in support of Visa products, programs and services provided through the Visa Developer Program (VDP) platform only (developer.visa.com). **THE SOFTWARE AND ANY ASSOCIATED INFORMATION OR DOCUMENTATION IS PROVIDED ON AN “AS IS,” “AS AVAILABLE,” “WITH ALL FAULTS” BASIS WITHOUT WARRANTY OR  CONDITION OF ANY KIND. YOUR USE IS AT YOUR OWN RISK.** All brand names are the property of their respective owners, used for identification purposes only, and do not imply product endorsement or affiliation with Visa. Any links to third party sites are for your information only and equally  do not constitute a Visa endorsement. Visa has no insight into and control over third party content and code and disclaims all liability for any such components, including continued availability and functionality. Benefits depend on implementation details and business factors and coding steps shown are exemplary only and do not reflect all necessary elements for the described capabilities. Capabilities and features are subject to Visa’s terms and conditions and may require development,implementation and resources by you based on your business and operational details. Please refer to the specific API documentation for details on the requirements, eligibility and geographic availability.*
#
#  *This Software includes programs, concepts and details under continuing development by Visa. Any Visa features,functionality, implementation, branding, and schedules may be amended, updated or canceled at Visa’s discretion.The timing of widespread availability of programs and functionality is also subject to a number of factors outside Visa’s control,including but not limited to deployment of necessary infrastructure by issuers, acquirers, merchants and mobile device manufacturers.*
#

import datetime
from http import client
import json
import logging
from wsgiref import headers
import requests
import http.client as httplib
from jwcrypto import jwk, jwe
import time
 


print("START Sample Code for Two-Way (Mutual) SSL")
DEBUG = True

#print(datetime.datetime.now())
#date = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S")


cert = 'C:\\Users\\bmuta\Videos\\User\\visa-development-project\\card-validation-project\\cert\\cert.pem'

ca_cert = 'C:\\Users\\bmuta\Videos\\User\\visa-development-project\\card-validation-project\\CA\\CA.cer'

server_cert = 'C:\\Users\\bmuta\Videos\\User\\visa-development-project\\card-validation-project\\MLE\\server_cert_61f42a33-deff-4317-b076-f97a55c71801.pem'
mle_priv_cert = 'C:\\Users\\bmuta\Videos\\User\\visa-development-project\\card-validation-project\\MLE\\key_61f42a33-deff-4317-b076-f97a55c71801.pem'
keyID= '61f42a33-deff-4317-b076-f97a55c71801'

key = 'C:\\Users\\bmuta\\Videos\\User\\visa-development-project\\card-validation-project\\key\\key.pem'

user_id = 'ID'
password = 'PASS'
timeout = 10

def encrypt(self, payload😞
        config = Configuration()
        payload = json.dumps(payload)
        protected_header = {
            "alg": "RSA-OAEP-256",
            "enc": "A128GCM",
            "kid": config.api_key[keyID],
            "iat": int(round(time.time() * 1000))
        }
        jwetoken = jwe.JWE(payload.encode('utf-8'),
                            recipient=self.loadPem(config.encryption_public_key_path),
                            protected=protected_header)
        encryptedPayload = jwetoken.serialize(compact=True)
        return {"encData": encryptedPayload}
 
def loadPem(self, filePath😞
        with open(filePath, "rb") as pemfile:
            return jwk.JWK.from_pem(pemfile.read())

cred_info = 'credit_info.json'



payload = json.loads('''{
  "requestHeader": {
    "requestMessageId": "6da6b8b024532a2e0eacb1af58581",
    "messageDateTime": "2019-02-35 05:25:12.327"
  },
  "requestData": {
    "pANs": [
      4072208010000000
    ],
    "group": "STANDARD"
  }
}
''')

try:
    response = requests.post(url,
                            verify = (ca_cert),
                            cert=(cert, key),
                           
                            #headers = headers,
                            auth=(user_id, password),
                            json = payload,
                            timeout=timeout
    )
except Exception as e:
    print(e)

if DEBUG: print(response.headers)
if DEBUG: print(response.content)

var1 = str(response.status_code)
 
 
other info:
{'Server': 'nginx', 'Date': 'Fri, 22 Jul 2022 18:57:12 GMT', 'Content-Type': 'application/json;charset=UTF-8', 'Content-Length': '130', 'Connection': 'keep-alive', 'X-SERVED-BY': '-56467c7', 'X-CORRELATION-ID': '1658516232_032_1210517374_-56467c7_VDP_WS', 'X-ERROR-ORIGIN': '9200', 'X-APP-STATUS': '400', 'X-Frame-Options': 'SAMEORIGIN', 'X-XSS-Protection': '0', 'X-Content-Type-Options': 'nosniff', 'Strict-Transport-Security': 'max-age=31536000;includeSubdomains', 'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '-1'}
b'{"responseStatus":{"status":400,"code":"9125","severity":"ERROR","message":"Expected input credential was not present","info":""}}'
3 REPLIES 3
jenn_kh
Community Moderator

Re: Message Level Encryption

Thank you for reaching out, @dev-tired! An agent is looking into this and will get back to you as soon as possible. In the meantime, if anyone else has any ideas that you feel may help, please share them here! -Jenn

 

API_Managers
Visa Developer Support Specialist

Re: Message Level Encryption

Hi @dev-tired,

 

Please refer to this Message Level Encryption guide to get started with MLE. Here is the link to the guide: https://developer.visa.com/pages/encryption_guide.

 

I also ran a sandbox test today using VDC Playground tool and was able to get the API call to work. I received a successful request/response payload. Please see my successful sample request/response payload below. Try your test again and share your result with us.

 

End Point https://sandbox.api.visa.com/cofds-web/v1/datainfo
Method POST
Request
{
"requestHeader": {
"requestMessageId": "6da6b8b024532a2e0eacb1af58581",
"messageDateTime": "2019-02-35 05:25:12.327"
},
"requestData": {
"pANs": [4072208010000000],
"group": "STANDARD"
}
}
Response
{
"responseHeader": {
"numRecordsReturned": 1,
"responseMessageId": "1658624098_564_338407969_-56467c7k_VDP_WS",
"requestMessageId": "6da6b8b024532a2e0eacb1af58581",
"messageDateTime": "2022-07-24 00:54:59.008"
},
"responseData": {
"panList": [{"panData": {
"panResponseMsg": "Success",
"pAN": "4072208010000000",
"merchants": [
{
"mrchDbaName": "EDF ENERGY",
"mrchName": "EDF ENERGY",
"totalTranCount": "2",
"cardAcceptorId": "54421241",
"mrchDbaId": "20599",
"lastTranCurrency": "GBP",
"sponsoredMerchantId": "ABCD",
"lastMrchTranDt": "2019-04-26",
"vAUUpdateStatus": "N",
"lastTranAmtUSD": "517.63",
"acctNumOld4Digit": "",
"mCC": "4900",
"tokenPANReplacementStatus": "N",
"paymentFacilitatorId": "ABCD",
"lastTranAmt": "400.0",
"tokenReqstrId": "0000000",
"vAULastUpdateDate": "",
"mrchAddr": "TELEDOC 228 PARIS 12 PARIS 75012 PARIS FRANCE",
"mrchURL": "",
"confidenceInd": "C",
"tranTypeDetails": [{
"lastTranCurrency": "GBP",
"lastTranAmt": "400.0",
"lastTranAmtUSD": "517.63",
"tranCount": 2,
"lastTranDateTime": "2019-04-26 09:49:11.000",
"tranType": "MAIL_TELEPHONE"
}],
"tokenPANReplacementDate": "",
"lastTranDateTime": "2019-04-26 09:49:11.000",
"mrchPhoneNum": "0000000"
},
{
"mrchDbaName": "EDF ENERGY",
"mrchName": "EDF ENERGY",
"totalTranCount": "2",
"cardAcceptorId": "54421241",
"mrchDbaId": "20599",
"lastTranCurrency": "GBP",
"sponsoredMerchantId": "ABCD",
"lastMrchTranDt": "2019-04-26",
"vAUUpdateStatus": "N",
"lastTranAmtUSD": "517.63",
"acctNumOld4Digit": "",
"mCC": "4900",
"tokenPANReplacementStatus": "N",
"paymentFacilitatorId": "ABCD",
"lastTranAmt": "400.0",
"tokenReqstrId": "0000000",
"vAULastUpdateDate": "",
"mrchAddr": "TELEDOC 228 PARIS 12 PARIS 75012 PARIS FRANCE",
"mrchURL": "",
"confidenceInd": "C",
"tranTypeDetails": [{
"lastTranCurrency": "GBP",
"lastTranAmt": "400.0",
"lastTranAmtUSD": "517.63",
"tranCount": 2,
"lastTranDateTime": "2019-04-26 09:49:11.000",
"tranType": "MAIL_TELEPHONE"
}],
"tokenPANReplacementDate": "",
"lastTranDateTime": "2019-04-26 09:49:11.000",
"mrchPhoneNum": "0000000"
},
{
"mrchDbaName": "EDF ENERGY",
"mrchName": "EDF ENERGY",
"totalTranCount": "11",
"cardAcceptorId": "54421241",
"mrchDbaId": "20599",
"lastTranCurrency": "USD",
"sponsoredMerchantId": "ABCD",
"lastMrchTranDt": "2020-05-16",
"vAUUpdateStatus": "N",
"lastTranAmtUSD": "230.0",
"acctNumOld4Digit": "",
"mCC": "4900",
"tokenPANReplacementStatus": "N",
"paymentFacilitatorId": "ABCD",
"lastTranAmt": "198.0",
"tokenReqstrId": "0000000",
"vAULastUpdateDate": "",
"mrchAddr": "TELEDOC 228 PARIS 12 PARIS 75012 PARIS FRANCE",
"mrchURL": "",
"confidenceInd": "C",
"tranTypeDetails": [
{
"lastTranCurrency": "GBP",
"lastTranAmt": "345.08",
"lastTranAmtUSD": "345.08",
"tranCount": 3,
"lastTranDateTime": "2020-04-26 09:49:11.000",
"tranType": "SCHEDULED_RECURRING"
},
{
"lastTranCurrency": "USD",
"lastTranAmt": "180.99",
"lastTranAmtUSD": "180.99",
"tranCount": 4,
"lastTranDateTime": "2020-02-18 16:40:10.000",
"tranType": "INSTALLMENT"
},
{
"lastTranCurrency": "USD",
"lastTranAmt": "198.0",
"lastTranAmtUSD": "230.0",
"tranCount": 4,
"lastTranDateTime": "2020-05-16 15:36:28.000",
"tranType": "UNSCHEDULED_RECURRING"
}
],
"tokenPANReplacementDate": "",
"lastTranDateTime": "2020-05-16 15:36:28.000",
"mrchPhoneNum": "0000000"
},
{
"mrchDbaName": "EDF ENERGY",
"mrchName": "EDF ENERGY",
"totalTranCount": "4",
"cardAcceptorId": "54421241",
"mrchDbaId": "20599",
"lastTranCurrency": "GBP",
"sponsoredMerchantId": "ABCD",
"lastMrchTranDt": "2020-04-26",
"vAUUpdateStatus": "N",
"lastTranAmtUSD": "517.63",
"acctNumOld4Digit": "",
"mCC": "4900",
"tokenPANReplacementStatus": "N",
"paymentFacilitatorId": "ABCD",
"lastTranAmt": "400.0",
"tokenReqstrId": "0000000",
"vAULastUpdateDate": "",
"mrchAddr": "TELEDOC 228 PARIS 12 PARIS 75012 PARIS FRANCE",
"mrchURL": "",
"confidenceInd": "C",
"tranTypeDetails": [
{
"lastTranCurrency": "GBP",
"lastTranAmt": "400.0",
"lastTranAmtUSD": "517.63",
"tranCount": 2,
"lastTranDateTime": "2020-04-26 09:49:11.000",
"tranType": "MAIL_TELEPHONE"
},
{
"lastTranCurrency": "USD",
"lastTranAmt": "180.99",
"lastTranAmtUSD": "180.99",
"tranCount": 2,
"lastTranDateTime": "2020-02-18 16:40:10.000",
"tranType": "ECOM_OTHER"
},
{
"lastTranCurrency": "USD",
"lastTranAmt": "159.0",
"lastTranAmtUSD": "229.0",
"tranCount": 3,
"lastTranDateTime": "2020-05-16 15:36:28.000",
"tranType": "AUTH_VERIFICATION"
}
],
"tokenPANReplacementDate": "",
"lastTranDateTime": "2020-04-26 09:49:11.000",
"mrchPhoneNum": "0000000"
},
{
"mrchDbaName": "ITUNES MUSIC STORE",
"mrchName": "APL ITUNES COM BILL",
"totalTranCount": "1",
"cardAcceptorId": "337186000108778",
"mrchDbaId": "1624",
"lastTranCurrency": "USD",
"sponsoredMerchantId": "ABCD",
"lastMrchTranDt": "2020-02-08",
"vAUUpdateStatus": "Y",
"lastTranAmtUSD": "18.99",
"acctNumOld4Digit": "9024",
"mCC": "5734",
"tokenPANReplacementStatus": "N",
"paymentFacilitatorId": "ABCD",
"lastTranAmt": "18.99",
"tokenReqstrId": "00000000",
"vAULastUpdateDate": "2020-09-12",
"mrchAddr": "",
"mrchURL": "",
"confidenceInd": "C",
"tranTypeDetails": [{
"lastTranCurrency": "USD",
"lastTranAmt": "18.99",
"lastTranAmtUSD": "18.99",
"tranCount": 1,
"lastTranDateTime": "2020-02-08 16:40:10.000",
"tranType": "ECOM_OTHER"
}],
"tokenPANReplacementDate": "",
"lastTranDateTime": "2020-02-08 16:40:10.000",
"mrchPhoneNum": "866-712-7753"
},
{
"mrchDbaName": "OTHER RECREATION SERVICES",
"mrchName": "BT CAMPS SOUTH CAROL",
"totalTranCount": "0",
"cardAcceptorId": "000445199040996",
"mrchDbaId": "2836",
"sponsoredMerchantId": "ABCD",
"lastMrchTranDt": "",
"vAUUpdateStatus": "Y",
"acctNumOld4Digit": "9024",
"mCC": "7999",
"tokenPANReplacementStatus": "N",
"paymentFacilitatorId": "ABCD",
"lastTranAmt": "0",
"tokenReqstrId": "00000000",
"vAULastUpdateDate": "2020-09-12",
"mrchAddr": "",
"mrchURL": "www.citigroup.com",
"confidenceInd": "E",
"tranTypeDetails": [{
"lastTranCurrency": "USD",
"lastTranAmt": "159.0",
"lastTranAmtUSD": "159.0",
"tranCount": 1,
"lastTranDateTime": "2020-05-11 15:36:28.000",
"tranType": "AUTH_VERIFICATION"
}],
"tokenPANReplacementDate": "",
"mrchPhoneNum": ""
}
]
}}],
"group": "STANDARD"
},
"status": {
"statusDescription": "COF Service - Success",
"statusCode": "CDI000"
}
}
Response Header
Status Code: 200 OK
Server : nginx
Date : Sun, 24 Jul 2022 00:54:59 GMT
Content-Type : application/json;charset=UTF-8
Content-Length : 8171
Connection : keep-alive
X-SERVED-BY : -56467c7k
X-CORRELATION-ID : 1658624098_564_338407969_-56467c7k_VDP_WS
X-APP-STATUS : 200
encrypted : true
Content-Language : en-US
Cache-Control : no-cache, no-store, must-revalidate
X-Frame-Options : SAMEORIGIN
X-XSS-Protection : 0
X-Content-Type-Options : nosniff
Strict-Transport-Security : max-age=31536000;includeSubdomains
Pragma : no-cache
Expires : -1
X-XSS-Protection : 1; mode=block
X-Content-Type-Options : nosniff
Strict-Transport-Security : max-age=31536000;includeSubdomains;always

 

 




Thanks,

Diana



Was your question answered? Don't forget to click on "Accept as Solution" to help other devs find the answer to the same question.

API_Managers
Visa Developer Support Specialist

Re: Message Level Encryption

Hi @dev-tired,

 

Is your query resolved? Please let me know if you need further assistance, I'm happy to help. 




Thanks,

Diana



Was your question answered? Don't forget to click on "Accept as Solution" to help other devs find the answer to the same question.