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实现微信扫码支付的更多相关文章

  1. Python实现微信扫码支付模式二(NativePay)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7649207.html 核心代码github地址:https://github.com/ygj0930/Pyth ...

  2. Python+Django实现微信扫码支付流程

    Python+Django实现微信扫码支付流程 关注公众号"轻松学编程"了解更多. 获取源码可以加我微信[1257309054],文末有二维码. [微信公众号支付官网]https: ...

  3. MVC 微信扫码支付

    微信扫码支付有两种模式, 模式一和模式二, 两者具体的区别可参考官网文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4 微 ...

  4. C# 微信扫码支付 回调页面

    .NET版 微信扫码支付,官方推荐使用[模式二] 一.微信扫码支付模式一: 1.回调页面:官方demo中example文件下的NativeNotifyPage.aspx 2.微信回调地址:http:/ ...

  5. C# 微信扫码支付API (微信扫码支付模式二)

    一.SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1,下载.NET C#版本: 二.微信相关设置:(微信扫码 ...

  6. Net MVC微信扫码支付

    微信扫码支付+Asp.Net MVC 这里的扫码支付指的是PC网站上面使用微信支付,也就是官方的模式二,网站是Asp.net MVC,整理如下. 一.准备工作 使用的微信API中的统一下单方法,关键的 ...

  7. 微信公众号支付|微信H5支付|微信扫码支付|小程序支付|APP微信支付解决方案总结

    最近负责的一些项目开发,都用到了微信支付(微信公众号支付.微信H5支付.微信扫码支付.APP微信支付).在开发的过程中,在调试支付的过程中,或多或少都遇到了一些问题,今天总结下,分享,留存. 先说注意 ...

  8. php微信扫码支付

    一 概述 扫码支付是商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式.该模式适用于PC网站支付.实体店单品或订单支付.媒体广告支付等场景.前几天公司需要做 ...

  9. ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步通知功能. 开发环境:Win 10 x64.VS2017 15.6.4..NET Core SDK ...

  10. 【转载】ASP.NET Core Web 支付功能接入 微信-扫码支付篇

    转自:http://www.cnblogs.com/essenroc/p/8630730.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入微信-扫码支付及异步 ...

随机推荐

  1. 哈希表(hash)

    散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度 ...

  2. PIR传感器选型及其使用介绍

    (一)PIR简介 PIR传感器(Passive Infrared Sensor),即被动式红外传感器.它因为功耗低,价格低廉,使用简单从而被大量使用在门铃.猫眼.感应开关.小夜灯.安防等消费类产品上. ...

  3. SQL模糊查询语法思考

    模糊查询 sql语句: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 % :表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示 ...

  4. SpringBoot项目启动过程动态修改接口请求路径

    背景 最近遇到一个技术需求,需要对其他多个已有的服务进行整合打包为一个整体的服务,项目启动过程发现一个问题,在controller层多个服务之间存在相同的RequestMapping接口请求路径,导致 ...

  5. scroll-view和swiper的使用

    源码: <template>            <viex class="out">            <view class="b ...

  6. Ubuntu 22.04 LTS 安装lnmp

    Ubuntu 22.04 LTS 安装最新稳定版本nginx.mysql5.7和php7.2 全部apt-get安装,就是快,迅速.前提是需要在有网络环境的情况下哈!! 操作系统版本:Ubuntu 2 ...

  7. hdu 5685

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5685 解题思路:前缀积+费马小定理求逆元. AC代码: 1 #include<iostream> ...

  8. 轻量型 Web SCADA 组态软件 TopLink

    图扑物联 发布了一款工业物联网边缘侧应用场景的轻量型 Web SCADA 组态软件 Iotopo TopLink.该产品采用 B/S 架构,提供 Web 管理界面,软件包大小仅 23MB,无需安装客户 ...

  9. Linux磁盘专题-linux文件系统详解

    这可是我几年前的杰作笔记呀.....当初手写计算都会,现在忘光光.... 物理硬盘Block的概念和作用 硬盘底层一次IO就是读.写一次扇区,一个扇区默认是512Byte. 读写大量文件如果以扇区为单 ...

  10. Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香...

    做程序员就少不了与一些工具打交道,比如:监控工具.管理工具等,有些工具是命令行界面,有些工具是可视化界面,反正都是可以能够满足日常使用的功能需求. 对于redis管理工具来说,也有不少可能的产品,比如 ...