python实现支付宝当面付(扫码支付)功能


Posted in Python onMay 30, 2018

本文实例为大家分享了python实现支付宝当面付示的具体代码,供大家参考,具体内容如下

一、配置信息准备

登录蚂蚁金服开放平台:https://open.alipay.com/platform/home.htm

开发资料阅读:https://docs.open.alipay.com/194/106078

创建好应用,配置好密钥等信息后,就可以开发了。

 二、开发支付宝支付工具类

1:相关配置信息

# ========支付相关配置信息===========
 ALIPAY_INPUT_CHARSET = 'utf-8'
 # 商户ID,以2088开头的16位纯数字
 ALIPAY_PARTNER = '2088************'
 # 服务商支付宝账号
 ALIPAY_SELLER_EMAIL = ''
 # 支付结果回调地址
 ALIPAY_NOTIFY_URL = "商家后台回调接口地址"
 # 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
 ALIPAY_TRANSPORT = 'https'
 #签名加密方式
 SIGN_TYPE = "SHA-1"
 #应用id
 APP_ID = '************'
 #下单api
 precreate_GATEWAY=https://openapi.alipay.com/gateway.do?

2.三个辅助函数:

#1:生成下单请求参数字符串
 def make_payment_request(self,params_dict):
  """
  构造支付请求参数
  :param params_dict:
  :return:
  """
  query_str = self.params_to_query(params_dict,) # 拼接参数字符串
  sign = self.make_sign(query_str) # 生成签名
  sign = urllib.quote(sign, safe='') #解决中文参数编码问题
  res = "%s&sign=%s" % (query_str, sign)
  return res
 def params_to_query(self,params):
  """
  生成需要签名的字符串
  :param params:
  :return:
  """
  """
  :param params:
  :return:
  """
  query = ""
  dict_items = {}
  for key, value in params.items():
   if isinstance(value, dict) == True:
    dict_items[key] = value
    params[key] = "%s"
  all_str = ''
  for key in sorted(params.keys()): #把参数按key值排序:这是支付宝下单请求的参数格式规定
   all_str = all_str + '%s=%s&' % (key, params[key])
  all_str = all_str.rstrip('&')
  biz_content_dict = dict_items['biz_content']
  content_str = ''
  for key in sorted(biz_content_dict.keys()):
   if isinstance(biz_content_dict[key], basestring) == True:
    content_str = content_str + '"%s":"%s",' % (key, biz_content_dict[key])
   else:
    content_str = content_str + '"%s":%s,' % (key, biz_content_dict[key])
  content_str = content_str.rstrip(',')
  content_str = '{' + content_str + '}'
  query = all_str % content_str
  return query
 def make_sign(self,para_str):
  """
  生成签名
  :param message:
  :return:
  """
  private_key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open(
   './路径/private_key.txt').read()) #把私钥存到一个文件里,加载出来【尝试过用rsa模块的方法加载私钥字符串,会报格式错误。查看源码得知,需要从文件流加载】
  import sys
  reload(sys)
  sys.setdefaultencoding('utf-8') #这三句:解决签名方法编码报错
  sign = base64.encodestring(OpenSSL.crypto.sign(private_key, para_str, 'sha256'))
  return sign

3.下单

#获取二维码url
 def getAlipayUrl(self,orderid,goodsName,goodsPrice,**kwargs):
  # 构建公共参数
  params = {}
  params['method'] = 'alipay.trade.precreate'
  params['version'] = '1.0'
  params['app_id'] = self.APP_ID
  params['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  params['charset'] = self.ALIPAY_INPUT_CHARSET
  params['notify_url'] = self.ALIPAY_NOTIFY_URL
  params['sign_type'] = 'RSA2'

  # 构建订单参数
  biz_content = {}
  biz_content['out_trade_no'] = orderid # 订单号
  biz_content['subject'] = goodsName #商品名
  biz_content['total_amount'] = goodsPrice # 价格
  params['biz_content'] = biz_content

  #由参数,生成签名,并且拼接得到下单参数字符串
  encode_params = self.make_payment_request(params)
  #下单
  url = self.precreate_GATEWAY + encode_params
  response = requests.get(url)
  #提取下单响应
  body = response.text
  #解析下单响应json字符串
  body_dict = json.loads(body)
  return_msg = body_dict['alipay_trade_precreate_response']['msg']
  if return_msg == "Success":
    code_url = body_dict['alipay_trade_precreate_response']['qr_code']
    return code_url
  else:
   print "fail msg=============" + return_msg

三、在controller端,接收客户端传过来的订单号、商品名、商品价格,调用支付工具类,得到二维码链接,根据链接生成二维码,传给客户端。

(此处同微信扫码支付模式二)

四、在controller端,编写支付结果回调函数

def aliQRCodeNotify(self, request, *args,**kwargs):
  out_trade_no = kwargs.get("out_trade_no")
  trade_status = kwargs.get("trade_status")
  
  #根据trade_status,判断交易结果:交易成功 or 交易关闭
  #根据out_trade_no 更新订单记录信息

五、客户端轮询

同微信扫码支付模式二客户端轮询思路。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python私有属性和方法实例分析
Jan 15 Python
python二分查找算法的递归实现方法
May 12 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
一文了解Python并发编程的工程实现方法
May 31 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
Python基础类继承重写实现原理解析
Apr 03 Python
Python常用类型转换实现代码实例
Jul 28 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
Python内置的数据类型及使用方法
Apr 13 Python
详解Python3.6安装psutil模块和功能简介
May 30 #Python
python3之模块psutil系统性能信息使用
May 30 #Python
python批量导入数据进Elasticsearch的实例
May 30 #Python
用python简单实现mysql数据同步到ElasticSearch的教程
May 30 #Python
django1.11.1 models 数据库同步方法
May 30 #Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 #Python
python自动化报告的输出用例详解
May 30 #Python
You might like
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
PHP循环结构实例讲解
2014/02/10 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
juqery 学习之三 选择器 简单 内容
2010/11/25 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
javascript数组详解
2014/10/22 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
Python实现从url中提取域名的几种方法
2014/09/26 Python
跟老齐学Python之Import 模块
2014/10/13 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
《临死前的严监生》教学反思
2014/02/13 职场文书
自我推荐信范文
2014/05/09 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
哈姆雷特读书笔记
2015/06/29 职场文书
关于感恩的作文
2019/08/26 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
详解Spring事件发布与监听机制
2021/06/30 Java/Android
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python