支付宝python SDK接口文档:
https://pypi.org/project/alipay-sdk-python/#description
网站对接支付宝流程
获取支付宝付款二维码url:
class OrderPayView(View): """完成支付""" def post(self,request): # 用户是否登录 user = request.user if not user.is_authenticated: return JsonResponse({'res': 0, 'errmsg': '用户未登录'}) # 接收参数 order_id = request.POST.get('order_id') # 检验参数 if not order_id: return JsonResponse({'res': 1, 'errmsg': '无效的订单id'}) try: order=OrderInfo.objects.get(order_id=order_id, user=user, pay_method=3, order_status=1) except OrderInfo.DoesNotExist: # 无效订单 return JsonResponse({'res': 2, 'errmsg': '无效的订单,目前只支持支付宝支付'}) # 业务处理:使用python SDK 调用支付宝的支付接口 # 初始化 alipay = AliPay( appid=settings.ALI_PAY['default']['app_id'], # 应用id app_notify_url='http://www.relishfruit.com', # 默认回调url app_private_key_path=settings.ALI_PAY['default']['app_private_key_path'], alipay_public_key_path=settings.ALI_PAY['default']['alipay_public_key_path'], # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALI_PAY['default']['debug'] # 默认False ) # 调用支付接口 # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string total_pay = order.total_price+order.transit_price # Decimal order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, # 订单id total_amount=str(total_pay), subject="ForYou-%s" % order_id, return_url=settings.ALI_PAY['default']['callback_url'], notify_url=settings.ALI_PAY['default']['callback_url'] # 可选, 不填则使用默认notify url ) # 返回应答 pay_url = 'https://openapi.alipaydev.com/gateway.do?' + order_string return JsonResponse({'res': 3, 'pay_url': pay_url})
查询支付结果
注意:
- return_url(同步通知Get请求)页面回跳,用于指定支付宝支付完成后所要跳转的页面
- 处理支付宝的notify_url(异步通知),当支付宝完成订单支付后就会向notify_url发送post请求,告知商户支付成功
class CheckPayView(View): """查看订单支付的结果"""
# return_url(同步通知Get请求)页面回跳,用于指定支付宝支付完成后所要跳转的页面 def get(self, request): """ 处理支付宝的return_url返回 :param request: :return: """ processed_dict = {} for key, value in request.GET.items(): processed_dict[key] = value sign = processed_dict.pop("sign", None) alipay = AliPay( appid=settings.ALI_PAY['default']['app_id'], app_notify_url=settings.ALI_PAY['default']['app_notify_url'], app_private_key_path=settings.ALI_PAY['default']['app_private_key_path'], alipay_public_key_path=settings.ALI_PAY['default']['alipay_public_key_path'], # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=settings.ALI_PAY['default']['debug'], # 默认False, ) verify_re = alipay.verify(processed_dict, sign) if verify_re is True: order_sn = processed_dict.get('out_trade_no', None) trade_no = processed_dict.get('trade_no', None) trade_status = processed_dict.get('trade_status') while True: response = alipay.api_alipay_trade_query(order_sn) code = response.get('code') if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS': # 支付成功 trade_status = 4 # 待评价 exist_orders = OrderInfo.objects.filter(order_id=order_sn) # 支付成功后修改商品销量 for existed_order in exist_orders: existed_order.order_status = trade_status existed_order.trade_no = trade_no existed_order.create_time = datetime.now() existed_order.save() # 返回结果 break elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'): # 等待买家付款 # 业务处理失败,可能一会就会成功 import time time.sleep(5) continue else: # 支付出错 break response = redirect(settings.ALI_PAY['default']['return_url']) return response else: response = redirect("http://www.relishfruit.com:8000/index") return response
# 处理支付宝的notify_url(异步通知)
# 当支付宝完成订单支付后就会向notify_url发送post请求,告知商户支付成功 def post(self, request): """查询支付结果""" processed_dict = {} for key, value in request.GET.items(): processed_dict[key] = value sign = processed_dict.pop("sign", None) alipay = AliPay( appid=settings.ALI_PAY['default']['app_id'], app_notify_url=settings.ALI_PAY['default']['app_notify_url'], app_private_key_path=settings.ALI_PAY['default']['app_private_key_path'], alipay_public_key_path=settings.ALI_PAY['default']['alipay_public_key_path'], # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥, debug=settings.ALI_PAY['default']['debug'], # 默认False, ) verify_re = alipay.verify(processed_dict, sign) if verify_re is True: order_sn = processed_dict.get('out_trade_no', None) trade_no = processed_dict.get('trade_no', None) trade_status = processed_dict.get('trade_status', 1) exist_orders = OrderInfo.objects.filter(order_id=order_sn) # 支付成功后修改商品销量 while True: response = alipay.api_alipay_trade_query(order_sn) code = response.get('code') if code == '10000' and response.get('trade_status') == 'TRADE_SUCCESS': # 支付成功 trade_status = 4 # 待评价 exist_orders = OrderInfo.objects.filter(order_id=order_sn) # 支付成功后修改商品销量 for existed_order in exist_orders: order_goods = existed_order.ordergoods_set.all() for order_good in order_goods: goods = order_good.sku goods.sales += order_good.count goods.save() existed_order.order_status = trade_status existed_order.trade_no = trade_no existed_order.create_time = datetime.now() existed_order.save() # 返回结果 return HttpResponse("success") elif code == '40004' or (code == '10000' and response.get('trade_status') == 'WAIT_BUYER_PAY'): # 等待买家付款 # 业务处理失败,可能一会就会成功 import time time.sleep(5) continue else: # 支付出错 return HttpResponse("支付异常")