Django网站项目线下二维码扫描支付
2021-03-22 17:26
标签:targe 文件的 home 二维码扫描 appid https 支付宝支付 提取 私钥 链接:https://pan.baidu.com/s/1AXK3s4SBowNp1K47Qc1QHw 运行.exe文件 在你下载的过程中肯定会遇到上述这样的情况,下载sdk的时候,需要上面红框内的三个依赖包,第一个和第二个你有可能自己去pip下载,或者他帮你已经下载好了,但是第三个包好像是下载不了,经过我大量的搜索,好像是下载另外一个类似于这样的包,这个包是他的延申——pycryptodome。所以你得去pip install pycryptodome了。但是在你下载这个包的时候,还是会报上面一样的错误。所以支付宝开发者平台给我们提供的SDK包是无法下载的。 pip install python-alipay-sdk 这种下载就会没错了。 Django网站项目线下二维码扫描支付 标签:targe 文件的 home 二维码扫描 appid https 支付宝支付 提取 私钥 原文地址:https://www.cnblogs.com/aitiknowledge/p/12699694.html1、前期工作
提取码:2u04
python SDK工具包下载(坑的不得了)
创建项目app
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"), # 验证支付是否完成
]
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()
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})
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"))