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 序列的方法总结
Oct 18 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
Python线性回归实战分析
Feb 01 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
浅析Python 实现一个自动化翻译和替换的工具
Apr 14 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
Oct 18 Python
python matplotlib拟合直线的实现
Nov 19 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
python 数据类型强制转换的总结
Jan 25 Python
一起来学习Python的元组和列表
Mar 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
mayfish 数据入库验证代码
2010/04/30 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
vue2实现数据请求显示loading图
2017/11/28 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
Python中的自定义函数学习笔记
2014/09/23 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
类、抽象类、接口的差异
2016/06/13 面试题
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
后勤工作职责
2013/12/22 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
服务标语口号
2014/07/01 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
共青团员自我评价
2015/03/10 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
PHP 对接美团大众点评团购券(门票)的开发步骤
2021/04/03 PHP
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
Python FuzzyWuzzy实现模糊匹配
2022/04/28 Python