1. 业务逻辑
准备

  1. 使用沙箱提供的商家环境

    沙箱环境:是支付宝提供给开发者的模拟支付的环境

    沙箱应用:https://docs.open.alipay.com/200/105311

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

 支付宝开发者文档:

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

    产品介绍:https://docs.open.alipay.com/270

    快速接入:https://docs.open.alipay.com/270/105899/

    SDK:https://docs.open.alipay.com/270/106291/

      python对接支付宝SDK:https://github.com/fzlee/alipay/blob/master/README.zh-hans.m

    API列表:https://docs.open.alipay.com/270/105900/
  2.. 生成密钥对
  3. 将公钥加到商品环境中
  4. 将Alipay提供的公钥加入项目中
    支付功能
  5. 根据order_id查询订单对象
  6. 创建alipay对象
  7. 调用方法,生成url
  8. 返回url
    保存支付状态
  9. 根据返回的url请求支付宝
  10. 支付成功后返回商家回调页面--------->会传回很多Alipay传回来的参数,很多明文,防止别人攻击
  11. 返回商家的同时请求后台服务器------>发送这些参数给后台
  12. 接收参数并且验证,成功则创建订单支付对象返回订单号,否则提示支付失败

2.安装包

pip install python-alipay-sdk --upgrade

3.新建一个payments的app应用

python ../../manage.py startapp payments

4.定义一个模型类,继承自BaseModel(创建时间与修改时间)

 class Payment(BaseModel):
"""
支付信息
"""
order = models.ForeignKey(
OrderInfo, on_delete=models.CASCADE, verbose_name='订单')
trade_id = models.CharField(
max_length=100, verbose_name="支付流水号") class Meta:
db_table = 'tb_payment'
verbose_name = '支付信息'
verbose_name_plural = verbose_name

5.配置密钥

  5.1.登录沙箱

    在payments应用中新建keys目录,用来保存秘钥文件。

     将应用私钥文件app_private_key.pem复制到payment/keys目录下。

  5.1.1生成应用的私钥和公钥 

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

  5.2 保存应用私钥文件

  5.3 查看公钥

cat app_publict_key.pem
# 将公钥内容复制给支付宝沙箱的<应用私钥>,得到支付宝的<支付宝公钥>

  5.4 保存支付宝公钥

  在payments/keys目录下新建alipay_public_key.pem文件,用于保存支付宝的公钥文件。

  将支付宝的公钥内容复制到alipay_public_key.pem文件中

6.配置路由

GET /orders/(?P<order_id>\d+)/payment/

7.在配置文件中配置ailipay的信息

 # 支付宝支付的配置
ALIPAY_APPID = 'xxxxxxxxxxxxx'
ALIPAY_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'apps/payments/alipay/app_private_key.pem')
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'apps/payments/alipay/alipay_public_key.pem')
ALIPAY_DEBUG = True
ALIPAY_SUBJECT = '智学客-订单支付'
ALIPAY_RETURN_URL = 'http://www.xxx.com/pay_success.html'
ALIPAY_GATE = 'https://openapi.alipaydev.com/gateway.do?'

8.定义视图

两个参数:

      order_id: 订单编号

      alipay_uel: 支付宝支付链接

代码如下:

 class AliPayURLView(APIView):
def get(self, request, order_id):
# 1.根据order_id查询订单对象
try:
order_obj = OrderInfo.objects.get(pk=order_id)
except:
raise Exception("订单号无效") # 2.创建alipay对象
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None,
app_private_key_path=settings.ALIPAY_PRIVATE_KEY_PATH,
alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,
debug=settings.ALIPAY_DEBUG
) # 3.调用方法,生成url
# 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
order_string = alipay.api_alipay_trade_page_pay(
subject=settings.ALIPAY_SUBJECT,
out_trade_no=order_id, # 订单编号
total_amount=str(order_obj.total_amount), # 支付总金额,类型为Decimal(),不支持序列化,需要强转成str
return_url=settings.ALIPAY_RETURN_URL # 支付成功后的回调地址 )
# 4.返回url
return Response({"alipay_url": settings.ALIPAY_GATE + order_string})

  8.1 在payments/urls.py中定义路由规则 

 url('^orders/(?P<order_id>\d+)/payment/$',views.PaymentView.as_view()),

9.保存支付状态

请求方式:PUT /payment/status/?支付宝参数

参数:trade_id:支付宝流水账号

代码实现:

class OrderStatusView(APIView):
"""验证用户是否登录成功""" def put(self, request):
# 1.接收支付宝返回的数据
data = request.query_params.dict() # 2.验证是否支付成功
# 2.1删除签名,不参与验证
signature = data.pop("sign") # 2.2 创建alipay对象
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None,
app_private_key_path=settings.ALIPAY_PRIVATE_KEY_PATH,
alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,
debug=settings.ALIPAY_DEBUG
) # 2.3 调用verify(字典,签名)
success = alipay.verify(data, signature)
if success:
# 支付成功
'''
{
'total_amount': '11388.00', 支付金额
'auth_app_id': '2016082100304973', 应用编号
'method': 'alipay.trade.page.pay.return',
'trade_no': '2018110722001420410500545016',流水号
'timestamp': '2018-11-07 16:59:20',时间
'app_id': '2016082100304973',应用编号
'out_trade_no': '20181107160224000000001',商城的订单编号
'charset': 'utf-8',编码
'seller_id': '2088102172415825',商家编号
'version': '1.0'版本
}
'''
# 1 获取订单号
order_id = data["out_trade_no"]
# 2 修改订单状态
try:
order_obj = OrderInfo.objects.get(pk=order_id)
except:
raise Exception("订单号无效")
order_obj.status = 2
order_obj.save() # 3.创建订单支付对象
trade_no = data.get('trade_no') # 获取流水号
Payment.objects.create(
order_id=order_id,
trade_no=trade_no
) # 4.响应
return Response({"trade_id": trade_no})
else:
raise Exception("支付失败")

  9.1 定义路由规则 

   url('^payment/status/$',views.PaymentStatusView.as_view()),

