Django网站项目线下二维码扫描支付

1、前期工作

  • 设置密钥的方式需要下载以支付宝生成密钥工具:工具包的地址及提取码:

    链接:https://pan.baidu.com/s/1AXK3s4SBowNp1K47Qc1QHw
    提取码:2u04

  运行.exe文件

  

  • 复制my_private_key.pem的内容,并且保证里面不含有空格和换行等字符;将复制的内容再填入第一张图中的RSA2密钥的设置中,会生成支付宝公钥并复制存放在alipay_public_key.pem文件中

python SDK工具包下载(坑的不得了)

  • 在下载的过程中,支付宝官方提供了SDK工具包,在cmd命令行中运行:pip install alipay-sdk-pythoon。如果在下载的过程中没有出现错误,那你就是幸运儿;如果你报错了,那么恭喜你已经入坑了。别急,我既然这么说了,就有帮你解决问题的能力。

在你下载的过程中肯定会遇到上述这样的情况,下载sdk的时候,需要上面红框内的三个依赖包,第一个和第二个你有可能自己去pip下载,或者他帮你已经下载好了,但是第三个包好像是下载不了,经过我大量的搜索,好像是下载另外一个类似于这样的包,这个包是他的延申——pycryptodome。所以你得去pip install pycryptodome了。但是在你下载这个包的时候,还是会报上面一样的错误。所以支付宝开发者平台给我们提供的SDK包是无法下载的。

  • 问题解决:经我翻天覆地的搜索,无意中看到了另外一种下载方式,这一种方式就是使用了pycryptodome这个依赖包,那么你就可以直接下载了:

pip install python-alipay-sdk

这种下载就会没错了。

创建项目app

  • 进入项目目录下运行:python manage.py startapp payment
  • 然后再创建下面图一样的目录(只需要看payment app目录即可,文件颜色不用管)将之前保存的私钥公钥文件都粘贴到key的目录下

  • 这里就省略主url配置了,直接进入子url配置了

    • urls.py文件
from django.urls import path
from . import views

app_name = ‘[payment]‘
urlpatterns = [
    path("alipay/", views.AliPayView.as_view(), name="alipay"),   # 支付宝支付
    path("check_pay/", views.CheckPayView.as_view(), name="check_pay"),   # 验证支付是否完成
]
  • 视图文件就很重头戏了

    • 分别创建这两个类了,另外在类的外部先定义好Alipay的对象。相信大家已经看过很多Alipay对象的创建了,他们初始化对象的参数是不一样的,因为他们是没有下载SDK工具包,所以应该都是去github上复制了一份别人封装的alipay的工具包,所以在使用对象调用方法是有些是不一样的。如果你下载了SDK工具包,按照我的步骤就不会错的。还有不能一味的跟着别人的代码敲,多看看里面的源码以及他的实现方式。废话不多说,上代码了(这里我一部分一部分写,这样有助于理解,也让自己增强记忆,但都是同一个views.py文件中)P
    • 第一步就是初始化我们的Alipay类的对象,首先先看下Alipay类的源码,他是继承了BasePay类,所以直接看BasePay类的源码,我这里直接去当前使用并且中的地方。方式:AliPay——>BaseAliPay——>查看他的__init__初始化方法,主要看我添加注释的地方,似乎不是加载应用私钥文件和支付宝公钥文件,最后一句是调用了加载这两种文件的方法——>_load_key方法,里面的注释很重要,这里不复制,主要讲述的内容是我们需要pem文件格式的内容,而在文件头和文件尾都需要添加----- 描述性语言 -----。浏览_load_key方法的时候就会知道为什么需要pem文件和文件头和文件尾的样式。然后在读取文件时也需要像下面这样读取,当然如果你能保证获取的内容相同,读取文件的方式可以不一致。

def __init__(
        self,
        appid,
        app_notify_url,
        app_private_key_string=None,
        alipay_public_key_string=None,
        sign_type="RSA2",
        debug=False
    ):
        """
        初始化:
        alipay = AliPay(
          appid="",
          app_notify_url="http://example.com",
          sign_type="RSA2"
        )
        """
        self._appid = str(appid)
        self._app_notify_url = app_notify_url

        #  就是my_private_key.pem里面的内容
        self._app_private_key_string = app_private_key_string

        #  就是alipay_public_key.pem里面的内容
        self._alipay_public_key_string = alipay_public_key_string

        self._app_private_key = None
        self._alipay_public_key = None
        if sign_type not in ("RSA", "RSA2"):
            raise AliPayException(None, "Unsupported sign type {}".format(sign_type))
        self._sign_type = sign_type

        if debug is True:
            self._gateway = "https://openapi.alipaydev.com/gateway.do"
        else:
            self._gateway = "https://openapi.alipay.com/gateway.do"

        # load key file immediately

        #  这里很关键,也是重点
        self._load_key()

AliPay初始化方法__init__

from alipay import AliPay

my_private_key = ""
alipay_public_key = ""
with open("./payment/key/my_private_key.pem") as f1:
    for read in f1.readlines():
        my_private_key += read

with open("./payment/key/alipay_public_key.pem") as f2:
    for read in f2.readlines():
        alipay_public_key += read
alipay = AliPay(appid=‘2016102100732430‘,
                app_notify_url=‘http://127.0.0.1:8000/payment/check_pay/‘,
                app_private_key_string=my_private_key,
                alipay_public_key_string=alipay_public_key,
                debug=True)
    • 这个时候我们可以在前端发出一个请求,像发出类似支付这样的请求。前端拿到这样的地址,做一个重定向。
