Traceback (most recent call last):
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/django/contrib/auth/mixins.py", line 56, in dispatch
return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/django/views/generic/base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "/home/sun/Desktop/mall/meiduomall/apps/pay/views.py", line 47, in get
order_string = alipay.api_alipay_trade_page_pay(
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/alipay/__init__.py", line 266, in api_alipay_trade_page_pay
return self.sign_data(data)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/alipay/__init__.py", line 174, in sign_data
signed_string = "&".join("{}={}".format(k, quote_plus(v)) for k, v in unquoted_items)
File "/home/sun/.virtualenvs/py3_django_1.11.11/lib/python3.8/site-packages/alipay/__init__.py", line 174, in <genexpr>
signed_string = "&".join("{}={}".format(k, quote_plus(v)) for k, v in unquoted_items)
File "/usr/lib/python3.8/urllib/parse.py", line 855, in quote_plus
string = quote(string, safe + space, encoding, errors)
File "/usr/lib/python3.8/urllib/parse.py", line 839, in quote
return quote_from_bytes(string, safe)
File "/usr/lib/python3.8/urllib/parse.py", line 864, in quote_from_bytes
raise TypeError("quote_from_bytes() expected bytes")
BUG原因:字节字符串的转换问题
跟着它报错的BUG一步一步进去发现,是阿里支付的SDK出现了问题。
解决方法:
def sign_data(self, data):
# 排序后的字符串
ordered_items = self._ordered_data(data)
raw_string = "&".join("{}={}".format(k, v) for k, v in ordered_items)
sign = self._sign(raw_string)
unquoted_items = ordered_items + [('sign', sign)]
# 获得最终的订单信息字符串
signed_string = "&".join("{}={}".format(k, quote_plus(str(v))) for k, v in unquoted_items)
# signed_string = "&".join("{}={}".format(k, quote_plus(v)) for k, v in unquoted_items)
if self._verbose:
logger.debug("signed srtring")
logger.debug(signed_string)
return signed_string