记录django-rest-framework处理微信支付notify_url遇到的问题

最近在做一个小程序,小程序有涉及到微信支付,说来惭愧,还是第一次自己动手去做微信支付这一块的实现,所以过程中遇到了很多人都会踩的坑(例如mmp的微信支付各种key各种id要在哪里找,很难找),这次使用django来开发,接口部分用django-rest-framework(下面简称drf)。

入入入入入正题吧。

微信支付统一下单接口,有一个叫notify_url的参数,作用我就照搬官方文档:

异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。

吐槽:官方文档竟然不告诉我到时候是通过Get还是Post(难道是其他HTTP method)请求我,我怕我到时候措不及防,事实证明,是通过Post来请求的。

好了,我前面的支付功能都写好了,就等微信爸爸来调我的notify_url了,测试支付完之后,屁颠屁颠跑去IDE的控制台看debug输出,结果有Traceback,找找里面的关键信息:Unsupported media type "text/xml" in request.,哭唧唧。

唔,聪明如我,drf可以自定义parser类,官方文档也有提到一个xml的parser,安装了,然后为这个接口指定了parser_classes,代码如下:

# ...省略
class WechatNotifyView(APIView):
    """
    微信回调接口
    """
    authentication_classes = []
    permission_classes = (AllowAny,)
    parser_classes = (XMLParser,)

    def post(self, request):
        print(request.data)
        return Response()

满心欢喜重新测试一次,结果还是不对,追查了下,发现了关键所在,微信调用notify_url的时候,Content-Typetext/xml而不是application/xml,真是mmp,看了下XMLParser的源码,改起来很简单:

# ...省略
class WechatPaymentXMLParser(XMLParser):
    media_type = 'text/xml'

class WechatNotifyView(APIView):
    # ...省略
    parser_classes = (WechatPaymentXMLParser,)
    # ...省略    
    

再测试了一次,搞定,request.data打印出来的就是那个xml内容的字典形式。
吐槽:微信的东西总是有吐不完的槽,但爸爸始终是爸爸。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值