Python实现微信支付集成
作者:书友59082326 | 来源:互联网 | 2024-12-20 17:39
本文详细介绍如何使用Python集成微信支付的三种主要方式:Native支付、APP支付和JSAPI支付。每种方式适用于不同的应用场景,如PC网站、移动端应用和公众号内支付等。
微信支付提供了多种支付方式以适应不同场景的需求。以下是三种常用的支付方式及其适用场景。 ### 1. Native 支付 Native 支付是通过商户系统按照微信支付协议生成支付二维码,用户使用微信“扫一扫”功能完成支付的过程。这种支付方式广泛应用于PC网站、实体店单品或订单支付、媒体广告支付等场景。 ### 2. APP 支付 APP 支付是指在移动端应用程序中集成微信支付SDK,调用微信支付模块完成支付操作。这种方式适用于需要在移动端应用中集成微信支付功能的应用程序。 ### 3. JSAPI 支付 JSAPI 支付是通过调用微信提供的JSAPI接口,在网页或公众号内调起微信支付模块完成支付。这种方式适用于在网页或微信公众账号内进行支付的场景。 #### 应用场景 - **线下场所**:生成二维码供用户扫描后在微信浏览器中打开页面完成支付。 - **公众号场景**:用户在微信公众账号内进入商家页面,通过调用接口完成支付。 - **PC 网站场景**:在网站上展示二维码,用户扫描后在微信浏览器中打开页面完成支付。 #### 创建预支付订单 (Native & APP) 创建预支付订单涉及以下几个步骤: ```python @classmethod def dict_to_xml(cls, data, is_cdata=False): xml = [] for k, v in data.items(): if not is_cdata: xml.append(f'<{k}>{v}{k}>') else: xml.append(f'<{k}>{k}>') return ''.join(xml) def sign(self, data): slist = self._ordered_data(data) slist.append(f'key={self.key}') string = '&'.join(slist) string = hashlib.md5(string.encode('utf-8')).hexdigest().upper() return string def build_body(self, data): data['appid'] = self.appid # 应用ID data['mch_id'] = self.mch_id # 商户号 data['nonce_str'] = self._get_nonce_str() # 随机字符串 data['notify_url'] = self.notify_url # 回调地址 data['sign'] = self.sign(data) return self.dict_to_xml(data) def request(self, url, content, headers=None): if headers is None: headers = {'Content-Type': 'text/xml'} cOntent= self.build_body(content) req = urllib.request.Request(url, data=bytes(content, 'utf-8'), headers=headers) result = urllib.request.urlopen(req, timeout=30).read().decode('utf-8') return result def api_wxpay_unifiedorder(self, body, out_trade_no, spbill_create_ip, total_fee, trade_type, product_id, **kwargs): cOntent= { 'body': body, # 支付订单描述 'out_trade_no': out_trade_no, # 订单编号 'spbill_create_ip': spbill_create_ip, # 终端IP 'total_fee': total_fee, # 商品价格 'trade_type': trade_type, # 交易类型: APP or JSAPI or NATIVE 'product_id': product_id # 商品ID } content.update(kwargs) result = self.request(UNIFIEDORDER_URL, content) return result # 示例调用 wxpay.api_wxpay_unifiedorder( 'wechat_pay_test', out_trade_no, spbill_create_ip, total_fee, 'NATIVE', product_id ) wxpay.api_wxpay_unifiedorder( 'wechat_pay_test', out_trade_no, spbill_create_ip, total_fee, 'APP', appid=APPID ) ``` #### 创建预支付订单 (JSAPI) 对于 JSAPI 支付,创建预支付订单的步骤与上述类似,但需要额外提供用户的 `openid` 和 `appid` 参数。 ```python def api_wxpay_unifiedorder(self, body, out_trade_no, spbill_create_ip, total_fee, trade_type, product_id, open_id, appid, **kwargs): cOntent= { 'body': body, 'out_trade_no': out_trade_no, 'spbill_create_ip': spbill_create_ip, 'total_fee': total_fee, 'trade_type': trade_type, 'product_id': product_id, 'openid': open_id, 'appid': appid } content.update(kwargs) result = self.request(self.config.UNIFIEDORDER_URL, content) return result # 示例调用 applepay.api_wxpay_unifiedorder( 'wechat_pay_test', out_trade_no, spbill_create_ip, total_fee, 'JSAPI', product_id, open_id, appid ) ``` 以上代码展示了如何使用 Python 调用微信支付接口,实现 Native、APP 和 JSAPI 三种支付方式的预支付订单创建。
推荐阅读
本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ...
[详细]
蜡笔小新 2024-12-26 18:17:14
本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ...
[详细]
蜡笔小新 2024-12-27 16:11:49
本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ...
[详细]
蜡笔小新 2024-12-27 13:55:14
本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ...
[详细]
蜡笔小新 2024-12-27 11:39:44
本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ...
[详细]
蜡笔小新 2024-12-27 03:39:09
本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ...
[详细]
蜡笔小新 2024-12-26 17:45:48
本文介绍如何使用JPA Criteria API创建带有多个可选参数的动态查询方法。当某些参数为空时,这些参数不会影响最终查询结果。 ...
[详细]
蜡笔小新 2024-12-26 09:26:16
本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ...
[详细]
蜡笔小新 2024-12-28 10:51:55
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ...
[详细]
蜡笔小新 2024-12-28 04:11:47
c# – UWP:BrightnessOverride StartOverride逻辑 ...
[详细]
蜡笔小新 2024-12-27 16:56:40
本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ...
[详细]
蜡笔小新 2024-12-27 16:07:12
本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ...
[详细]
蜡笔小新 2024-12-27 15:33:42
本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ...
[详细]
蜡笔小新 2024-12-26 19:52:39
本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ...
[详细]
蜡笔小新 2024-12-26 17:25:24
书友59082326
这个家伙很懒,什么也没留下!