python实现微信扫码支付
import datetime
import hashlib
import time
import json
import random
import string
import requests from base64 import b64encode
from urllib.parse import urlparse
from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import base64
from io import BytesIO # 生成二维码
def to_qr(text):
import qrcode
img = qrcode.make(text)
bIo = BytesIO()
img.save(bIo, format='PNG')
ig = bIo.getvalue()
data = base64.b64encode(ig)
data = data.decode('utf-8')
# return data
# print(data)
with open('pay.png', 'wb') as f:
img.save(f)
return data class WXPay:
""" 微信 Native支付
""" def __init__(self):
self.appid = "xxxxxxxxxxxxxxxxxx" # APPID
self.mchid = "xxxxxxx" # 商户号
self.payment_url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/native' # Native支付下单接口
self.refund_url = 'https://api.mch.weixin.qq.com/v3/refund/domestic/refunds' # 退款接口
self.transfer_url = 'https://api.mch.weixin.qq.com/v3/transfer/batches' # 转账接口
self.notify_url = "https://xxxxxxxxxxxxxxxxxx.com" # 通知url
self.serial_no = 'xxxxxxxxxxxxx' # 商户证书序列号
self.apiclient_key = './apiclient_key.pem' # 本地证书路径 # 生成签名
def get_sign(self, sign_str):
rsa_key = RSA.importKey(open(self.apiclient_key).read())
signer = pkcs1_15.new(rsa_key)
digest = SHA256.new(sign_str.encode('utf8'))
sign = b64encode(signer.sign(digest)).decode('utf-8')
return sign def request(self, url: str, method: str, data=None):
data = json.dumps(data) if data else ''
random_str = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(32))
timestamp = str(int(time.time()))
# print("---------", url.split(urlparse(url).netloc)[-1])
sign_str = '\n'.join([
method.upper(), # HTTP请求方法
url.split(urlparse(url).netloc)[-1], # path+args
timestamp, # 时间戳
random_str, # 请求随机串
data, '' # 请求报文主体
]) # 结尾空窜仅用于让后面多一个\n
sign = self.get_sign(sign_str) headers = {
'Accept': 'application/json;',
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': f'WECHATPAY2-SHA256-RSA2048 mchid="{self.mchid}",nonce_str="{random_str}",signature="{sign}",timestamp="{timestamp}",serial_no="{self.serial_no}"',
'Wechatpay-Serial': self.serial_no
}
response = requests.request(url=url, method=method, data=data, headers=headers)
return response def selectorder(self, order_id):
url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{}?mchid={}'.format(order_id, self.mchid)
# print(url) return self.request(url, 'GET') # 支付
def payment(self, order_no, total, description):
now_time = datetime.datetime.now() + datetime.timedelta(days=1)
now_time_str = now_time.strftime("%Y-%m-%dT%H:%M:%S+08:00")
data = {
"mchid": self.mchid,
"out_trade_no": order_no, # 订单号
"appid": self.appid,
"description": description, # 商品描述
"notify_url": self.notify_url,
"time_expire": now_time_str,
"amount": {
"total": total, # 总金额(分)
"currency": "CNY"
}
}
return self.request(self.payment_url, 'POST', data) # 退款
def refund(self, out_trade_no, out_refund_no, refund, reason):
data = {
"out_trade_no": out_trade_no, # 微信支付订单号(交易单号)
"out_refund_no": out_refund_no, # 商户退款单号(商户单号)
"reason": reason, # 退款原因
"notify_url": self.notify_url, # 通知Url
"amount": {
"total": refund, # 订单金额
"refund": refund, # 退款金额(分)
"currency": "CNY"
}
}
# print(data)
return self.request(self.refund_url, 'POST', data) def application_bill(self):
url = 'https://api.mch.weixin.qq.com/v3/bill/tradebill?bill_date=2022-02-28&bill_type=ALL'
return self.request(url, 'GET') def transfer(self, out_batch_no, batch_name, batch_remark, total_amount, total_num, transfer_detail_list):
'''
商家转账到零钱
:param out_batch_no: 订单号
:param batch_name: 批次名字
:param batch_remark: 批次描述
:param total_amount: 总金额
:param total_num: 总笔数
:param transfer_detail_list: 详情列表
{
out_detail_no: 详情订单号
transfer_amount: 金额
transfer_remark': 描述
openid': 用户openid
}
:return: Response '''
data = {
'appid': self.appid,
'out_batch_no': out_batch_no,
'batch_name': batch_name,
'batch_remark': batch_remark,
'total_amount': total_amount,
'total_num': total_num,
'transfer_detail_list': transfer_detail_list
}
return self.request(self.transfer_url, 'POST', data) def pay_decrypt(nonce, ciphertext, associated_data):
# 支付结果解密
key = "xxxxxxxxxxxxxxxxx" key_bytes = str.encode(key)
nonce_bytes = str.encode(nonce)
ad_bytes = str.encode(associated_data)
data = base64.b64decode(ciphertext)
# print(nonce_bytes, data, ad_bytes)
aesgcm = AESGCM(key_bytes)
return aesgcm.decrypt(nonce_bytes, data, ad_bytes) def order_uuid():
"""
"""
order_id = str(datetime.datetime.fromtimestamp(time.time())).replace("-", "").replace(" ", "").replace(":","").replace(".", "") + str(random.randint(100, 999))
return order_id if __name__ == "__main__":
wx = WXPay()
order_uid = order_uuid()
print(order_uid)
resp = wx.payment(order_uid, 1, "订单支付-测试")
print(resp.text)
to_qr(resp.json()['code_url']) # --------------------------------------------------------------------------------------------------------- out_batch_no = order_uuid()
batch_name = '提现'
batch_remark = '用户提现'
total_amount = 1
total_num = 1
transfer_detail_list = [
{
'out_detail_no': order_uuid(),
'transfer_amount': 1,
'transfer_remark': '用户提现',
'openid': 'odDp41UknzC5pD37d9EZWkyKCJk0',
}
]
wx = WXPay()
ret = wx.transfer(out_batch_no, batch_name, batch_remark, total_amount, total_num, transfer_detail_list)
print(ret.text)
python实现微信扫码支付的更多相关文章
- Python实现微信扫码支付模式二(NativePay)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7649207.html 核心代码github地址:https://github.com/ygj0930/Pyth ...
- Python+Django实现微信扫码支付流程
Python+Django实现微信扫码支付流程 关注公众号"轻松学编程"了解更多. 获取源码可以加我微信[1257309054],文末有二维码. [微信公众号支付官网]https: ...
- MVC 微信扫码支付
微信扫码支付有两种模式, 模式一和模式二, 两者具体的区别可参考官网文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 微 ...
- C# 微信扫码支付 回调页面
.NET版 微信扫码支付,官方推荐使用[模式二] 一.微信扫码支付模式一: 1.回调页面:官方demo中example文件下的NativeNotifyPage.aspx 2.微信回调地址:http:/ ...
- C# 微信扫码支付API (微信扫码支付模式二)
一.SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1,下载.NET C#版本: 二.微信相关设置:(微信扫码 ...
- Net MVC微信扫码支付
微信扫码支付+Asp.Net MVC 这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下. 一.准备工作 使用的微信API中的统一下单方法,关键的 ...
- 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结
最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...
- php微信扫码支付
一 概述 扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站支付.实体店单品或订单支付.媒体广告支付等场景.前几天公司需要做 ...
- ASP.NET Core Web 支付功能接入 微信-扫码支付篇
这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...
- 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇
转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...
随机推荐
- 【译】Visual Studio 2022 - 17.8 的性能改进
Visual Studio 2022 17.8版本欢迎一系列令人振奋的性能增强,包括响应式文件打开体验,改进 Razor/Blazor 的响应性,加速 F5,优化的 C++ 虚幻引擎智能感知和非 SD ...
- ruoyi vue 前后端分离版本 打包分离jar包至lib
环境:若依前后端分离版本,原打包时将所有的依赖jar包放至ruoyi-admin.jar 包中,该包130MB,过大. 需求:为了减少打包更新上传的时间,减少至1.1mb 1.将不常更新的模块jar包 ...
- linux登陆防护fail2ban的优化配置
fail2ban 默认在iptables 防火墙filter表的input 链内设置规则,这样导致端口映射,和nat转发的流量不在fail2ban控制内. 如果修改配置文件/etc/fail2ban/ ...
- 大数据 - MapReduce:从原理到实战的全面指南
本文深入探讨了MapReduce的各个方面,从基础概念和工作原理到编程模型和实际应用场景,最后专注于性能优化的最佳实践. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作 ...
- 0x00.常用名词、文件下载、反弹shell
下载文章 方法一:下载谷歌插件fireshot,捕捉整个页面 方法二:使用js代码 f12进入控制台,粘贴如下代码 (function(){ $("#side").remove() ...
- 又有新框架上线了,测试、AI 通通有「GitHub 热点速览」
本周热点之一可能就是 Apple 刚开源便获得 8k+ star 的机器学习框架 mlx,顺带官方开源的 mlx-example(示例仓)也在热门榜上有一席之位,据说它已经跑通了大模型 Llama 7 ...
- 开源.NetCore通用工具库Xmtool使用连载 - 图像处理篇
[Github源码] <上一篇> 介绍了Xmtool工具库中的扩展动态对象,今天我们继续为大家介绍其中的图像处理类库. 在我们的软件系统中,经常需要对图片进行各种各样的处理:例如最常见的头 ...
- 手动安装pinia、给项目添加pinia实例
用你喜欢的js包管理器安装pinia: yarn add pinia # 或者使用 npm npm install pinia 创建一个 pinia 实例 (根 store) 并将其传递给应用: 编辑 ...
- Scrapy创建项目、爬虫文件
创建项目 执行命令 scrapy startproject <项目名> 项目结构 创建爬虫文件 方式一:通过命令生成 scrpay genspider <爬虫名(必须唯一)> ...
- 华企盾DSC防泄密系统造成应用程序卡慢、编译卡问题
1.先看看个人模式是否正常,正常则跟进程有关加密nofile.不启用进程水印.不启用文件夹大小缓存(源码文件去掉需慎重)都关掉.允许进程间访问(procmon排查是否有其它进程访问) 2.检查是否与H ...