微信支付统一下单接口,有一个叫notify_url的参数,作用我就照搬官方文档:
异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
吐槽:官方文档竟然不告诉我到时候是通过Get还是Post(难道是其他HTTP method)请求我,我怕我到时候措不及防,事实证明,是通过Post来请求的。PS: 这点本博主也觉得特恶心,反正微信的官方文档烂的要死
好了,我前面的支付功能都写好了,就等微信爸爸来调我的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-Type是text/xml而不是application/xml,真是mmp,看了下XMLParser的源码,改起来很简单:
# ...省略
class WechatPaymentXMLParser(XMLParser):
media_type = 'text/xml'
class WechatNotifyView(APIView):
# ...省略
parser_classes = (WechatPaymentXMLParser,)
# ...省略
再测试了一次,搞定,request.data打印出来的就是那个xml内容的字典形式。
吐槽:腾讯支付那块官方说明太特么垃圾
发表评论