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,实现接入微信-扫码支付及异步 ...
随机推荐
- 哈希表(hash)
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度 ...
- PIR传感器选型及其使用介绍
(一)PIR简介 PIR传感器(Passive Infrared Sensor),即被动式红外传感器.它因为功耗低,价格低廉,使用简单从而被大量使用在门铃.猫眼.感应开关.小夜灯.安防等消费类产品上. ...
- SQL模糊查询语法思考
模糊查询 sql语句: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 % :表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示 ...
- SpringBoot项目启动过程动态修改接口请求路径
背景 最近遇到一个技术需求,需要对其他多个已有的服务进行整合打包为一个整体的服务,项目启动过程发现一个问题,在controller层多个服务之间存在相同的RequestMapping接口请求路径,导致 ...
- scroll-view和swiper的使用
源码: <template> <viex class="out"> <view class="b ...
- Ubuntu 22.04 LTS 安装lnmp
Ubuntu 22.04 LTS 安装最新稳定版本nginx.mysql5.7和php7.2 全部apt-get安装,就是快,迅速.前提是需要在有网络环境的情况下哈!! 操作系统版本:Ubuntu 2 ...
- hdu 5685
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5685 解题思路:前缀积+费马小定理求逆元. AC代码: 1 #include<iostream> ...
- 轻量型 Web SCADA 组态软件 TopLink
图扑物联 发布了一款工业物联网边缘侧应用场景的轻量型 Web SCADA 组态软件 Iotopo TopLink.该产品采用 B/S 架构,提供 Web 管理界面,软件包大小仅 23MB,无需安装客户 ...
- Linux磁盘专题-linux文件系统详解
这可是我几年前的杰作笔记呀.....当初手写计算都会,现在忘光光.... 物理硬盘Block的概念和作用 硬盘底层一次IO就是读.写一次扇区,一个扇区默认是512Byte. 读写大量文件如果以扇区为单 ...
- Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香...
做程序员就少不了与一些工具打交道,比如:监控工具.管理工具等,有些工具是命令行界面,有些工具是可视化界面,反正都是可以能够满足日常使用的功能需求. 对于redis管理工具来说,也有不少可能的产品,比如 ...