Вот код:
Код: Выделить всё
import os
import base64
import requests
import signxml
from lxml import etree as lxml_ET
from signxml import XMLSigner, XMLVerifier, CanonicalizationMethod
TERM_URL = os.environ.get('TERM_URL', 'https://somedomain.url')
SELF_ENVIRONMENT = os.environ.get('SELF_ENVIRONMENT', 'staging')
POST_URL = 'https://modirumServerHere/url/things'
class ModiumSignXML:
def __init__(self, xml):
self.xml = xml
def sign_xml(self, xml, message_id):
cert, key = [open(f, "rb").read() for f in ("staging.cert.crt", "staging.private.key")]
reference_uri_link = f'''#{message_id}'''
temp = f'''
{xml}
'''
data = lxml_ET.fromstring(temp.encode('utf-8'))
signer = XMLSigner(method=signxml.methods.detached,
c14n_algorithm=signxml.CanonicalizationMethod.CANONICAL_XML_1_0)
signed_root = signer.sign(data, key=key, cert=cert, reference_uri=reference_uri_link)
data_serialized = lxml_ET.tostring(signed_root)
temp = temp.replace('', data_serialized.decode('utf-8') + '')
# data_parsed = lxml_ET.fromstring(temp)
XMLVerifier().verify(temp.encode('utf-8'), x509_cert=cert, id_attribute=reference_uri_link)
return temp
def process(self, pan, expiry, amount, exponent, description, currency, term_url, transaction_id, merchant_id,
merchant_name):
# message_id = f"{merchant_name}{transaction_id}"
message_id = "M1561102563170" #Hardcoded for testing
xid = str(transaction_id).zfill(20).encode('utf-8')
xid = base64.b64encode(xid).decode('utf-8')
to_encrypt = f'''
{pan}
{expiry}
0
{amount}
{exponent}
{description}
{currency}
{term_url}
01
{xid}
'''
xml = self.sign_xml(to_encrypt, message_id)
print("REQUEST")
print("=========="*10)
print(xml)
print("=========="*10)
print("")
print("")
print("")
return xml
def post_xml(self, xml):
headers = {'Content-Type': 'application/xml'}
r = requests.post(POST_URL, data=xml, headers=headers)
print("RESPONSE")
print("=========="*10)
print(r.text)
print("=========="*10)
print("")
print("")
print("")
def main():
pan = '4111111111111111'
expiry = '2312'
amount = '100'
exponent = '2'
description = 'Test'
currency = '710'
term_url = TERM_URL
transaction_id = '90010'
merchant_id = '123456'
merchant_name = 'TestMerchant'
test = ModiumSignXML('')
xml = test.process(pan=pan, expiry=expiry, amount=amount, exponent=exponent, description=description,
currency=currency, term_url=term_url, transaction_id=transaction_id, merchant_id=merchant_id,
merchant_name=merchant_name)
test.post_xml(xml)
if __name__ == "__main__":
main()
Мы сравнили выведенный код со спецификациями и другими рабочими журналами и не смогли видите что-то другое, но наша проверка не удалась как локально, так и на сервере MPI. Так что любая помощь будет огромной!
Мы пробовали разные вещи, в том числе разные методы подписи, и ни один из них не понравился. Мы повторно проверили сертификат и ключ, они оба в порядке и были извлечены из одного и того же файла PFX.
Подробнее здесь: https://stackoverflow.com/questions/782 ... g-detached