求助:这张GIF的效果动图整了一个多小时,没找到好的编辑软件,都太难用了。如果恰巧看到这篇文章有好的GIF编辑或者录制软件,请推荐一 个!万谢

订单支付功能是购物的最后一个环节,本文将通过对接支付宝的接口,实现支付宝付款功能。蚂蚁金服开放平台专门为开发者的网站,包含了支付宝中涉及的很多功能接口,本文的功能实现是在沙箱环境中进行,蚂蚁沙箱环境(Beta)是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑。在开发者应用上线审核前,开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作,从而帮助开发者在应用上线审核完成后,能更快速、更顺利的进行线上调试和验收工作。

开发文档中给出了电脑支付接口的过程图

一、配置密钥

下载SDK

为了帮助开发者调用开放接口,提供了开放平台服务端SDK,包含JAVA、PHP和.NET三个语言版本,封装了签名&验签、HTTP接口请求等基础功能。但是支付宝没有提供Python的SDK,我们使用GitHub中的Python工具包(链接中有Python具体的实现方式),SDK的作用就是为了减少生成签名时容易出错,安装Python-Alipay-SDK在doc中输入pip install python-alipay --upgrade

开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)。

生成密钥文件

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

将app_public_key中的内容复制到沙箱应用中

将刚刚生成的私钥和支付宝公钥放到项目目录下。

二、搭建和配置开发环境

调用接口

支付接口(alipay.trade.page.pay):

  1. 商户系统请求支付宝接口alipay.trade.page.pay,支付宝对商户请求参数进行校验,而后重定向至用户登录页面。
  2. 用户确认支付后,支付宝get请求returnUrl(商户入参传入),返回同步返回参数。
  3. 交易成功后,支付宝post请求notifyUrl(商户入参传入),返回异步通知参数。
  4. 若由于网络等问题异步通知没有到达,商户可自行调用alipay.trade.query接口进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。

视图中的处理函数

# post
def order_pay(request):'''订单支付'''# 用户登录判断if not request.session.has_key('islogin'):return JsonResponse({'res':0, 'errmsg':'用户未登录'})# 接收订单idorder_id = request.POST.get('order_id')# 数据校验if not order_id:return JsonResponse({'res':1, 'errmsg':'订单不存在'})try:order = OrderInfo.objects.get(order_id=order_id,status=1,pay_method=3)except OrderInfo.DoesNotExist:return JsonResponse({'res':2, 'errmsg':'订单信息出错'})# 和支付宝进行交互alipay = AliPay(appid="2016090800464202", # 应用idapp_notify_url=None,  # 默认回调urlapp_private_key_path=os.path.join(settings.BASE_DIR, 'df_order/app_private_key.pem'),alipay_public_key_path=os.path.join(settings.BASE_DIR, 'df_order/alipay_public_key.pem'),  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,sign_type = "RSA2",  # RSA 或者 RSA2debug = True,  # 默认False)# 电脑网站支付,需要跳转到https://openapi.alipaydev.com/gateway.do? + order_stringtotal_pay = order.total_price + order.transit_price # decimalorder_string = alipay.api_alipay_trade_page_pay(out_trade_no=order_id, # 订单idtotal_amount=str(total_pay),subject='天天生鲜%s'%order_id,return_url=None,notify_url=None  # 可选, 不填则使用默认notify url)# 返回应答pay_url = settings.ALIPAY_URL + '?' + order_stringreturn JsonResponse({'res':3, 'pay_url':pay_url, 'message':'OK'})

将支付结果通过查询接口返回

# post
def check_pay(request):'''获取用户支付的结果'''# 用户登录判断if not request.session.has_key('islogin'):return JsonResponse({'res': 0, 'errmsg': '用户未登录'})passport_id = request.session.get('passport_id')# 接收订单idorder_id = request.POST.get('order_id')# 数据校验if not order_id:return JsonResponse({'res': 1, 'errmsg': '订单不存在'})try:order = OrderInfo.objects.get(order_id=order_id,passport_id=passport_id,pay_method=3)except OrderInfo.DoesNotExist:return JsonResponse({'res': 2, 'errmsg': '订单信息出错'})# 和支付宝进行交互alipay = AliPay(appid="2016090800464202",  # 应用idapp_notify_url=None,  # 默认回调urlapp_private_key_path=os.path.join(settings.BASE_DIR, 'df_order/app_private_key.pem'),alipay_public_key_path=os.path.join(settings.BASE_DIR, 'df_order/alipay_public_key.pem'),# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,sign_type="RSA2",  # RSA 或者 RSA2debug=True,  # 默认False)while True:# 进行支付结果查询result = alipay.api_alipay_trade_query(order_id)code = result.get('code')if code == '10000' and result.get('trade_status') == 'TRADE_SUCCESS':# 用户支付成功# 改变订单支付状态order.status = 2 # 待发货# 填写支付宝交易号order.trade_id = result.get('trade_no')order.save()# 返回数据return JsonResponse({'res':3, 'message':'支付成功'})elif code == '40004' or (code == '10000' and result.get('trade_status') == 'WAIT_BUYER_PAY'):# 支付订单还未生成,继续查询# 用户还未完成支付,继续查询time.sleep(5)continueelse:# 支付出错return JsonResponse({'res':4, 'errmsg':'支付出错'})

