网站设计工作室公司,网站中的人力资源建设,wordpress课堂,东莞阿里巴巴代运营说明
python实现支付宝异步回调验签#xff0c;示例中使用Django框架。 此方案使用了支付宝的pythonSDK#xff0c;请一定装最新版本的#xff0c;支付宝官网文档不知道多久没更新了#xff0c;之前的版本pip安装会报一些c库不存在的错误#xff1b; pip install alipay-…说明
python实现支付宝异步回调验签示例中使用Django框架。 此方案使用了支付宝的pythonSDK请一定装最新版本的支付宝官网文档不知道多久没更新了之前的版本pip安装会报一些c库不存在的错误 pip install alipay-sdk-python3.7.156验签核心代码
from alipay.aop.api.util.SignatureUtils import verify_with_rsa#支付宝公钥
publicKey def check_alipay_sign(request):验签:param request::return:sign request.get(sign) # 取出传过来的签#待签名字符串org_message get_dic_sorted_params(request)# 转换成字节串message bytes(org_message, encodingutf-8)print(message)try:# 调用验签函数status verify_with_rsa(publicKey, message, sign)return statusexcept Exception as e:print(fException during signature verification: {e})return False# 接收字典类型参数去除sign、sign_type字段转换成升序字符串
def get_dic_sorted_params(org_dic_params):content org_dic_params.pop(sign)org_dic_params.pop(sign_type) # 去除sign、sigh_typenew_list sorted(org_dic_params, reverseFalse) # 待验签参数进行排序for i in new_list:p i org_dic_params.get(i)content psorted_params content.strip() # 重组字符串将{k:v}形式的字典类型原始响应值--》转换成k1v1k2v2形式的字符串格式return sorted_paramsdjgano 调用
验签成功返回 SUCCESS支付宝将将停止此订单的异步推送否则将会一共推送8次。
class alipayCallback(APIView):authentication_classes []def post(self, request):支付宝支付回调- 内部订单号: request.POST.get(out_trade_no)- 交易状态: request.POST.get(trade_status) [TRADE_FINISHED:交易完结;TRADE_CLOSED:交易关闭;TRADE_SUCCESS:支付成功;WAIT_BUYER_PAY:交易创建]- 产品名称: request.POST.get(subject)- 总金额: request.POST.get(total_amount)- 实付金额: request.POST.get(buyer_pay_amount):param request::return:orderId str(request.POST.get(out_trade_no))userId orderId[orderId.index(#)1:]print(内部订单号 request.POST.get(out_trade_no))print(订单号 request.POST.get(trade_no)) # 平台生成的订单号print(交易状态 request.POST.get(trade_status))print(产品名称 request.POST.get(subject))print(总金额 request.POST.get(total_amount))print(实付金额 request.POST.get(buyer_pay_amount))print(request.POST.dict())#验签 防止伪造请求if check_alipay_sign(request.POST.dict()):print(验签成功)# TODO 判断支付状态订单状态修改 return HttpResponse(SUCCESS)else:print(未支付成功)return HttpResponse(未支付成功)else:print(验签失败)return HttpResponse(验签失败)