开源web框架django知识总结(二十二)

支付

提示:

  • 如果用户选择的支付方式是 “支付宝” ,在点击《去支付》时对接支付宝的支付系统。

支付宝介绍

支付宝开放平台入口

  • https://open.alipay.com/platform/home.htm

1.使用手机上的支付宝扫码登录

2. 创建应用和沙箱环境

1.创建应用

2.沙箱环境

支付宝提供给开发者的模拟支付的环境。跟真实环境是分开的。

沙箱应用:https://openhome.alipay.com/platform/appDaily.htm?tab=info



配置支付宝“应用公钥”,“支付宝公钥”

沙箱账号:https://openhome.alipay.com/platform/appDaily.htm?tab=account

买家账号sdkywg1362@sandbox.com
登录密码111111
支付密码111111
用户名称沙箱环境
证件类型身份证(IDENTITY_CARD)
证件号码847038195010111148
账户余额
2016215.53充值取现

3. 支付宝开发文档

  • 文档主页:https://openhome.alipay.com/developmentDocument.htm

  • 电脑网站支付产品介绍:https://docs.open.alipay.com/270

  • 电脑网站支付快速接入:https://docs.open.alipay.com/270/105899/

  • API列表:https://docs.open.alipay.com/270/105900/

  • SDK文档:https://docs.open.alipay.com/270/106291/

  • Python支付宝SDK:

    https://github.com/fzlee/alipay/blob/master/README.zh-hans.md

    • SDK安装:pip install python-alipay-sdk==2.0.1
  1. 电脑网站支付流程

5.新建apps --> payment,注册,添加主路由,添加子urls.py

6.配置RSA2公/私钥

提示:

  • 阿尔法商城私钥加密数据,阿尔法商城公钥解密数据。
  • 支付宝私钥加密数据,支付宝公钥解密数据。

1.生成 阿尔法商城公/私钥

========================================================

对接支付宝系统

订单支付功能

提示:

  • 订单支付触发页面:《order_success.html》 和 《user_center_order.html》
  • 我们实现订单支付功能时,只需要向支付宝获取登录链接即可,进入到支付宝系统后就是用户向支付宝进行支付的行为。

1.请求方式

选项 方案
请求方法 GET
请求地址 /payment/(?P<order_id>\d+)/

2.请求参数:路径参数

参数名 类型 是否必传 说明
order_id int 订单编号

3.响应结果:JSON

字段 说明
code 状态码
errmsg 错误信息
alipay_url 支付宝登录链接

4.后端接口定义和实现

payment.views.py

from django.views import View
from django.http import JsonResponse
from django.conf import settings
from orders.models import OrderInfo
from .models import Payment
from alipay import AliPay
import osclass PaymentView(View):# 接口1、获取支付页面链接def get(self, request, order_id):# 1、提取参数# 2、校验参数try:order = OrderInfo.objects.get(pk=order_id)except OrderInfo.DoesNotExist as e:print(e)return JsonResponse({'code': 400, 'errmsg': '订单不存在!'}, status=404)# 3、获取支付页面链接  默认回调urlalipay_url = Nonewith open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'), "r") as f:app_private_key = f.read()with open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_public_key.pem'), "r") as f:alipay_public_key = f.read()# 3.1 构建一个Alipay对象alipay = AliPay(appid=settings.ALIPAY_APPID,# 异步回调,支付成功之后,阿里后台主动请求阿尔法app_notify_url=None,# 阿尔法私钥app_private_key_string=app_private_key,# 阿里公钥alipay_public_key_string=alipay_public_key,sign_type='RSA2',debug=settings.ALIPAY_DEBUG)# 3.2 调用对象的方法# 扫码页面完整的链接是:# https://openapi.alipaydev.com/gateway.do?<查询字符串参数># order_string = alipay.api_alipay_trade_app_pay() # 移动端# 网页端order_string = alipay.api_alipay_trade_page_pay(subject='阿尔法商城%s'%order_id,out_trade_no=order_id,total_amount=float(order.total_amount),# 支付成功之后,用户页面跳转地址return_url=settings.ALIPAY_RETURN_URL)# 4、构建响应返回alipay_url = settings.ALIPAY_URL + '?' + order_stringreturn JsonResponse({'code': 0,'errmsg': 'ok','alipay_url': alipay_url})

5.支付宝SDK配置参数

dev.py

# 阿里支付配置参数
ALIPAY_APPID = '2016102500755751'
ALIPAY_DEBUG = True
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'
ALIPAY_RETURN_URL = "http://127.0.0.1/pay_success.html"

=================================

保存订单支付结果

1. 支付结果数据说明

  • 用户订单支付成功后,支付宝会将用户重定向到 http://127.0.0.1:8000/payment/status/,并携带支付结果数据。
  • 参考统一收单下单并支付页面接口:https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay?scene=API002020081300013629
  1. 定义支付结果模型类
from django.db import models
from aerf_mall.utils.BaseModel import BaseModel
from orders.models import OrderInfoclass Payment(BaseModel):"""支付信息模型类"""# 交易的订单信息order = models.ForeignKey(OrderInfo,on_delete=models.CASCADE,verbose_name='订单')# 支付的交易号保存字段trade_id = models.CharField(max_length=100,unique=True, # 约束,唯一null=True,blank=True,verbose_name="支付编号")class Meta:db_table = 'tb_payment'verbose_name = '支付信息'verbose_name_plural = verbose_name

3. 保存订单支付结果

1.请求方式

选项 方案
请求方法 GET
请求地址 /payment/status/

2.请求参数:路径参数

参考统一收单下单并支付页面接口中的《页面回跳参数》

3.响应结果:HTML

pay_success.html

4.后端接口定义和实现

注意:保存订单支付结果的同时,还需要修改订单的状态为待评价

class PaymentStatusView(View):def put(self, request):# 用户支付成功之后,跳转回阿尔法页面的请求# 校验是否支付成功# 1、提取查询字符串参数data = request.GET # QueryDict类型data = data.dict() # QueryDict.dict()转化成普通字典# 提取签名(token值)sign = data.pop('sign')with open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'), "r") as f:app_private_key = f.read()with open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_public_key.pem'), "r") as f:alipay_public_key = f.read()# 2、根据签名验证数据是否完整alipay = AliPay(appid=settings.ALIPAY_APPID,# 异步回调,支付成功之后,阿里后台主动请求阿尔法app_notify_url=None,# 阿尔法私钥app_private_key_string=app_private_key,# 阿里公钥alipay_public_key_string=alipay_public_key,sign_type='RSA2',debug=settings.ALIPAY_DEBUG)if not alipay.verify(data,signature=sign):return JsonResponse({'code': 400, 'errmsg': '支付失败!'}, status=400)# 3、阿尔法订单号和支付宝流水号关联order_id = data.get('out_trade_no')trade_id = data.get('trade_no')try:Payment.objects.create(order_id=order_id,trade_id=trade_id,)except Exception as e:print(e)return JsonResponse({'code': 400,'errmsg': '支付订单保存失败!'})# 修改订单状态OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])return JsonResponse({'code': 0,'errmsg': 'ok','trade_id': trade_id})

payment.urls.py

from django.urls import re_path
from . import viewsurlpatterns = [
# 订单支付re_path(r'^payment/(?P<order_id>\d+)/$', views.PaymentView.as_view()),
# 订单支付状态re_path(r'^payment/status/$', views.PaymentStatusView.as_view()),
]

开源web框架django知识总结(二十二)相关推荐

  1. python3 web框架_循序渐进Python3(十二) --0--  web之框架

    上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...

  2. Python Web框架Django学习(二)

    python web框架Django学习(二) 目录:  三.Django创建APP  四.创建登录页面,实现用户交互,后台管理用户(非数据库方式) ========================= ...

  3. django 业务逻辑写在view里吗?_Python Web框架Django简介

    引言 我们都知道,Django是一种基于Python的Web开发框架. 那么,什么是Web开发?Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上展现给前台用户的应用. ...

  4. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  5. python搭建django框架,Python之Web框架Django项目搭建全过程

    Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip fre ...

  6. Web框架Django使用概览

    Web框架Django使用概览 标签: django python 1 开始一个新项目 django的安装比较简单,在命令行里执行下面的命令. pip install django 为了能使用djan ...

  7. 最新首途影视视频网站源码/二十二套带后台版全开源无加密源码

    源码简介: 最新首途二十二套带后台版全开源无加密源码 菜单填写格式:MyTheme主题,/template/mytheme/admin/默认账号:admin默认密码:admin 下载链接 网盘源码  ...

  8. 二十二.香港大学火星实验室R3LIVE框架跑官方数据集

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  9. 开源web框架_带有酷名称的开源JavaScript和Web框架的词汇表

    开源web框架 It's getting to the point where there are so many cool open source projects that I can't kee ...

最新文章

  1. 面向生信分析的高性 RStudio 服务器
  2. 公司要上监控,选型调研下 Zabbix 和 Prometheus
  3. 收藏 | 那些机器学习必备知识
  4. 计算机英语 考研 翻译,研究生英语翻译笔记
  5. Sublime Text使用正则表达式进行替换
  6. 2020年NLP算法秋招“神仙打架”,我该如何应对?
  7. java socket 全双工客户端_Java Websocket实例【服务端与客户端实现全双工通讯】
  8. linux内核源码下载地址
  9. 【LaTeX 常用格式设置】 如何给公式、文本添加删除线
  10. 《2022年 Android 中高级面试题汇总》及答案整理(备战金九银十)
  11. in作为介词的用法_英语介词丨in、on 、at 的具体用法到底有哪些?
  12. Windows中使用pip下载任何包都报错
  13. 达梦数据库(DM)——命令方式开启达梦数据库本地归档的具体方法
  14. 字符串排序(函数,指针)(C语言实现)
  15. $.ajax异步请求总结
  16. 如何有效地召开会议?
  17. qbo_arduqob command 命令Id约定
  18. OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
  19. php h5 调用摄像头_html5实现调用摄像头并拍照功能
  20. Oracle项目管理系统之计划编制及进度计算

热门文章

  1. Python 企业微信群推送消息
  2. 《深入浅出MFC 》(第二版)简体中文版再次印刷5000册,欲购从速 (转)
  3. VideoView使用记录
  4. 数据库设计与优化 - MySQL优化策略
  5. [416]使用Docker Swarm搭建分布式爬虫集群
  6. JasperReport做清单的展开折叠效果
  7. vue+vux vux安装出现错误
  8. RFID 基础/分类/编码/调制/传输
  9. n条结果,单页显示m条,第i页显示第几条到第几条?
  10. 阿里云smtp 发邮件配置