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,实现接入微信-扫码支付及异步 ...
随机推荐
- 总结(5)--- Numpy和Pandas库常用函数
二.常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准 ...
- Bash—source命令&export命令&bashrc文件
当不使用 source 命令执行脚本时,会创建一个子 shell,在该子 shell 中执行完脚本后退出子 shell.不是用 export 定义的变量只对该 shell 有效,对子 shell 是无 ...
- NCTF2022-Crypto WP
superecc 题目 from Crypto.Util.number import * from secrets import INF, flag assert flag[:5] == b'nctf ...
- QT最小化程序到托盘运行
MinTray 说明 实现程序关闭时最小化托盘的功能 托盘实现显示主页面和退出的功能 支持扩展,直接引用TrayIcon类即可,对外暴露接口 单例实现,可复用 警告 注:博主所有资源永久免费,若有帮助 ...
- DRF限流
https://www.django-rest-framework.org/api-guide/throttling/ 限制.控制客户端可以向 API 发出的请求的速率. 设置限流策略 默认限制策略可 ...
- IIS下使用SSL证书
IIS下使用SSL证书 本文介绍windowsServer下SSL证书配置及IIS站点配置 1. 生成SSL证书 在阿里云申请免费SSL证书 登录阿里云管理控制台,打开SSL证书管理 选择免费证 ...
- NetSuite 开发日记 —— 科目类型码
科目类型码可用于搜索判断科目类型 代码实现 var sch = search.create({ type: 'account', filters: ['type', 'anyof', 'Bank'], ...
- 不用手动创建数据库,直接导入sql文件,就能生成数据库和数据表
- 红日靶场4-wp
红日靶场4 环境搭建 注:130网段为模拟外网网段,111网段为内网网段 机器 用户 密码 网卡 kali root / 192.168.130.19 web(ubuntu) ubuntu ubunt ...
- c++ 期末编程题
1. 计算两点之间的距离 #include <iostream> #include <cmath> using namespace std; int main() { int ...