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. Vite4+Typescript+Vue3+Pinia 从零搭建(3) - vite配置

    项目代码同步至码云 weiz-vue3-template 关于vite的详细配置可查看 vite官方文档,本文简单介绍vite的常用配置. 初始内容 项目初建后,vite.config.ts 的默认内 ...

  2. Vue 2.x源码学习:render方法、模板解析和依赖收集

    内容乃本人学习Vue2源码的一点笔记,若有错误还望指正. 源码版本: vue: 2.6 vue-loader: 13.x vue-template-compiler: 2.6 之前的相关学习笔记: 应 ...

  3. L2-037 包装机

    #include <bits/stdc++.h> using namespace std; const int N = 110; stack<char> stk[N]; int ...

  4. 递归与分治思想:治思想 && 折半查找法(迭代 && 递归)

    1 //分治思想:将大问题拆成小问题逐一解决 2 //折半查找法:不断缩小一半查找的范围,知道达到目的,效率较高. 详情见:https://fishc.com.cn/thread-27964-1-1. ...

  5. Ubuntu 20.04 使用 socat 转发特定端口

    安装socat apt install socat 根据需求确定要转发的端口 比如,我的需求是监听IPv6的某一TCP端口,并转发至局域网内某一特定主机,可以使用以下命令: socat TCP6-LI ...

  6. 泛微OA与ERP集成的关键要点

    泛微OA办公系统与ERP系统的集成是为了实现企业内部各个系统之间的数据共享和协同工作,提高工作效率和管理水平.下面将详细介绍泛微OA办公系统如何与ERP系统集成以及轻易云数据集成平台在该过程中发挥的重 ...

  7. c++算法练习day01【2022年蓝桥杯省赛B组题目】每天做一点、、、

    这个练习目前来说就比较宽松,打算在寒假(基本也就是这一个月每天刷几道题吧) 题目一: 小明决定从下周一开始努力刷题准备蓝桥杯竞赛.他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目.请你 ...

  8. ABAP 泰国凭证批导 报错 F51 192 输入一个业务场景

    泰国凭证批导报错 F51 192 输入一个业务场景 方案一: 方案二:  ID_BUPLA  用户参数

  9. BI软件是什么?应用BI工具能给企业带来什么

    BI软件是指利用数据挖掘.分析和可视化等技术,将企业内部和外部数据转化为有价值的信息和洞察,以帮助企业支持业务决策和优化业务流程的工具和应用程序.常见的BI软件包括Datainside.QlikVie ...

  10. 掌握这些,轻松管理BusyBox:如何交叉编译和集成BusyBox

    在嵌入式系统中,由于设备的资源限制,需要开发人员寻找一种轻量.小型且使用广泛的工具集.而 BusyBox 就是这样一个在嵌入式系统中非常实用的工具集.本文将介绍如何在 Ubuntu 22.04 平台上 ...