订单支付使用的是支付宝的API。需要到蚂蚁金服开放平台注册账号,申请 网页&移动应用 支付。如果申请还未通过,可以使用沙箱环境进行测试。在本地项目运行环境中需要安装支付宝的SDK。
pip install alipay-sdk-python
from alipay import AliPay
用户提交订单后,就是支付操作了,在项目的支付环节是采用发起 POST 请求,再返回正确码和请求支付成功。接收客户端传过来的订单ID号,获取订单信息。
① 创建用于进行支付宝支付的工具对象
需要接入支付宝的密钥
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None, # 默认回调url
app_private_key_path=os.path.join(settings.BASE_DIR, "apps/orders/app_private_key.pem"),
alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/orders/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False 配合沙箱模式使用
)
② 电脑网站支付
需要跳转到https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(order.total_amount), # 将Decimal类型转换为字符串交给支付宝
subject="每日生鲜%s" % order_id,
return_url=None,
notify_url=None # 可选, 不填则使用默认notify url
)
③ 支付宝支付
class PayView(LoginRequiredJsonMixin, View):
"""支付宝支付"""
def post(self, request):
""""""
# 订单id
order_id = request.POST.get("order_id")
if not order_id:
return JsonResponse({"code": 2, "message": "缺失订单号"})
# 获取订单的信息
try:
order = OrderInfo.objects.get(order_id=order_id, user=request.user,
status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"],
pay_method=OrderInfo.PAY_METHODS_ENUM["ALIPAY"])
except OrderInfo.DoesNotExist:
return JsonResponse({"code": 3, "message": "订单信息有误"})
# 创建用于进行支付宝支付的工具对象
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None, # 默认回调url
app_private_key_path=os.path.join(settings.BASE_DIR, "apps/orders/app_private_key.pem"),
alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/orders/alipay_public_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False 配合沙箱模式使用
)
# 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(order.total_amount), # 将Decimal类型转换为字符串交给支付宝
subject="每日生鲜%s" % order_id,
return_url=None,
notify_url=None # 可选, 不填则使用默认notify url
)
# 让用户进行支付的支付宝页面网址
url = settings.ALIPAY_URL + "?" + order_string
return JsonResponse({"code": 0, "message": "请求支付成功", "url": url})