我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用Python开发微信支付的注意事项

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用Python开发微信支付的注意事项

前言

微信支付是由微信及财付通联合推出的移动支付创新产品。如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑。

要想开发顺利进行,首先要对业务流程有个清晰的认识。这里以微信公众号支付为例,因此也借用微信支付官方文档中的业务流程图:

查看图片

接下来来关注几个开发过程中的关键点,包括:

1、生成商户订单与调用统一下单 API

2、微信服务器交互的数据格式

3、公众号支付下网页内通过 JS-API 调起支付

4、异步通知商户支付结果(回调)

一、生成商户订单与调用统一下单 API

这对应业务流程中的第 4 和 第 5 步,商户后台首先为用户生成订单,然后调用微信的【统一下单】接口向微信支付系统提交订单。这里有一个关键点就是签名的生成。

简单来讲分为以下几个步骤:

1、将所有有效参数以“k=v”的形式进行拼接,有效参数是指非空参数,也就是说如果参数为空,则不参与签名;

2、将所有的“k=v”对用“&”连接,得到“k1=v1&k2=v2&k3=v3”这样的字符串;

3、将微信支付 API 密钥 拼接在最后,如“k1=v1&k2=v2&k3=v3&key=secret”;

4、对整体进行 MD5 运算,即得到签名。

这种签名方法有一个高大上的名字叫做 HMAC(Hash-based Message Authentication Code,基于哈希的消息码)。基于此思路,可以实现如下签名方法:


def gen_sign(params, key):
  """
  签名生成函数
 
  :param params: 参数,dict 对象
  :param key: API 密钥
  :return: sign string
  """
 
  param_list = []
  for k in sorted(params.keys()):
    v = params.get(k)
    if not v:
      # 参数的值为空不参与签名
      continue
    param_list.append('{0}={1}'.format(k, v))
  # 在最后拼接 key
  param_list.append('key={}'.format(key))
  # 用 & 连接各 k-v 对,然后对字符串进行 MD5 运算
  return md5('&'.join(param_list).encode('utf8')).hexdigest()

参与签名的参数中有一个随机字符串,在 Python 中有很多方法,当然也可以利用 uuid 库来生成:


def gen_nonce_str():
  """
  生成随机字符串,有效字符a-zA-Z0-9
 
  :return: 随机字符串
  """
 
  return ''.join(str(uuid.uuid4()).split('-'))

二、微信服务器交互的数据格式

微信服务器与商户服务器之间采用 XML 格式进行交互,这就涉及到与语言原生数据类型进行转换以方便处理。交互的数据参数都是 key-value 的形式,因此在 Python 中使用字典会更加方便。而要解析 XML,也有一大把第三方库供使用,比如 BeautifulSoup。

以下是具体实现:


def trans_xml_to_dict(xml):
  """
  将微信支付交互返回的 XML 格式数据转化为 Python Dict 对象
 
  :param xml: 原始 XML 格式数据
  :return: dict 对象
  """
 
  soup = BeautifulSoup(xml, features='xml')
  xml = soup.find('xml')
  if not xml:
    return {}
 
  # 将 XML 数据转化为 Dict
  data = dict([(item.name, item.text) for item in xml.find_all()])
  return data
 
 
def trans_dict_to_xml(data):
  """
  将 dict 对象转换成微信支付交互所需的 XML 格式数据
 
  :param data: dict 对象
  :return: xml 格式数据
  """
 
  xml = []
  for k in sorted(data.keys()):
    v = data.get(k)
    if k == 'detail' and not v.startswith('<![CDATA['):
      v = '<![CDATA[{}]]>'.format(v)
    xml.append('<{key}>{value}</{key}>'.format(key=k, value=v))
  return '<xml>{}</xml>'.format(''.join(xml))

注意 detail 参数,即商品详情,其值为 JSON 格式,在转换为 XML 数据时应前注意使用 CDATA 标签将其保护起来。

如:


<detail><![CDATA[{"goods_detail": [{"wxpay_goods_id": "10010001", "price": 1, "goods_num": 1, "goods_name": "\u82f9\u679c", "goods_id": "10010001"}, {"wxpay_goods_id": "10010002", "price": 1, "goods_num": 1, "goods_name": "\u9999\u8549", "goods_id": "10010002"}]}]]></detail>

