def post(self, request): """ 处理支付宝notify_url异步通知 :param request: :return: """ processed_dict = {} for key, value in request.POST.items(): processed_dict[key] = value print('request.POST的值:', processed_dict) sign = processed_dict.pop('sign', None) # 直接就是字符串了 server_ip = get_server_ip() alipay = AliPay( app_id=app_id, # 自己支付宝沙箱 APP ID notify_url="http://{}:8000/alipay/return/".format(server_ip), app_private_key_path=app_private_key_path, # 可以使用相对路径那个 alipay_public_key_path= alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=alipay_debug, # 默认False, return_url="http://{}:8000/alipay/return/".format(server_ip)) verify_result = alipay.verify(processed_dict, sign) # 验证签名,如果成功返回True if verify_result: order_sn = processed_dict.get('out_trade_no') # 原支付请求的商户订单号 trade_no = processed_dict.get('trade_no') # 支付宝交易凭证号 trade_status = processed_dict.get('trade_status') # 交易目前所处的状态 # 更新数据库订单状态 """ OrderInfo.objects.filter(order_sn=order_sn).update( trade_no=trade_no, # 更改交易号 pay_status=trade_status, # 更改支付状态 pay_time=timezone.now() # 更改支付时间 ) """ orderinfos = OrderInfo.objects.filter(order_sn=order_sn) for orderinfo in orderinfos: orderinfo.trade_no = trade_no, # 更改交易号 orderinfo.pay_status = trade_status, # 更改支付状态 orderinfo.pay_time = timezone.now() # 更改支付时间 # 更改商品的销量 order_goods = orderinfo.order_goods.all() for item in order_goods: # 获取订单中商品和商品数量,然后将商品的销量进行增加 goods = item.goods goods.sold_num += item.goods_nums goods.save() orderinfo.save() # 给支付宝返回一个消息,证明已收到异步通知 # 当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效。 # 也就是说在支付宝发送同一条异步通知时(包含商户并未成功打印出 success 导致支付宝重发数次通知),服务器异步通知参数 notify_id 是不变的。 return Response('success')
def get(self, request): """ 处理支付宝return_url返回 :param request: :return: """ processed_dict = {} for key, value in request.GET.items(): # GET逻辑 和 POST基本一样 processed_dict[key] = value print('request.GET的值:', processed_dict) sign = processed_dict.pop('sign', None) # 直接就是字符串了 server_ip = get_server_ip() alipay = AliPay( app_id=app_id, # 自己支付宝沙箱 APP ID notify_url="http://{}:8000/alipay/return/".format(server_ip), app_private_key_path=app_private_key_path, # 可以使用相对路径那个 alipay_public_key_path=alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=alipay_debug, # 默认False, return_url="http://{}:8000/alipay/return/".format(server_ip) ) verify_result = alipay.verify(processed_dict, sign) # 验证签名,如果成功返回True if verify_result: # POST中已经修改数据库订单状态,无需再GET中修改,且,GET中也得不到支付状态值 # 给支付宝返回一个消息,证明已收到异步通知 # return Response('success') # 修改为跳转到Vue页面 response = redirect(reverse('index')) response.set_cookie('nextPath', 'pay', max_age=2) # max_age设置为2s,让其快速过期,用一次就好了。 # 跳转回Vue中时,直接跳转到Vue的pay的页面,后台无法配置,只能让Vue实现跳转。 return response else: # 验证不通过直接跳转回首页就行,不设置cookie return redirect(reverse('index'))
def get_alipay_url(self, obj): # 方法命名规则为:get_<field_name> server_ip = get_server_ip() alipay = AliPay( app_id=app_id, # 自己支付宝沙箱 APP ID notify_url="http://{}:8000/alipay/return/".format(server_ip), app_private_key_path=app_private_key_path, # 可以使用相对路径那个 alipay_public_key_path= alipay_public_key_path, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=alipay_debug, # 默认False, return_url="http://{}:8000/alipay/return/".format(server_ip)) # 创建订单 order_sn = obj.order_sn order_amount = obj.order_amount url = alipay.direct_pay( subject="生鲜超市-{}".format(order_sn), out_trade_no=order_sn, total_amount=order_amount, # return_url="http://{}:8000/alipay/return/".format(server_ip) # 支付完成后自动跳回该url,可以不填了,因为初始化已经加上了 ) re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format( data=url) return re_url