1. 程式人生 > >python django 微信支付成功回撥url(notify_url)

python django 微信支付成功回撥url(notify_url)

微信官方文件:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
首先 這個 notify_url 有倆個要求 
1.公網能直接訪問的 
2.不能攜帶引數 (比如你的訂單id)

返回的內容微信請求的內容,為xml格式

<xml>
  <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
  <attach><![CDATA[支付測試]]></attach>
  <bank_type><![CDATA[CFT]]></bank_type>
  <fee_type><![CDATA[CNY]]></fee_type>
  <is_subscribe><![CDATA[Y]]></is_subscribe>
  <mch_id><![CDATA[10000100]]></mch_id>
  <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
  <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
  <out_trade_no><![CDATA[1409811653]]></out_trade_no>
  <result_code><![CDATA[SUCCESS]]></result_code>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
  <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
  <time_end><![CDATA[20140903131540]]></time_end>
  <total_fee>1</total_fee>
<coupon_fee><![CDATA[10]]></coupon_fee>
<coupon_count><![CDATA[1]]></coupon_count>
<coupon_type><![CDATA[CASH]]></coupon_type>
<coupon_id><![CDATA[10000]]></coupon_id>
<coupon_fee><![CDATA[100]]></coupon_fee>
  <trade_type><![CDATA[JSAPI]]></trade_type>
  <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>

如果支付成功了 會返回return_code 為 SUCCESS 
失敗時 return_code為 FAILD

詳細程式碼 views.py
import xml.etree.ElementTree as et

def payback(request):
    _xml = request.body
    #拿到微信傳送的xml請求 即微信支付後的回撥內容
    xml = str(_xml, encoding="utf-8")
    print("xml", xml)
    return_dict = {}
    tree = et.fromstring(xml)
    #xml 解析
    return_code = tree.find("return_code").text
    try:
        if return_code == 'FAIL':
            # 官方發出錯誤
            return_dict['message'] = '支付失敗'
            #return Response(return_dict, status=status.HTTP_400_BAD_REQUEST)
        elif return_code == 'SUCCESS':
        #拿到自己這次支付的 out_trade_no 
            _out_trade_no = tree.find("out_trade_no").text
                #這裡省略了 拿到訂單號後的操作 看自己的業務需求
    except Exception as e:
        pass
    finally:
        return HttpResponse(return_dict, status=status.HTTP_200_OK)

其實不需要return Response任何東西 微信不會對這個做處理

url.py
from .views.py import payback
  url(r'^afterpay', payback),