前端的post提交

 <script>$(function () {$('.oper_btn').click(function () {// 获取订单id和订单的状态order_id = $(this).attr('order_id')order_status = $(this).attr('order_status')   //attr获取自定义的选择器csrf = $('input[name="csrfmiddlewaretoken"]').val()   //csrf防御params = {'order_id':order_id, 'csrfmiddlewaretoken':csrf}if (order_status == 1){$.post('/order/pay/', params, function (data) {if (data.res == 3){// 把用户引导支付页面window.open(data.pay_url)// 查询用户的支付结果$.post('/order/check_pay/', params, function (data) {if (data.res == 3){alert('支付成功')// 重新刷新页面location.reload()}else{alert(data.errmsg)}})}else{alert(data.errmsg)}})}})})</script>

在setting配置alipay的沙箱网址URL

ALIPAY_URL='https://openapi.alipaydev.com/gateway.do'

总结:支付的过程其实大部分都是支付宝内部封装好的功能完成,我们只是调用了支付和查询接口,将参数通过接口传递进去,我们不需要知道支付宝内部怎么实现,就完成了支付收付款的功能。除了支付接口,支付宝还提供了很多免费的接口,如店铺、芝麻信用、生活服务等,通过这些接口我们可以做很多功能的实现,接口和文档链接:点击打开链接、点击打开链接

订单支付功能对接支付宝支付接口相关推荐

  1. android支付功能开发,对接支付宝支付接口开发详细步骤

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧. 第一步:(先要在支付宝进行操做 ...

  2. PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

    PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,接下来跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试 ...

  3. C#.Net对接支付宝支付功能的介绍

    需求:我的平台是会员制的,会员分多级,每一级都需要收款功能,如下: 2015年对接支付宝支付功能时需要3个参数:alipay_id.alipay_key.seller_email,同一个平台申请帐号完 ...

  4. java 对接支付宝支付

    2019独角兽企业重金招聘Python工程师标准>>> 对接支付宝支付的前提: 1,商户开通支付能力 登录蚂蚁金服 开放平台:https://open.alipay.com/plat ...

  5. JAVA对接支付宝支付(超详细,一看就懂)

    Java对接支付宝支付 更多内容 冷文博客: 传送门 引入 为什么要发这篇帖子呢?原因很简单,就是因为在一个稍稍正规一点的应用上都会有支付这个环节,我们日常的在线支付如今包括支付宝,微信钱包,QQ钱包 ...

  6. Java对接第三方支付渠道之支付宝支付

    提示:支付宝相对于微信支付更人性化,且细节做得更好. Java对接第三方支付渠道之支付宝支付 一.前期准备工作 二.导入依赖 三.书写配置类 四.书写配置文件 五.调用相关支付接口 1.流程图 2.创 ...

  7. java对接支付宝支付

    java对接支付宝支付演示 现在有不少的项目都需要对接支付,这里主要是进行讲解对接支付宝H5支付 废话不多说 上代码 引入支付宝官方的sdk <!-- https://mvnrepository ...

  8. java对接支付宝支付(手机网站支付)

    记录一下对接支付宝支付的过程,既是对这段时间工作的总结,也希望能对之后需要对接支付宝手机网站支付的小伙伴一点帮助. 1.查看官方文档,具体对接流程(https://docs.open.alipay.c ...

  9. SpringBoot+vue3对接支付宝支付详细教程

    SpringBoot+vue3对接支付宝支付详细教程 本人也是第一次做这个,是一个刚刚学习自学支付的萌新,目的是在于学习,只是为了记录自己的学习过程,怕以后会忘记,因为我没有企业账号,所以用的是自己的 ...

最新文章

  1. 征战蓝桥 —— 2016年第七届 —— C/C++A组第7题——剪邮票
  2. java 什么是servlet_JavaWeb解释一下什么是 servlet?
  3. python学习HTML之CSS(2)
  4. 站点部署,IIS配置优化指南
  5. 偷用计算机作文,偷玩电脑作文500字
  6. 跨越解决方案之nginx
  7. Python版归并排序算法(附Python程序__name__属性用法演示视频)
  8. js获取CuteEditor的值
  9. php foreach 传值还是传引用
  10. 【转载】 CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)概念区分理解
  11. cocos2d笔记 (3)cocos2d四个基本概念
  12. 软件测试作业随笔之二:Homework 2
  13. mac php连接mysql数据库_Mac下php连接mysql数据库失败解决办法
  14. 硬盘格式转换:MBR转换到GPT怎么转?
  15. 订单操作-订单详情查询代码实现
  16. 博士申请 | 西湖大学智能无人系统实验室招收空中机器人方向全奖博士生
  17. ZK指纹考勤机Java接口
  18. 马虎词汇教程21-25(转载)
  19. html框架自动居中,html 宽度固定并布局居中模板框架
  20. 嵌入式--深入理解单片机(一)单片机程序是如何运行起来的以及单片机的ROM和RAM

热门文章

  1. CTF网络安全大赛介绍
  2. Jquery 弹出对话框插件xcConfirm.js
  3. bestcoder 百度之星 1002 列变位法解密
  4. 用cmd命令行的形式清除需要管理员权限的流氓软件
  5. 【大学物理·静止电荷的电场】静电场 电场强度
  6. DFAnet:Deep Feature Aggregation for Real-time Semantic Segmentation自己翻译的
  7. 关于jason中大括号和中括号的区别
  8. VS2017+MFC+sqlite数据库操作
  9. 一文告诉你什么叫边缘计算
  10. Data + AI Summit 2022 超清视频下载