三、公众号支付下网页内通过 JS-API 调起支付

这一点对应业务流程中的第 7 步。之所以提及它是因为微信官方文档在此给开发者挖了一个坑(至少截至我在写这篇文章时是的),就是在“网页端调起支付API”中关于 JS 的示例代码是采用的 WeixinJSBridge,这在很早以前就是 Deprecated 的“玩意儿”,如今更是已经不可用了。正确的做法是使用 JS-SDK,可以参考微信公众号的 wiki。

使用 JS-SDK 前需要先调用 config,这里也包含一个签名,但注意这个签名与之前微信支付的签名并不相干。其首先需要用微信公众号的 APPID 和 APPKEY 来换取 access_token,然后用该 access_token 调用 JS-SDK 换取 ticket 的接口得到 ticket,最后再使用该 ticket 和用户当前页面的 URI 通过 sha1 运算生成签名。

在此之后,即可调用 wx.chooseWXPay 来调起支付,这里也有一个坑:timestamp。wx.chooseWXPay 中的参数要求 timestamp 是全小写。而微信支付中签名时要求 timestamp 中的“s”是大写。真的是要傻傻分不清了。

四、异步通知商户支付结果(回调)

最后是关于异步回调,对应业务流程中的第 10 步。在用户支付操作完成后,微信服务器会通过回调的形式告知商户服务器支付结果。回调的地址与【统一下单】中定义的 notify_url 一致。当接收到回调时,首先应验证签名的有效性以保证“来源可靠”,然后可以通过回调中所带的 openid、out_trade_no 等来定位唯一订单。

总结

微信支付还有很多种形式,在业务流程上也不尽相同。不过只要能玩转其中一种,其他的也基本来说能很快实现。另外,支付功能的实现涉及业务流程中的安全性,因此一定要注意理清业务流程,并卡好各个关键结点。以上就是本文的全部内容,希望对大家使用Python开发微信支付能有所帮助。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用Python开发微信支付的注意事项

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

利用Python开发微信支付的注意事项

前言 微信支付是由微信及财付通联合推出的移动支付创新产品。如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑。 要想开发顺利进行,首先要对业务流程有个清晰的认识。这里以微信公众
2022-06-04

开发微信小程序要注意哪些事项

这篇文章主要讲解了“开发微信小程序要注意哪些事项”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“开发微信小程序要注意哪些事项”吧!1. 微信小程序官方给出的定义是: 微信小程序是一种不需要下载
2023-06-26

微信小程序开发要注意哪些事项

本篇内容介绍了“微信小程序开发要注意哪些事项”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、微信小程序开发之注册小程序在开发小程序之前,首
2023-06-27

微信小程序开发要注意的事项有哪些

这篇文章主要介绍了微信小程序开发要注意的事项有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序开发要注意的事项有哪些文章都会有所收获,下面我们一起来看看吧。1、微信小程序开发注意是否导航明确有非常完
2023-06-27

微信小程序开发需要注意事项有哪些

这篇“微信小程序开发需要注意事项有哪些”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“微信小程序开发需要注意事项有哪些”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下
2023-06-26

Python开发注意事项:处理大数据和高并发时的注意事项

随着互联网和移动互联网的快速发展,大数据和高并发成为了互联网行业中一项极为重要的技术挑战。Python 作为一种流行的编程语言,在处理大数据和高并发方面也变得越来越受欢迎。然而,与此同时,处理大数据和高并发时也存在着一些需要注意的技术细节和
Python开发注意事项:处理大数据和高并发时的注意事项
2023-11-22

Python开发注意事项:处理数据时的注意事项和技巧

Python开发是一项广泛应用的编程任务,无论是数据分析、机器学习、Web开发还是其他领域,都可以借助Python来完成。在处理数据时,有一些注意事项和技巧,可以帮助开发者更高效地完成任务和避免潜在的问题。本文将介绍一些Python开发中处
Python开发注意事项:处理数据时的注意事项和技巧
2023-11-22

Python开发注意事项:处理并发和分布式系统时的注意事项