class AliPayView(ListAPIView):
    # 这里只是定义一个全局的订单号
    order_id = None

    def get(self, request):
        """
        请求获取支付宝的支付二维码
        :param request: 获取的请求
        :return: 含有支付二维码的请求地址
        """
        all_price = request.GET.get("all_price")
        AliPayView.order_id = request.GET.get("order_id")

        params = alipay.api_alipay_trade_page_pay(
            subject="商品购买",        # 收费的名称
            out_trade_no=str(uuid.uuid4()),   #商户的订单号,唯一,使用uuid比较方便
            total_amount=all_price,      # 从前端获取的价格
            # 这个很关键,这里是支付的时候需要验证一个请求的地址
            return_url="http://127.0.0.1:8000/payment/check_pay/",
        )
        # 支付宝网关的地址:因为是debug=False所以是沙箱的地址
        url = alipay._gateway + "?" + params

        return Response(data={"url": url})
    • 当我们用沙箱支付宝扫码并且支付成功时,会像服务器发出上面return_url地址的get请求,并且他会携带上述的params的参数,而且参数中会有sign的标识,需要使用AliPay对象调用签名验证的方法verify,他的返回值是boolean值
class CheckPayView(APIView):

    def get(self, request):
        """
        验证用户是否支付成功,支付成功就需要修改订单的状态,
        :param request: 获取的请求
        :return: 重定向到订单页面
        """
        params = request.GET.dict()
        sign = params.pop("sign")
        if alipay.verify(params, sign):
            order = Orders.objects.get(pk=AliPayView.order_id)
            order.status = 2
            order.save()
        return redirect(reverse("operations:order"))
    • 这样views.py文件已经写完

原文地址:https://www.cnblogs.com/aitiknowledge/p/12699694.html

时间: 2024-08-30 09:14:29

Django网站项目线下二维码扫描支付的相关文章

微信二维码扫描支付

微信二维码扫码支付的原理 参数生成等请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 微信扫码支付.简单来说,就是你把微信支付需要的信息,生成到二维码图片中.通过微信扫一扫,发起支付.我们需要做的就是二件事: 一是:按照微信扫码支付规则生成二维码信息. 二是:微信没有提供生成二维码图片的接口.需要我们自己把二维码信息生成到二维码图片中. 1.模式选择: 微信扫码支付,有两种模式,文档中有介绍.第二种模式,微

手机线下支付,全面的二维码防盗支付措施来了,赶紧收藏!

随着二维码支付越来越普及,不法分子们也想出了各种各样的盗刷手段,让消费者和商家防不胜防.人们现在购物,娱乐,停车,缴费等只需要提供一个手机就能解决,商店付款时提供二维码或者扫码就可以,正因为如此,最近就有出现打开付款二维码等待付款时被盗刷的现象,那么我们要如何才能预防这些聚合支付的诈骗手法呢?具体的二维码支付防盗指南如下: 防盗第一招:不要提前打开二维码 大家在付款时为了能尽快完成这笔交易,会早早在排队的时候就打开了自己的二维码.确不知,这种行为让不法分子有机可乘.如果有不法分子用手机和其他扫码

【转】Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果--不错

原文网址:http://blog.csdn.net/xiaanming/article/details/10163203 转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10163203 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现

Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能.自己感觉挺新颖的,从一张图片中扫一下居然能直接加好友,不可思议啊,那时候还不了解二维码.呵呵,然后做项目的时候.老板说要加上二维码扫描功能.然后自己的屁颠屁颠的去百度,google啥的.发现非常多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,非常快我的项目就增加了扫描二维码的功能,然后自己还非常开心. 随着微信的到来,二维码越来越火爆,随处能看到二维码,比方商城里面,肯德基,餐厅等等.对于

android 二维码扫描

了解二维码这个东西还是从微信 中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候, 老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了 二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于

基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包,之前我项目中的二维码扫描功能只实现了扫描功能,其UI真的是其丑无比,一个好的应用软件,其UI界面也要被大众所接纳,不然人家就不会用你的软件啦,所以说应用软件功能和界面一样都很重要,例如微信,相信微信UI被很多应用软件所模仿,我也仿照微信扫描二维码效果进行模仿,虽然

实现网站二维码扫描登录

实现网站二维码扫描登录 分类: 架构设计2014-03-31 10:33 14613人阅读 评论(6) 收藏 举报 在尝试使用网页版微信时,发现微信的登录方式比较酷.区别与常用的用户名和密码的登录方式,网页微信登录只需要轻轻一扫,即可方便的实现登录功能. 下面尝试根据个人的理解对其可能的架构猜测一番.总体来看,扫描二维码实现网站的登录并不是太困难的事情.首先来看一下二维码登录的整体架构: 在整个架构中,主要包含了几个模块:手机App.浏览器.Web服务器以及存储服务(session服务).整个方

在.net core web项目中生成二维码

原文:在.net core web项目中生成二维码 1.添加QRCoder包引用 2. public IActionResult MakeQrCode()        { string url="https://www.baidu.com"; var generator = new QRCodeGenerator(); var codeData = generator.CreateQrCode(str,QRCodeGenerator.ECCLevel.M,true); var qrc

【转】Android手机客户端关于二维码扫描的源码--不错

原文网址:https://github.com/SkillCollege/QrCodeScan QrCodeScan 这是Android手机客户端关于二维码扫描的源码,使用了高效的ZBar解码库,并修复了中文乱码. 融合了ZXing代码(使用其中的相机管理功能). 一. 使用开源ZXing扫描的缺点 1.原始代码是横屏模式,尽管可以改成竖屏,但是扫描界面的自定义和多屏幕适配不好做 2.有效扫描区域不好控制,可能是我自己技术不成熟,没找到好方法 3.ZXing是Java写的,对二维码的解析效率没有