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)

如果幫助到您,歡迎點贊!

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