django网站使用支付宝支付

mac2022-06-30  33

最开始使用支付宝官方Python sdk ,折腾半年没成功,最终还是使用第三方框架

支付宝开放平台登录,进入沙箱环境https://open.alipay.com/platform/home.htm 开发文档:https://openhome.alipay.com/developmentDocument.htmhttps://docs.open.alipay.com/270/ 发送给支付的请求都需要进行签名:https://docs.open.alipay.com/291/106118 GitHub的python-alipay-sdk开发文档:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md#python-alipay-sdk

公钥私钥.png 

订单支付_网站对接支付宝流程图

订单支付_网站对接支付宝流程图.png

订单支付_订单支付代码

使用python工具包:https://github.com/fzlee/alipay/blob/master/README.zh-hans.md

使用教程

安装:

安装python-alipay-sdk在ubuntu中运行,需要管理员权限 pip3 install python-alipay-sdk --upgrade --user 或 sudo pip3 install python-alipay-sdk --upgrade

生成秘钥文件

openssl OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥 OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥 OpenSSL> exit会生成私钥和公钥文件把文件里的公钥设置在支付宝上把支付宝的公钥复制粘贴到文件里

把生成的私钥和支付宝的公钥放在django里

开始写代码

订单支付

alipay.trade.pay(统一收单交易支付接口):https://docs.open.alipay.com/api_1/alipay.trade.pay/ alipay.api_alipay_trade_page_pay

from alipay import AliPay from django.conf import settings import os #订单支付 #ajax post #前端传递参数:订单id(order_id) #/order/pay 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_id:订单id,user:用户,pay_method=3:支付方式(支付宝),order_status:订单状态(未支付) 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="2016092200568545", #APPID app_notify_url=None, # 默认回调url,可以传也可以不传 app_private_key_path=os.path.join(settings.BASE_DIR,"apps/order/app_private_key.pem"), #私钥的路径 alipay_public_key_path=os.path.join(settings.BASE_DIR,"apps/order/app_public_key.pem"),#支付宝公钥的路径 sign_type="RSA2", # RSA 或者 RSA2,签名的算法 debug = True # 默认False,沙箱环境改成True ) #借助alipay对象,向支付宝发起支付请求 #电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do?+order_string total_pay = order.total_price + order.transit_price #订单总金额 order_string = alipay.api_alipay_trade_page_pay( out_trade_no=order_id, #订单id total_amount=str(total_pay), #支付宝总金额 subject="天天生鲜%s"%order_id, #订单标题 return_url=None, notify_url=None ) #返回应答 pay_url = "https://openapi.alipaydev.com/gateway.do?"+order_string return JsonResponse({"res":3,"pay_url":pay_url})

配置URL

url(r'^pay$',OrderPayView.as_view(),name="pay"),#订单支付

配置前端

... {% load staticfiles %} ... {% csrf_token %} ... <!-- order_id:订单id,status:支付状态 --> <a href="#" order_id={{ order.order_id }} status="{{ order.order_status }}" class="oper_btn">去付款</a></td> ... <script src="{% static 'js/jquery-1.12.4.min.js' %}"></script> <script> $('.oper_btn').click(function () { console.log('1') //获取status订单状态 status=$(this).attr('status'); if(status ==1){ //进行支付 //获取订单id order_id = $(this).attr('order_id'); csrf = $('input[name="csrfmiddlewaretoken"]').val(); //组织参数 params = {"order_id":order_id,"csrfmiddlewaretoken":csrf}; //发起ajax post请求,访问/order/pay,传递参数:order_id $.post('/order/pay',params,function (data) { if(data.res == 3){ //引导用户到支付页面 window.open(data.pay_url) }else{ alart(data.errmsg) } }) }else{ //其他情况 } }); </script>

查看订单支付的结果

alipay.trade.query(统一收单线下交易查询) :https://docs.open.alipay.com/api_1/alipay.trade.query/ api_alipay_trade_query

#查看订单支付的结果 #ajax post #前端传递参数:订单id(order_id) #/order/check class CheckPayView(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":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= '2016092200568545', app_notify_url=None, app_private_key_path=os.path.join(settings.BASE_DIR, "apps/order/app_private_key.pem"), # 私钥的路径 alipay_public_key_path=os.path.join(settings.BASE_DIR, "apps/order/app_public_key.pem"), # 支付宝公钥的路径 sign_type="RSA2", debug=True ) while True: response = alipay.api_alipay_trade_query(order_id) code = response.get("code") #如果返回码为10000和交易状态为交易支付成功 if code == "10000" and response.get("trade_status") == "TRADE_SUCCESS": #支付成功 #获取支付宝交易号 trade_no = response.get("trade_no") #更新订单状态 order.trade_no = trade_no order.order_status = 4 #待评价 order.save() return JsonResponse({"res":3,"message":"支付成功"}) #返回码为40004 或 交易状态为等待买家付款 elif code == "40004" or (response.get("trade_status") == "WAIT_BUYER_PAY"): #等待买家付款 #业务处理失败,可能一会就会成功 import time time.sleep(5) continue else: #支付出错 return JsonResponse({"res":4,"errmsg":"支付失败"})

url

url(r'^check$',CheckPayView.as_view(),name="check"), #查询支付交易结果

前端

<script> /*$(".oper_btn").each(function(){ //获取支付状态 status = $(this).attr('status'); if(status == 1){ $(this).text("去支付") }else if(status == 4){ $(this).text("去评价") }else if(status ==5){ $(this).text("已完成") } }); $('.oper_btn').click(function () { //获取status订单状态 status=$(this).attr('status'); order_id = $(this).attr('order_id'); if(status ==1){ //进行支付 //获取订单id csrf = $('input[name="csrfmiddlewaretoken"]').val(); //组织参数 params = {"order_id":order_id,"csrfmiddlewaretoken":csrf}; //发起ajax post请求,访问/order/pay,传递参数:order_id $.post('/order/pay',params,function (data) { if(data.res == 3){ //引导用户到支付页面 window.open(data.pay_url); */ //浏览器访问/order/check,获取支付交易的结果 $.post('/order/check',params,function (data) { if(data.res == 3){ //刷新页面 location.reload() /* }else{ alert(data.errmsg) } }) }else{ alart(data.errmsg) } }) }else{ //其他情况 //跳转到评价页面 location.href="/order/comment/"+order_id } }); */ </script>

 

最新回复(0)