Skip to main content

支付宝异步验签2

上一节课我们获取到支付成功后,支付宝返回的参数,本节课我们继续讲解支付宝异步验签的流程。在上节课的基础上,我们将通过编写代码来完成验签的具体步骤。

图74-异步验签流程

异步通知验签流程参见网址:https://opendocs.alipay.com/open/270/105902#s7

第一步:去除SIGN和SIGN TYPE参数

在返回的参数列表中,我们需要去除两个参数:SIGN和SIGN TYPE。以下是去除这两个参数的代码示例:

del params['SIGN']
del params['SIGN TYPE']

这样,我们就将这两个参数从字典(params)中删除了。

第二步:将剩余的参数进行URL Decode和字典排序

剩余的参数需要进行URL Decode和字典排序。我们可以通过以下代码来实现:

sorted_list = sorted(params.items())
unsigned_string = '&'.join([f"{k}={v}" for k, v in sorted_list])

这里,我们首先使用sorted()函数对字典进行排序,然后使用列表生成式将排序后的键值对拼接成字符串。

第三步:使用BASE64解码签名参数

在验签的过程中,我们需要对签名参数进行BASE64解码。以下是解码的示例代码:

sign = params.pop('sign')

这里,我们使用pop()函数将签名参数弹出,并将其赋值给变量sign

第四步:使用RSA验签方法

在使用RSA进行验签的过程中,我们可以借助支付宝提供的验签方法来实现。在utils/zhifubao.py文件中的Alipay类下,添加一个verify_sign方法,代码如下:

class Alipay():
def verify_sign(self, unsigned_string, sign):
return verify_with_rsa(settings.ALIPAY_PUBLIC_KEY, bytes(unsigned_string, encoding='utf-8'), sign)

这里,我们并定义了一个verify_sign方法来调用支付宝的verify_with_rsa验签方法。方法中的alipay_public_key参数需要从配置文件(Settings)中获取,message参数为前面生成的未验签的字符串,sign参数为之前解码的签名参数。

该验签方法返回一个布尔值,如果为True则表示验签成功,如果为False则表示验签失败。

完整代码

dx_movie/trade/views.py
class AlipayCallbackAPIView(APIView):
def post(self, request):
params = request.POST.dict()
print(params)
# 去除sign 和 sign_type
sign = params.pop('sign')
del params['sign_type']
# 对字典进行排序
sorted_list = sorted([(k, v) for k,v in params.items() ])
unsigned_string = '&'.join(f"{k}={v}" for k,v in sorted_list) # buyer_pay_amount=0.02&app_id=9021000126620710
alipay = Alipay()
if not alipay.verify_sign(unsigned_string, sign):
print('vefify sign error')
return Response('error')
return Response('success')

如果验签成功,返回success 否则返回error

warning

这里必须返回successerror, 这是支付宝端指定的,不能随意修改。

测试验签

为了测试验签的功能是否正常,我们可以调用上述方法进行测试。以下是测试代码的示例:

alipay = Alipay()
result = alipay.verify_sign(unsigned_string, sign)
if not result:
return Response("verify_sign Error", status=500)

return Response("success")

这里,我们实例化了一个Alipay对象,并调用verify_sign方法进行验签。如果验签结果为False,则返回一个错误响应;如果验签结果为True,则返回一个成功响应。

以上就是本节课的内容,希望大家能够理解并掌握支付宝异步验签的流程和编写代码的方法。下节课我们将继续讲解支付宝异步验签的后续步骤。