Python开发注意事项:处理并发和分布式系统时的注意事项随着互联网的快速发展,越来越多的软件系统需要处理并发性和分布式计算。Python作为一种灵活且易于使用的编程语言,被广泛应用于这些领域。然而,处理并发和分布式系统时,Python开发
Python开发注意事项:处理并发和分布式系统时的注意事项
2023-11-23

Python开发注意事项:处理文件和IO操作时的注意事项

Python作为一种功能强大且易于学习的编程语言,在开发过程中经常涉及处理文件和IO操作。然而,在处理文件和IO操作时,开发者需要注意一些重要事项,以确保代码的稳定性和可靠性。本文将就Python开发中处理文件和IO操作时的注意事项进行探讨
Python开发注意事项:处理文件和IO操作时的注意事项
2023-11-22

Python开发注意事项:处理多线程和多进程时的注意事项

Python开发注意事项:处理多线程和多进程时的注意事项在Python开发过程中,使用多线程和多进程可以充分利用计算机的多核处理能力,提高程序的效率和性能。然而,使用多线程和多进程也会带来一些潜在的问题和挑战,开发者需要注意一些注意事项来确
Python开发注意事项:处理多线程和多进程时的注意事项
2023-11-22

Python开发注意事项:避免常见的网络通信问题

Python作为一种灵活且易于学习的编程语言,已经成为了许多开发人员的首选。在进行Python开发时,网络通信是一个非常重要的方面。本文将介绍一些常见的网络通信问题,并提供一些建议以帮助开发人员避免这些问题。首先,一个常见的问题是网络连接超
Python开发注意事项:避免常见的网络通信问题
2023-11-22

如何使用PHP开发微信小程序的支付功能?

如何使用PHP开发微信小程序的支付功能?随着微信小程序的普及,越来越多的开发者开始关注微信小程序的支付功能。在微信小程序中,用户可以通过支付功能实现购买商品、充值账户等操作。本文将介绍如何使用PHP开发微信小程序的支付功能,并提供具体的代码
2023-10-26

如何使用PHP开发微信公众号的支付功能

如何使用PHP开发微信公众号的支付功能随着移动支付的快速发展,微信支付作为国内最主流的支付方式之一,成为了许多企业和个人必备的支付手段。而在开发微信公众号时,如果能够集成支付功能,将能够为用户提供更便捷的支付方式,也能够为企业带来更多的收益
2023-10-27

Python开发注意事项:避免常见的安全漏洞

Python作为一种简单易学的编程语言,被广泛应用于各类软件开发项目中。然而,随着互联网的发展和信息安全的重要性日益凸显,开发者们也越来越需要关注代码的安全性。本文将介绍一些在Python开发过程中需要注意的常见安全漏洞,并提供一些避免这些
Python开发注意事项:避免常见的安全漏洞
2023-11-22

Python开发注意事项:避免常见的编码错误

Python作为一种流行的编程语言,在软件开发领域越来越受欢迎。然而,由于Python语言的特性,有时候会出现一些编码错误。本文将介绍一些常见的Python编码错误,以及避免这些错误的方法,希望能帮助开发者更好地编写Python代码。使用合
Python开发注意事项:避免常见的编码错误
2023-11-22

Python开发注意事项:避免常见的性能瓶颈

Python开发作为一门高效而受欢迎的编程语言,能够帮助开发者快速构建应用程序。然而,在开发过程中,我们需要注意一些常见的性能瓶颈,以确保我们的代码能够高效运行。本文将重点介绍一些常见的性能瓶颈以及避免它们的方法。首先,Python是一门解
Python开发注意事项:避免常见的性能瓶颈
2023-11-22

C/C++开发中extern的一些使用注意事项

这篇文章主要为大家介绍了C/C++开发中extern一些使用注意事项的事例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-04

Python开发注意事项:避免常见的并发和同步问题

Python是一种流行的编程语言,被广泛应用于各种领域的开发。在Python开发中,经常会遇到并发和同步的问题。如果不正确处理这些问题,可能导致程序的不稳定性和性能下降。因此,本文将介绍一些注意事项,以避免常见的并发和同步问题。首先,了解并
Python开发注意事项:避免常见的并发和同步问题
2023-11-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录