python对接网商银行 xml报文加签

不废话直接上代码

模块

from xml.etree import ElementTree
from lxml import etree
from xml.parsers.expat import ExpatError
import xml.dom.minidom as Dom
from signxml import XMLSigner
def gen_xml(header_list, body_list):
    """
    构建xml文件
    :param header_list: head部分 --> list(dict)
    :param body_list: body部分 --> list(dict)
    :return: xml Document 对象
    """
    doc = Dom.Document()
    root = doc.createElement('document')
    request = doc.createElement('request')
    request.setAttribute("id", "request")
    head = doc.createElement('head')
    for item in header_list:  # 生成header 内容
        for k, v in item.items():
            node = doc.createElement(k)
            node.appendChild(doc.createTextNode(str(v)))
            head.appendChild(node)
    request.appendChild(head)
    body = doc.createElement('body')
    for v in body_list:  # 生成 body 内容
        for k, j in v.items():
            node = doc.createElement(k)
            node.appendChild(doc.createTextNode(str(j)))
            body.appendChild(node)
    request.appendChild(body)
    root.appendChild(request)
    # 处理签名
    document_obj = ElementTree.fromstring(str(root.toxml(encoding="utf-8"), "utf-8"))
    c14n_algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
    signed_xml_obj = XMLSigner(digest_algorithm="sha1", c14n_algorithm=c14n_algorithm).sign(document_obj, key=PRIVATE_KEY)  # 核心部分
    xml_serialized = etree.tostring(signed_xml_obj)  # 序列化
    do = parseString(str(xml_serialized, "utf-8"))  # 解析字符串 --> Document

    signature = doc.createElement('ds:Signature')
    signature.setAttribute('xmlns:ds', 'http://www.w3.org/2000/09/xmldsig#')
    # 拼接签名
    signedInfo = do.getElementsByTagName("ds:SignedInfo")[0]  # 提取加签后的节点
    signatureValue = do.getElementsByTagName("ds:SignatureValue")[0]
    signature.appendChild(signedInfo)  # 追加 -> Signature
    signature.appendChild(signatureValue)  # 追加 -> Signature
    root.appendChild(signature)  # 追加Signature -> document
    doc.appendChild(root)
    return doc

请求

headers = {"Content-Type": "text/xml; charset=UTF-8", 'Connection': 'close'}
    # 客户端发送请求报文到服务端
xml_data = gen_xml([],[])  # 传入对应参数
print("请求地址:", request_url)
print("请求报文:", str(xml_data.toxml(encoding="utf-8"), "utf-8"))
response = requests.post(request_url, data=xml_data.toxml(encoding="utf-8"), headers=headers, verify=False)
    # 客户端获取服务端的响应报文数据
try:
    result = parseString(response.text)
    print("响应报文:", str(result.toxml(encoding="utf-8"), "utf-8"))
except ExpatError as e:
    result = Dom.Document
    print(response.status_code, response.text)

如果帮助到您,欢迎点赞!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章