Flask 处理微信支付的回调notify_url

微信支付成功后,微信服务器会以 post 方式回调 notify_url。但无法通过 request.formrequest.values 来获取到它 post 过来的数据。需要使用 request.get_data() 方法。

request.get_data() 方法获取到的是 bytes ,所以需要将其 decodestr。之后,就是一个 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>'
flask 2018-04-25 18:03 3436762