首页 > 后端开发 > Python教程 > python实现支付宝当面付(扫码支付)功能

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

不言
发布: 2018-06-01 14:54:41
原创
3666 人浏览过

这篇文章主要为大家详细介绍了python实现支付宝当面付,扫码支付功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

一、配置信息准备

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

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

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

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

1:相关配置信息

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# ========支付相关配置信息===========

 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

#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.下单

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

#获取二维码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端,编写支付结果回调函数

1

2

3

4

5

6

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实现简单淘宝秒杀功能

以上是python实现支付宝当面付(扫码支付)功能的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板