Django中对接第三方支付(支付宝)实现支付的流程的更多相关文章

  1. Django day35 redis连接池,redis-list操作,django中使用redis,支付宝支付

    一:redis连接池, 二:redis-list操作, 三:django中使用redis, 四:支付宝支付

  2. django中使用第三方包实现定时任务

    # 转载请留言联系 在做主页静态化的时候,需要定时生成主页HTML,以保持数据的最新. 定时任务可以用第三方包django-crontab来实现. 附上官方文档:https://pypi.org/pr ...

  3. 微信、支付宝App支付-JPay0.0.2发布

    JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...

  4. uni-app开发经验分享十八:对接第三方h5

    1.uni-app中对接第三方为了防止跳出app使用了webview <template> <view> <web-view :src="url" @ ...

  5. php支付走过的坑(微信篇 包含h5支付和app支付 注册 秘钥 环境等等配置)

    支付这东西,说容易也容易,说难也难 代码这玩意还比较好说 但是 如果没有demo 直接去看官方文档 十有八九一脸懵逼 今天就整理一下 支付这块走过的坑 涉及 微信h5支付 支付宝h5支付 (api文档 ...

  6. django中的静态文件

    静态文件 1.什么是静态文件 在django中静态文件是指那些图片.css样式.js样式.视频.音频等静态资源. 2.为什么要配置静态文件 这些静态文件往往不需要频繁的进行变动,如果我们将这些静态文件 ...

  7. django中使用事务以及接入支付宝支付功能

    之前一直想记录一下在项目中使用到的事务以及支付宝支付功能,自己一直犯懒没有完,趁今天有点兴致,在这记录一下. 商城项目必备的就是支付订单的功能,所以就会涉及到订单的保存以及支付接口的引入.先来看看订单 ...

  8. Django对接支付宝Alipay支付接口

    最新博客更新见我的个人主页: https://xzajyjs.cn 我们在使用Django构建网站时常需要对接第三方支付平台的支付接口,这里就以支付宝为例(其他平台大同小异),使用支付宝开放平台的沙箱 ...

  9. 对接第三方支付接口-获取http中的返回参数

    这几天对接第三方支付接口,在回调通知里获取返回参数,有一家返回的json格式,请求参数可以从标准输入流中获取. //1.解析参数 , 读取请求内容 BufferedReader br; String ...

随机推荐

  1. hdoj5024【BFS/暴力】

    题意: 在可以行走的区域内,只能转一次90度的弯,问你最长这条路可以多长. 思路: 我们可以看到 /* 123 8 4 765 */ 转90度的路径会是横竖,也就是1-3-5-7; 还有斜的:2-4- ...

  2. Codeforces702A - Maximum Increase【尺取】

    题意: 求一个连续的最长子序列长度: 思路: 没看仔细还wa1了-以为LIS- 然后写了尺取吧...= =太不仔细了.不过收获是LIS特么写挫了然后看了学长的blog<-点我- 题目的挫code ...

  3. bzoj 3704: 昊昊的机油之GRST【贪心+脑洞】

    脑洞题大概 首先处理出每个位置需要操作的次数c,假设第一次达到目标就不能再走,这样的操作次数是c差分后值的正数和,就想成分治每一段然后同减最小值然后从0处断开 然后考虑能一圈一圈走的情况,连续一段多走 ...

  4. 黑客攻防技术宝典Web实战篇:避开客户端控件习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 通过客户端传送的数据如何阻止破坏性攻击? 可以使用保存在服务器上的密钥对数据进行加密或散列 ...

  5. Luogu P4139 上帝与集合的正确用法【扩展欧拉定理】By cellur925

    题目传送门 题目中的式子很符合扩展欧拉定理的样子.(如果你还不知扩展欧拉定理,戳).对于那一堆糟心的2,我们只需要递归即可,递归边界是模数为1. 另外,本题中好像必须要用快速乘的样子...否则无法通过 ...

  6. 删除一个ppa

    https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/ 总结如下: 1: 桌面删除,进入software & update,然后 ...

  7. js锚点

    锚点,在地址栏http://localhost:8000/Demo1/js锚点.html#a   跳转到指定位置可以是 <a>标签的name 也可以是标签的id. 曾经看到有锚点的页面,但 ...

  8. Cloudera Manager是啥?主要是干啥的?

    简单来说,Cloudera Manager是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提 ...

  9. ssh密钥分发之二:使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:

    使用sshpass配合ssh-kopy-id编写脚本批量分发密钥: 首先sshpass是一个ssh连接时的免交互工具,首先要安装一下: yum install sshpass -y 接下来我们就可以使 ...

  10. python_9(模块补充)

    第1章 re模块补充 1.1 贪婪匹配:回溯算法 1.2 .*?的用法 1.3 例:分组<name>取值 1.4 匹配整数删除小数 1.5 正则测试地址 第2章 重点模块 2.1 hash ...