提交 b206ad1e authored 作者: 李思鑫's avatar 李思鑫

增加zsk类

上级 caf0312a
......@@ -1179,6 +1179,8 @@ urlpatterns = [
url(r'^test/send_hb/$', wx_views.test_send_hb),
url(r'^test/consumer_winner_hit/$', sal_views.test_consumer_winner_hit),
url(r'^test/zsk_pay/$', wx_views.test_zsk),
url(r'^wx/kangnian/terminal/$', wx_views.kangnian_getTerminal),
......
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCefZbdsT6RiaCRqWKKIi4rWrntio3oX1RbCFSGHI3o2jS34Aew0QwBDDftdPS6ohgMRksIykoTTmXE8/1xgLc43Ed1kAQ2AHUkTdIRzhI3Sp5Ac6sD9B/Ys3Adb05PRvfCEcqDlRVjsLYCeFFpi9djZev97ojmKSajJ3kS7OnmuQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA6NLHoZOiPT0wgnfg0nRl3CqcyNGWDBoCDkJ5Cw/AHt5IAEQ1
R81w+5vBcLxGCttz4Qapcbpy+ck9zYiiVtOjInhS14tbgJad9jCTWm8+ejShVp/M
k9Xe1irORrxbj9YJ3L3BbYr5K3wTuAMd43Wp+7Ia7LpplmGSvOZumTRYRyFQgSs6
Vfv0x4fRQI4/JdUp+sX3DUUns0kXy8ggoI/B6kUYS6+Th+YWjcztdliJtRMb9sM5
BIJGWuGUNCDo93+UNyTxrEI8cTczfxqlzKRZSoadHa4xJF3TBKrgm4D5fZNF/ZEs
WmfsC7qalc0x0sHuPBnXTKM97d4t0WosTJkvAQIDAQABAoIBABT6Fr/9Vf8IAhSj
OeekUqAfW8BxN8Bv4HMJ9K91NBVj6B9UBevp++3Dhw6B/BqS0rI54C7twlm0ksOv
tZa2m0pqBmbCuNQRXfqWPlSF1N58WvP70loYiSsJMMwpQOOpAHr5wtF8lb4gAAPS
jhEWIyJZFflxwz0oHek0ps7Za0G/N+cFLZAdju9OXoO3mQMvuP8AQ7qT3A3sGJP4
d6K5YzMZSNT2SrwLR18VUpaFIDkCLp4XW5LZ7SJP5Ps2OoAPGawDA8g5OFC3z3J2
lZvT9BlOhkETimhwkXjuJV68RD+YmMulIxU5Q+erljACImfP43r6aOgIs7mezm2R
bSvQXmUCgYEA7N6GuphLIOV8tOfmDpCWKgmsArTVD2t/wLa4yYpffN57gz9NZ/oa
LsOIrl62MRmybWoVa/WlP9d3cNbS5NsyJeispKftMqzdiWi2d78X358GtgebxpzG
2s+e4k4pWvVSPW98YcqBn0xa0RWVtfREyyQ6ZJCxOMxShCgPKWXJZc0CgYEA+6CZ
9ctoRWGXXGC3VRYbwVEWtu3g40cTUILX7ZA1weXilE+9pr5BgmOPqm9i16GMjTKe
92rn6H2VBm5o9nlLX1KR2IiY3YEZ77QgQuOGNrJrk9GXRGOVoR4553ACaqzD/d5N
NTMYGSLlUMvu2K74S7Y1tTMfle7wKw9M0utA+gUCgYEAjENZVLVKB7jdF+MagBVu
VoZTrWaXpAHsLJoG4pFl6fN1AEtD8wZO6tIu5dJ/4KNu3Qusk7lqmVtmBxOu3oZO
M9SMJxSpiRCEPxIaut4VrP3mY3Qt8nZz6q53T1spcgtDH84cwWvBRitYu+ckOBLl
icVyLorf5tpXIpr2H3V+xSECgYBu9PPPGiHhrlYTSyaso3IbvckZYy3uqrHOp9PV
kujRlrBiHAOSGoVCnOqGClX4pekXfkHw8jhPIclsK5WnUfc1knBznlBiJIKuW6x6
MmBFkEm1xg9A/fTGNlDsSE0YgxRtxvAezGgM9YFPLo4lCIq+wBtQyrlb4SAQrM+A
lnJxjQKBgA9YtJU5xpIR9KkKqqyCZINi+XmAwffh6XoT0e8DgOHXHnc8GgODCasL
wtCqmARfdnSy8UE2NSdHHPJUVx299t6wL0VLv11MEZqKu8mJwCIiAdR5YsHbaKTp
H+qprpac3lhMgEh25H93mxjZBxaRSjLzy2+n6XQtr2vYt5sdztVQ
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6NLHoZOiPT0wgnfg0nRl
3CqcyNGWDBoCDkJ5Cw/AHt5IAEQ1R81w+5vBcLxGCttz4Qapcbpy+ck9zYiiVtOj
InhS14tbgJad9jCTWm8+ejShVp/Mk9Xe1irORrxbj9YJ3L3BbYr5K3wTuAMd43Wp
+7Ia7LpplmGSvOZumTRYRyFQgSs6Vfv0x4fRQI4/JdUp+sX3DUUns0kXy8ggoI/B
6kUYS6+Th+YWjcztdliJtRMb9sM5BIJGWuGUNCDo93+UNyTxrEI8cTczfxqlzKRZ
SoadHa4xJF3TBKrgm4D5fZNF/ZEsWmfsC7qalc0x0sHuPBnXTKM97d4t0WosTJkv
AQIDAQAB
-----END PUBLIC KEY-----
差异被折叠。
#橙券支付
#中数科支付
#接口文档 https://doc.apipost.net/docs/detail/34ff33e7bce7000?target_id=ef551d7ba901a
import hashlib
import datetime
......@@ -8,46 +10,175 @@ import urllib.request
import urllib.parse
import random
import base64
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
domain='https://api.chengquan.cn'
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
env = 'dev'
domain='http://ywymtest-api.azhiyun.cn'
sign = {
'dev': {
'ym-id': '645206198756315136',
'ym-key': '15a5ba24711540f0bd3246b92a7c7daa'
},
'prod':{}
}
class ZSKPay:
def __init__(self, appid, k, aes_key='', aes_iv=''):
self.appid = appid
self.k =k
self.aes_key = aes_key
self.aes_iv = aes_iv
def __init__(self):
self.MAX_ENCRYPTION_SIZE = 117 #214
# 计算签名
def generate_sign(self,data):
return ''
def http_post(self,data, type, url):
timestamp = int(round(time.time() * 1000))
data['timestamp'] = timestamp
data['ym-id'] = self.appid
if type:
data['type'] = type
sign = self.generate_sign(data)
data['ym-key'] = sign
data = json.dumps(data)
data = bytes(data,"utf8")
headers={'Content-Type':'application/json'}
request = urllib.request.Request(domain+url, data, headers)
res = urllib.request.urlopen(request).read().decode('utf-8')
return json.loads(res)
# # 1. 整理参数
# sorted_keys = sorted(data.keys())
# sorted_data = []
# for key in sorted_keys:
# sorted_data.append(f"{key}={data[key]}")
# # 2. 连接参数
# params_string = '&'.join(sorted_data)
# # 3. 添加签名秘钥
# params_string += f"&key={self.k}"
# # 4. MD5 加密
# sign = hashlib.md5(params_string.encode('utf-8')).hexdigest().upper()
return 'sign'
def encrypt_data(self, data):
encrypted_chunks = []
current_directory = os.getcwd()
with open(current_directory+"/wx/cert/zsk/req/public_key.txt", "rb") as public_file:
public_key_content = public_file.read()
public_key_loaded = serialization.load_pem_public_key(
public_key_content,
backend=default_backend()
)
# 将数据分块
for i in range(0, len(data), self.MAX_ENCRYPTION_SIZE):
chunk = data[i:i + self.MAX_ENCRYPTION_SIZE]
try:
# 使用公钥加密内容
ciphertext = public_key_loaded.encrypt(
chunk,
padding.PKCS1v15()
)
encrypted_chunks.append(ciphertext)
except Exception as e:
print("加密块失败:", e)
# 将所有加密后的块连接在一起
resp = b''.join(encrypted_chunks)
return base64.b64encode(resp).decode('utf-8')
def decrypt_data(self, data):
current_directory = os.getcwd()
with open(current_directory+"/wx/cert/zsk/resp/private_key.txt", "rb") as public_file:
private_key_content = public_file.read()
# 加载私钥
private_key_loaded = serialization.load_pem_private_key(
private_key_content,
password=None,
backend=default_backend()
)
# 解密
data = json.jmson.loads(data)
plaintext = private_key_loaded.decrypt(
base64.b64decode(data),
padding.PKCS1v15()
)
return plaintext.decode('utf-8')
def http_post(self, data={}, url=''):
data = json.dumps(data).encode('utf-8')
# 加密数据
data = self.encrypt_data(data)
# print("加密后数据:", type(data), data)
headers = {
'Content-Type': 'application/json',
**sign[env]
}
request = urllib.request.Request(domain + url, bytes(json.dumps({'data': data}), "utf8"), headers, method='POST')
# 发送请求并获取响应
try:
response = urllib.request.urlopen(request)
# 读取响应体
res_body = response.read().decode('utf-8')
print("返回结果:", res_body)
return json.loads(res_body)
except urllib.error.HTTPError as e:
print("HTTP错误:", e.code, e.read().decode())
except urllib.error.URLError as e:
print("网络错误:", e.reason)
def transfer(self):
data = {
#转账
def transfer(self,data):
print('开始转账:')
handle_data = {
"taxId": 1836580691238883330,
"batchNo":data.get('batchNo', self.generate_batchNo()),
"appid": data.get('appid','wxb8516c6064271fe4'),
"batchName": data.get('batchName','活动批次'),
"batchRemark": data.get('batchRemark','默认备注'),
"totalAmount": 0,
"totalNum": 0, #转账总笔数
"transferSceneId": "", #转账场景ID
"notifyUrl": "", #回调地址
#转账明细列表
"transferDetailList":data.get('transferDetailList',[])
# [
# {
# "transferNo": "tj_consumer_winner_001", //商家明细单号
# "transferAmount": 30, //转账金额单位为“分”
# "transferRemark": "红包", //转账备注,【转账备注】 单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符
# "openid": "oCZuC5RiJ8RId4qacC0inhy74vRc", //【收款用户openid】商户appid下,某用户的openid
# "userName": "
# }
# ]
}
return self.http_post_form(data, '', '')
if len(data['transferDetailList']) == 0:
raise ValueError("transferDetailList 必传")
for item in data['transferDetailList']:#计算总金额和总笔数
# if not item.get('transferNo') or not item.get('transferAmount') or not item.get('transferRemark') or not item.get('openid'):
# raise ValueError("缺少转账参数")
handle_data['totalAmount'] += item['transferAmount']
handle_data['totalNum'] += 1
print('加密前数据----:',handle_data)
return self.http_post(data=handle_data,url='/wx-pay/transfer')
#转账信息查询
def tranfer_info(self,data={}):
if not data.get('batchNo') or data.get('batch',''):
raise ValueError("缺少参数")
encrypt_body = self.http_post(data=data,url='/wx-pay/transfer-info')
decrypted_body = self.decrypt_data(encrypt_body['data'])
print('解密后的查询数据',decrypted_body)
return json.loads(decrypted_body)
# 生成订单号
def generate_order_number():
def generate_batchNo():
timestamp = int(time.time())
random_number = random.randint(1000, 9999)
order_number = str(timestamp) + str(random_number)
return order_number
batchNo ='tj'+ str(timestamp) + str(random_number)
return batchNo
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论