django调用支付宝

支付宝开放平台登录,进入沙箱环境
https://open.alipay.com/platform/home.htm
开发文档:
https://openhome.alipay.com/developmentDocument.htm
https://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
小鸡活动网
http://xiaojihuodong.com

公钥私钥.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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容