微信支付成功后,微信服务器会以 post 方式回调 notify_url
。但无法通过 request.form
或 request.values
来获取到它 post 过来的数据。需要使用 request.get_data()
方法。
request.get_data()
方法获取到的是 bytes
,所以需要将其 decode
成 str
。之后,就是一个 xml 文档了。利用 xml.etree.ElementTree
对其进行解析即可。
@wechat.route('/notify_url', methods=['POST']) def notify_url(): import xml.etree.ElementTree as et data = request.get_data() data = data.decode('utf-8') root = et.fromstring(data) return_code = root.find('.//return_code') out_trade_no = root.find('.//out_trade_no') print(return_code.text, out_trade_no.text)
以下是 request.get_data()
拿到的示例数据:
b'<xml><appid><![CDATA[你的app id]]></appid>\n<bank_type><![CDATA[CFT]]></bank_type>\n<cash_fee><![CDATA[1]]></cash_fee>\n<fee_type><![CDATA[CNY]]></fee_type>\n<is_subscribe><![CDATA[Y]]></is_subscribe>\n<mch_id><![CDATA[你的商户id]]></mch_id>\n<nonce_str><![CDATA[随机字符串]]></nonce_str>\n<openid><![CDATA[用户的open id]]></openid>\n<out_trade_no><![CDATA[你自己生成的订单号]]></out_trade_no>\n<result_code><![CDATA[SUCCESS]]></result_code>\n<return_code><![CDATA[SUCCESS]]></return_code>\n<sign><![CDATA[签名]]></sign>\n<time_end><![CDATA[20180425155844]]></time_end>\n<total_fee>1</total_fee>\n<trade_type><![CDATA[JSAPI]]></trade_type>\n<transaction_id><![CDATA[交易号]]></transaction_id>\n</xml>'