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 相关文章推荐
Python3 能振兴 Python的原因分析
Nov 28 Python
Python使用爬虫猜密码
Feb 19 Python
Python信息抽取之乱码解决办法
Jun 29 Python
Python实现随机生成手机号及正则验证手机号的方法
Apr 25 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
django解决订单并发问题【推荐】
Jul 31 Python
如何用 Python 制作一个迷宫游戏
Feb 25 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
Python并发编程实例教程之线程的玩法
Jun 20 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
图片格式的JavaScript和CSS速查手册
2007/08/20 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
详解A标签中href=""的几种用法
2017/08/20 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
2018/08/31 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
详解Django中的权限和组以及消息
2015/07/23 Python
Python错误处理操作示例
2018/07/18 Python
python模糊图片过滤的方法
2018/12/14 Python
带你认识Django
2019/01/15 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
python队列Queue的详解
2019/05/10 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
财务管理专业推荐信
2013/11/19 职场文书
物业管理专业个人的自我评价
2013/11/19 职场文书
毕业生找工作推荐信
2013/11/21 职场文书
2014年教师党员公开承诺书
2014/05/28 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
七年级作文之下雨天
2019/12/23 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang