【愚公系列】2022年02月 Django商城项目 34-订单支付功能实现(支付宝)[通俗易懂]

【愚公系列】2022年02月 Django商城项目 34-订单支付功能实现(支付宝)[通俗易懂]文章目录前言一、回调逻辑处理1.安装SDK2.生成私钥公钥3.setting中支付宝配置信息4.生成支付URL5.接收支付成功信息前言具体支付宝支付流程可参考这篇文章:https://www.cnblogs.com/xiaolu915/p/10528155.html一、回调逻辑处理1.安装SDKpipinstallpython-alipay-sdk–upgrade2.生成私钥公钥opensslOpenSSL>genrsa-outapp_private_key.pem

大家好,又见面了,我是你们的朋友全栈君。


前言

具体支付宝支付流程可参考这篇文章:https://www.cnblogs.com/xiaolu915/p/10528155.html

在这里插入图片描述

一、回调逻辑处理

1.安装SDK

pip install python-alipay-sdk --upgrade

2.生成私钥公钥

openssl
OpenSSL> genrsa -out app_private_key.pem 2048  # 私钥RSA2
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit

在支付宝中下载的私钥文件格式需要修改成正确格式

3.setting中支付宝配置信息

ALIPAY_APPID = '2016091600523030'
ALIPAY_DEBUG = True
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'
ALIPAY_RETURN_URL = 'http://localhost:8000/payment/status/'
APP_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'app/pay/keys/app_private_key.pem')
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'app/pay/keys/alipay_public_key.pem')

4.生成支付URL

class PaymentView(LoginRequiredJSONMixin,View):

    def get(self,request,order_id):
        # 0.接收验证订单
        try:
            # 传一个订单id是没有问题的
            # 为了让查询的更准确, 我们是应该查询 未支付的
            order = OrderInfo.objects.get(order_id=order_id,
                                          user=request.user,
                                          status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return http.JsonResponse({ 
   'code':RETCODE.PARAMERR,'errmsg':'暂无此订单'})
        # 1.创建alipay实例对象
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()


        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug = True  # 默认False
        )
        # 2.生成order_string
        # 如果你是 Python 3的用户,使用默认的字符串即可
        subject = "测试订单"

        # 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
        # 正式环境的 https://openapi.alipay.com/gateway.do? + order_string
        # 沙箱环境的 https://openapi.alipaydev.com/gateway.do
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount),
            subject=subject,
            return_url=settings.ALIPAY_RETURN_URL,

        )
        # 3.拼接调转的url
        pay_url = settings.ALIPAY_URL + '?' + order_string
        # 4.返回
        return http.JsonResponse({ 
   'code':RETCODE.OK,'pay_url':pay_url})

在这里插入图片描述
一直点击下一步支付成功后回跳转到回调地址

5.接收支付成功信息

class PayStatusView(View):

    def get(self,request):

        """ 将订单id和支付宝id保存起来 1.创建支付宝实例 2.获取验证数据 3.根据状态保存数据 """
        #
        # 1.创建支付宝实例
        app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
        alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()

        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_string=app_private_key_string,
            # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            alipay_public_key_string=alipay_public_key_string,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=True  # 默认False
        )
        # 2.获取验证数据
        data = request.GET.dict()
        # sign 不能参与签名验证
        signature = data.pop("sign")

        # verify
        success = alipay.verify(data, signature)
        if success:
            # 3.根据状态保存数据
            """ trade_no String 必填 64 支付宝交易号 2013112011001004330000121536 out_trade_no String 必填 64 商户订单号 6823789339978248 """
            trade_no = data.get('trade_no')
            out_trade_no=data.get('out_trade_no')

            Payment.objects.create(
                order_id=out_trade_no,
                trade_id=trade_no
            )


        return render(request,'pay_success.html',context={ 
   'trade_no':trade_no})

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137785.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 寒假33天读书笔记

    寒假33天读书笔记整理一下电脑资料 无意发现大二年寒假的一段读书笔记 距离现在快三年了 再回头浏览一下 感觉那会上大学时候还真是蛮自由 想读什么就读什么 不像现在出来工作后 读书已经带有很明确的目的性 记得那学期选修了 美学概论 本来是只想混个学分的 上课都是带着 thinkinjava 过去 结果被老师 记不得老师名字了 只记得是人文管理学院的老师 一讲 从西方地理环境扯到文化起源和发展 再对比东方文化

    2025年10月3日
    4
  • Oracle 11g安装及配置详解

    Oracle 11g安装及配置详解1、点击setup.exe文件2、处理[INS-13001]环境不满足最低要求(1)首先,打开解压后的database文件夹,找到stage文件夹,然后cvu,找到cvu_prereq.xml文件,用记事本打开,添加以下代码:<OPERATING_SYSTEMRELEASE="6.2"><VERSIONVALUE="3"/>&…

    2022年5月30日
    98
  • dnf钓鱼网站不小心点开了_dnf易语言源码

    dnf钓鱼网站不小心点开了_dnf易语言源码其实本人当时也没注意很多。就按下了“点此充值”注意!这个所谓的登录根本不是TX的登录,其实就是用一个表单将你的帐号和密码发给盗号的!当你打完帐号密码后按下那个“登录”按钮,你的帐号密码已经到了盗号的手里,不过,他们还差一步,才能将你的号彻底洗干净,那就是你的绑定手机和手机令牌、二级密码。好吧,草了个蛋,这是个.net的页面。继续,当你打完你的号码以后不按“登录”,好吧,我解释一下,因为盗号的人不需…

    2022年8月24日
    7
  • 磁盘未初始化 修复_初始化磁盘是什么意思

    磁盘未初始化 修复_初始化磁盘是什么意思磁盘没有初始化是因为0号扇区损坏,导致机械硬盘分区表读取不出来,从而机械硬盘出现磁盘没有初始化。工具/软件:极限数据恢复软件步骤1:程序打开后,直接双击需要恢复数据的物理盘。步骤2:等待程序扫描完毕大概需要几分钟到半个小时,稍微耐心等下即可。步骤3:软件扫描到资料后,软件会将扫描到的分区列出来。步骤4:勾上所有需要恢复的资料,右击选择《复制勾选的文件》,…

    2022年4月19日
    131
  • Vmware Links(转自VMware-land)「建议收藏」

    Vmware Links(转自VMware-land)「建议收藏」这一阵子在专研虚拟机的VSS备份,无意中发现了VMware-land很好的网站,不知道为什么无法访问,难道也被和谐掉了???以下内容是从Google的页面缓存弄出来的,在Google搜索http://vmware-land.com/Vmware_Links.html第一个就是包含了你所知道的和不知道的,关于VMwareESX的方方面面链接地址Backups:Vir…

    2022年10月3日
    5
  • 将本地依赖上传私库

    将本地依赖上传私库将本地依赖上传私库查看是否上传成功提示:如果本地依赖升级了,尽可能通过升级版本号的方式重新上传。如果依旧是原来版本,虽重新上传了,但私库存在缓存,可能使用的仍是缓存中的旧版本。…

    2022年7月18日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号