热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python实现微信支付集成

本文详细介绍如何使用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}')
else:
xml.append(f'<{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 三种支付方式的预支付订单创建。
推荐阅读
author-avatar
书友59082326
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有