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的迭代器和生成器
Jul 29 Python
Python中的多行注释文档编写风格汇总
Jun 16 Python
取numpy数组的某几行某几列方法
Apr 03 Python
pow在python中的含义及用法
Jul 11 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
Python实现寻找回文数字过程解析
Jun 09 Python
Keras之fit_generator与train_on_batch用法
Jun 17 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 Python
解决python3中os.popen()出错的问题
Nov 19 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
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
jquery提示 "object expected"的解决方法
2009/12/13 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
python消费kafka数据批量插入到es的方法
2018/12/27 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
美国快时尚彩妆品牌:Winky Lux(透明花瓣润唇膏)
2018/11/06 全球购物
教师中国梦演讲稿
2014/04/23 职场文书
计算机专业求职信
2014/06/02 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
三孔导游词
2015/02/05 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
大学入学感言
2015/08/01 职场文书
煤矿隐患排查制度
2015/08/05 职场文书