接收并处理SOAP消息

时间:2016-08-22 16:08:31

标签: python soap python-3.4 bottle suds

有一家服务提供商(Safaricom)决定使用SOAP向企业发送移动支付通知。当移动用户付费时(通过USSD或通过网络界面),移动货币服务将发送我们应该消费的SOAP消息。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:c2b="http://cps.huawei.com/cpsinterface/c2bpayment"> 
<soapenv:Header/> 
<soapenv:Body> 
    <c2b:C2BPaymentValidationRequest>
        <TransactionType>PayBill</TransactionType> 
        <TransID>1234560000007031</TransID> 
        <TransTime>20140227082020</TransTime> 
        <TransAmount>123.00</TransAmount> 
        <BusinessShortCode>12345</BusinessShortCode>
        <BillRefNumber></BillRefNumber> 
        <InvoiceNumber></InvoiceNumber> 
        <MSISDN>254722703614</MSISDN> 
        <KYCInfo> 
            <KYCName>[Personal Details][First Name]</KYCName> 
            <KYCValue>Hoiyor</KYCValue> 
        </KYCInfo> 
        <KYCInfo> 
            <KYCName>[Personal Details][Middle Name]</KYCName> 
            <KYCValue>G</KYCValue> 
        </KYCInfo> 
        <KYCInfo> 
            <KYCName>[Personal Details][Last Name]</KYCName> 
            <KYCValue>Chen</KYCValue> 
        </KYCInfo> 
    </c2b:C2BPaymentValidationRequest> 
</soapenv:Body> </soapenv:Envelope>

不要担心以上细节是公共信息

问题是,使用像瓶子(甚至是Django)这样的框架,如何“接受”此消息,如何从消息中提取细节。

我使用suds-jurko来使用Soap服务,但我从未接受过SOAP调用的接收端。

至少能够使用payment_data = request.body.read()

获取消息
from bottle import request
payment_data = request.body.read()
print(payment_data)

虽然我已经尝试在python中使用XML解析器,但它变得越来越复杂。有没有办法让suds(或zeep)允许我从xml对象获取数据?

1 个答案:

答案 0 :(得分:0)

我希望答案不会迟到: 对于C2B事务,在github https://github.com/kn9ts/project-mulla上有一个项目,它以POST形式从结账处获取请求,将其转换为SOAP请求,将其发送到safaricom,从safaricom接收响应并以Json格式给出响应