first commit
This commit is contained in:
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
# 默认忽略的文件
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# 数据源本地存储已忽略文件
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# 基于编辑器的 HTTP 客户端请求
|
||||
/httpRequests/
|
||||
18
.idea/enterprise-wechat-payment-push.iml
generated
Normal file
18
.idea/enterprise-wechat-payment-push.iml
generated
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="Flask">
|
||||
<option name="enabled" value="true" />
|
||||
</component>
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="PyDocumentationSettings">
|
||||
<option name="format" value="PLAIN" />
|
||||
<option name="myDocStringFormat" value="Plain" />
|
||||
</component>
|
||||
<component name="TemplatesService">
|
||||
<option name="TEMPLATE_CONFIGURATION" value="Jinja2" />
|
||||
</component>
|
||||
</module>
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
4
.idea/misc.xml
generated
Normal file
4
.idea/misc.xml
generated
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/enterprise-wechat-payment-push.iml" filepath="$PROJECT_DIR$/.idea/enterprise-wechat-payment-push.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
BIN
.utils.py.swo
Normal file
BIN
.utils.py.swo
Normal file
Binary file not shown.
BIN
.utils.py.swp
Normal file
BIN
.utils.py.swp
Normal file
Binary file not shown.
100
WXPay.py
Normal file
100
WXPay.py
Normal file
@ -0,0 +1,100 @@
|
||||
import json
|
||||
import random
|
||||
import socket
|
||||
import string
|
||||
import time
|
||||
from config import *
|
||||
from Cryptodome.PublicKey import RSA
|
||||
from Cryptodome.Signature import pkcs1_15
|
||||
from Cryptodome.Hash import SHA256
|
||||
import requests
|
||||
# 生成签名函数
|
||||
from base64 import b64encode, b64decode
|
||||
|
||||
import requests
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Hash import SHA256
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Signature import pkcs1_15, PKCS1_v1_5
|
||||
|
||||
|
||||
# 获取加密
|
||||
def get_sign(sign_str, gs):
|
||||
if gs == "金银建":
|
||||
rsa_key = RSA.importKey(open('jyj.pem').read())
|
||||
elif gs == "华建":
|
||||
rsa_key = RSA.importKey(open('hj.pem').read())
|
||||
elif gs == "银建":
|
||||
rsa_key = RSA.importKey(open('yj.pem').read())
|
||||
elif "新能源" in gs:
|
||||
rsa_key = RSA.importKey(open('xny.pem').read())
|
||||
else:
|
||||
rsa_key = RSA.importKey(open('apiclient_key.pem').read())
|
||||
signer = pkcs1_15.new(rsa_key)
|
||||
digest = SHA256.new(sign_str.encode('utf8'))
|
||||
sign = b64encode(signer.sign(digest)).decode('utf-8')
|
||||
return sign
|
||||
|
||||
|
||||
class WXPay:
|
||||
"""
|
||||
微信 H5支付
|
||||
"""
|
||||
|
||||
def __init__(self, serial_no, mchid):
|
||||
self.appid = corpid
|
||||
self.mchid = mchid
|
||||
self.url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/h5'
|
||||
self.notify_url = "http://web.jiyuankeshang.com/api/paymentCallBack"
|
||||
self.serial_no = serial_no # 商户号证书序列号
|
||||
|
||||
# 统一下单
|
||||
def unified_order(self, order_no, total, description, gs):
|
||||
data = {
|
||||
"mchid": self.mchid,
|
||||
"out_trade_no": order_no,
|
||||
"appid": self.appid,
|
||||
"description": description,
|
||||
"notify_url": self.notify_url,
|
||||
"amount": {
|
||||
"total": total,
|
||||
"currency": "CNY"
|
||||
},
|
||||
"scene_info": {
|
||||
"payer_client_ip": ip,
|
||||
"h5_info": {
|
||||
"type": "Wap"
|
||||
}
|
||||
}
|
||||
}
|
||||
data = json.dumps(data) # 只能序列化一次
|
||||
random_str = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(32))
|
||||
time_stamps = str(int(time.time()))
|
||||
sign_str = f"POST\n{'/v3/pay/transactions/h5'}\n{time_stamps}\n{random_str}\n{data}\n"
|
||||
sign = get_sign(sign_str, gs)
|
||||
|
||||
headers = {
|
||||
'Content-Type': 'application/json; charset=UTF-8',
|
||||
'Authorization': 'WECHATPAY2-SHA256-RSA2048 ' + f'mchid="{self.mchid}",nonce_str="{random_str}",signature="{sign}",timestamp="{time_stamps}",serial_no="{self.serial_no}"'
|
||||
}
|
||||
response = requests.post(self.url, data=data, headers=headers)
|
||||
print("=============", response.text, self.notify_url)
|
||||
return response
|
||||
|
||||
def decode_notify_data(self, res_json):
|
||||
try:
|
||||
ciphertext = res_json['resource']['ciphertext']
|
||||
nonce = res_json['resource']['nonce']
|
||||
associated_data = res_json['resource']['associated_data']
|
||||
cipher = AES.new(v3_SECRET.encode(), AES.MODE_GCM, nonce=nonce.encode())
|
||||
cipher.update(associated_data.encode())
|
||||
en_data = b64decode(ciphertext.encode('utf-8'))
|
||||
auth_tag = en_data[-16:]
|
||||
_en_data = en_data[:-16]
|
||||
plaintext = cipher.decrypt_and_verify(_en_data, auth_tag)
|
||||
decodejson = json.loads(plaintext.decode())
|
||||
except Exception as e:
|
||||
print(f"解密回调失败:{e}")
|
||||
return None
|
||||
return decodejson
|
||||
|
||||
BIN
__pycache__/WXPay.cpython-37.pyc
Normal file
BIN
__pycache__/WXPay.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/config.cpython-37.pyc
Normal file
BIN
__pycache__/config.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/utils.cpython-37.pyc
Normal file
BIN
__pycache__/utils.cpython-37.pyc
Normal file
Binary file not shown.
28
apiclient_key.pem
Normal file
28
apiclient_key.pem
Normal file
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2QMlEYo66rQ8S
|
||||
hk5AgUOgqPZokuc3cGp9UMUxDjLLCXGYw0rzInwIfMs6iPHZpsvbRiJJGNMOiliQ
|
||||
eUHddAqPuaAI35yVzcpe+CBcbuIVIOFl2fASGU66U72RehFnzLFmC4hDu6M0yOTB
|
||||
ktcibISHdr4zGQEOgN3klRB/ftrtNLBVkm4KJBSUwH5QtUaNaPtySbFvYNWrTEom
|
||||
P780lG7MaiHxDJvct6zuy72de71GcXUhyq4lr0d3LmcHNa14hMsY6Gdd8vLPVuC9
|
||||
0cifbKGy/G4t4RfFzmasTt+wFqn4gk1xw5rPb824nx6D46k1uxh+rRVwRVhVN130
|
||||
emNUFy9ZAgMBAAECggEAMOwDGtA57/I0cYyLxNTuClpQipGkb0VF0I214Q0mpUnL
|
||||
rG3/2HQRR1X4V6YbBYm4fwu8eFKplOWeEGn8PC3CCAKT6s3bgnrTL9r7FNTO600A
|
||||
NA7kWndgorOH110k/u/7TqEZ2tSrYqfqf+uixCLNEG/Xbm/v0KzW410AKLksmy9t
|
||||
V/dm3dcecYitNa0FYx5DCvbPjDppzPZ4I9BXindlKCF8Wivn2ELng4gbpIFFX8pj
|
||||
wZ0yyWgWZh47A8JiSlqW+Q1FAOWOFqrG7HCEtud7mH4Yv9slDlMlQ/I3zJ0VAZpM
|
||||
Z44rm6zr16+RslzeWQfau98cALwxViIUs37aSvMUAQKBgQDlmQ+YKxSt5qjFYZos
|
||||
xIQyMrtxD+C3mGu49FkPGjAZfYvs1yZSwU51LMq8wQR3vVYNz8GIdqbCQU1Cyw97
|
||||
Bga5pIDew3wF3jazJord3OqVOkyGehqLTtOMtr/Jd2v6iBn8i+pE0QdJV2tiv9SE
|
||||
afNYgmwGP1s7Q/Igqas4zLB38QKBgQDLNfscV+4LKsmgC3qiVt5o9DUKMfP7CpuT
|
||||
BjznXC7Jf6qR1Pop2MfeI8ygwBrtCyXUWDEhZYhZOyrRFac3CPKywUtFzpT5zX1Y
|
||||
rSvkP7YM7/1N1FDHswxC+uvuxeznGvfFK8cg/1T3VQuMtJi83dnbLDDhF6Y2aZS1
|
||||
717bORdV6QKBgA9MjrR2Em+wEgjtAwf+pExwAvt6sl+pgWwWpCSUeyYHrp4+i+gx
|
||||
x1eZf3zqY7DS5fwPnvbH6T7CeTJ9M2/gK+yM4KV3YzlE4GI5rEEyalM9SkIfussT
|
||||
mpciyk7TbVeJYCnq7NZfE1w4vggbfj7AjJ2WOzqDWEHvuh+hDq6/PPcRAoGBALH6
|
||||
MleNr6A6NmMlCqBaQutbT4UBYTWzAbUQVpEvzI6QcRzOktfJ1Kt7YUI9XpfUFqrX
|
||||
Hxin63ZzermrJEvwW1gyMTIPj60Fy825xeJf5puIKatb0/BDoe6cA72ZvjZfCTi4
|
||||
cew1lP4Wj0oJ9mgcSi1Kk/jhFKM9b5C0+Lg6VXTZAoGAVcmSRpi1KIr+XinSrM+W
|
||||
b09e6syfZkyO63R/WPfz/y6iuJB3ky8GatznHgdzNRfkmygvS/6C3DG6hjqyRKJ9
|
||||
HhGNCBnqUmR0OXUxMX40j6s1diaIYTkVYrIbgPyg5oO1Xk0tlQvgT/LG2FgQfROL
|
||||
9saDES1WaXN2Iu9x/rZ22/o=
|
||||
-----END PRIVATE KEY-----
|
||||
184
app.py
Normal file
184
app.py
Normal file
@ -0,0 +1,184 @@
|
||||
from flask import Flask, request, redirect, abort, session
|
||||
from utils import *
|
||||
from WXPay import WXPay
|
||||
import os, _thread, urllib
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = os.urandom(24)
|
||||
|
||||
|
||||
|
||||
@app.route('/queryUserId', methods=['GET'])
|
||||
def queryUserId():
|
||||
# 获取支付明细
|
||||
try:
|
||||
code = request.args.get('code')
|
||||
data = query_wx_userid(code)
|
||||
if len(data) <= 11:
|
||||
res = query_wx_fj_info(data)
|
||||
data = res
|
||||
print(f'http://web.jiyuankeshang.com/?user={data}')
|
||||
return redirect(f'http://web.jiyuankeshang.com/?user={data}')
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/queryUser', methods=['GET'])
|
||||
def queryUserApi():
|
||||
# 获取支付明细
|
||||
try:
|
||||
id = request.args.get('user')
|
||||
data = queryUser(id)
|
||||
return data
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/getPaymentDetails', methods=['GET'])
|
||||
def getPaymentDetails():
|
||||
try:
|
||||
id = request.args.get('user','')
|
||||
|
||||
id = id.replace(" ", "")
|
||||
|
||||
if not id:
|
||||
return {}
|
||||
data = query_pay_details(id)
|
||||
return data
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/paymentCallBack', methods=['POST'])
|
||||
def paymentCallBack():
|
||||
# 充值成功后回调 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
print("1111111111paymentCallBack")
|
||||
msg = request.data.decode('utf-8')
|
||||
msg = eval(msg)
|
||||
whp = decode_notify_data(msg)
|
||||
print("充值回调", whp)
|
||||
if whp['trade_state'] == 'SUCCESS':
|
||||
print("充值回调SUCCESS")
|
||||
id = whp['out_trade_no'].split('_')[0]
|
||||
# 查询机构、分司
|
||||
res = filter_jdy_ht(id)
|
||||
transaction_id = whp['transaction_id']
|
||||
amount = float(whp['amount']['total'])
|
||||
amount = amount / 100
|
||||
print("充值回调处理",{"pay_amount": amount, "id": id,
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5],"zhunyingzhenghaoma":res[7],"guanlibumen":res[8],"guanlibumenfuzeren":res[9], "transaction_id": transaction_id})
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": amount, "id": id,
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5],"zhunyingzhenghaoma":res[7],"guanlibumen":res[8],"guanlibumenfuzeren":res[9], "transaction_id": transaction_id},))
|
||||
return {"code": 200}
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/test', methods=['POST'])
|
||||
def test():
|
||||
# 新增未收付明细 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
data = request.data.decode("utf-8")
|
||||
print(data)
|
||||
return {}
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {}
|
||||
|
||||
|
||||
|
||||
|
||||
@app.route('/addUnPayment', methods=['POST'])
|
||||
def addUnPayment():
|
||||
# 新增未收付明细 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
data = request.data.decode("utf-8")
|
||||
data = data.replace("null", "None")
|
||||
data = eval(data)
|
||||
data = data['data']
|
||||
print("开始========", data)
|
||||
res = filter_jdy_ht(data['sijishenfenzhenghao'])
|
||||
data1 = {"pay_amount": 0, "id": data['sijishenfenzhenghao'],
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5],"zhunyingzhenghaoma":res[7],"guanlibumen":res[8],"guanlibumenfuzeren":res[9]}
|
||||
print(data1)
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": 0, "id": data['sijishenfenzhenghao'],
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5],"zhunyingzhenghaoma":res[7],"guanlibumen":res[8],"guanlibumenfuzeren":res[9]}, 1))
|
||||
|
||||
return {data}
|
||||
except Exception as e:
|
||||
print("addUnPayment",e, res)
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/addPayment', methods=['POST'])
|
||||
def addPayment():
|
||||
# 新增充值明细 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
data = request.data.decode("utf-8")
|
||||
print(data)
|
||||
data = data.replace("null", "None")
|
||||
data = eval(data)
|
||||
data = data['data']
|
||||
res = filter_jdy_ht(data['id_card'])
|
||||
if not data['price']:
|
||||
data['price'] = 0
|
||||
if not res:
|
||||
# 合同表单未有数据
|
||||
fsfz = data['fsfz']['dept_no'] if data['fsfz'] else ""
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": data['price'], "id": data['id_card'],
|
||||
"fs": data['fs'], "jg": data['jg'], "name": data['name'],
|
||||
"fsfz": fsfz, "hphm": data['hphm'],"zhunyingzhenghaoma":data['zhunyingzhenghaoma'],"guanlibumen":data['guanlibumen'],"guanlibumenfuzeren":data['guanlibumenfuzeren']}, 1))
|
||||
else:
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": data['price'], "id": data['id_card'],
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5],"zhunyingzhenghaoma":res[7],"guanlibumen":res[8],"guanlibumenfuzeren":res[9]}, 1))
|
||||
return {}
|
||||
except Exception as e:
|
||||
print("addPayment",e, data)
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/transactions', methods=['GET'])
|
||||
def transactions():
|
||||
# 调起h5支付
|
||||
try:
|
||||
id = request.args.get('user')
|
||||
price = request.args.get('price')
|
||||
|
||||
if not float(price):
|
||||
res = filter_jdy_ht(id)
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": 0, "id": id,
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5],"zhunyingzhenghaoma":res[7],"guanlibumen":res[8],"guanlibumenfuzeren":res[9]}, 1))
|
||||
return {}
|
||||
else:
|
||||
# 查询商户号、商户号证书
|
||||
res = filter_jdy_ht(id)
|
||||
if not res:
|
||||
return "error"
|
||||
|
||||
wx = WXPay(res[3], res[2])
|
||||
price = float(price) * 100
|
||||
url = wx.unified_order(f"{id}_{int(time.time())}", int(price), "订单支付", res[0]).text
|
||||
url = eval(url)
|
||||
return url
|
||||
except Exception as e:
|
||||
print("error", e)
|
||||
return {}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host="0.0.0.0", port=3004, processes=True)
|
||||
179
appsh_backup.py
Normal file
179
appsh_backup.py
Normal file
@ -0,0 +1,179 @@
|
||||
from flask import Flask, request, redirect, abort, session
|
||||
from utils import *
|
||||
from WXPay import WXPay
|
||||
import os, _thread, urllib
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = os.urandom(24)
|
||||
|
||||
|
||||
|
||||
@app.route('/queryUserId', methods=['GET'])
|
||||
def queryUserId():
|
||||
# 获取支付明细
|
||||
try:
|
||||
code = request.args.get('code')
|
||||
data = query_wx_userid(code)
|
||||
if len(data) <= 11:
|
||||
res = query_wx_fj_info(data)
|
||||
data = res
|
||||
print(f'http://web.jiyuankeshang.com/?user={data}')
|
||||
return redirect(f'http://web.jiyuankeshang.com/?user={data}')
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/queryUser', methods=['GET'])
|
||||
def queryUserApi():
|
||||
# 获取支付明细
|
||||
try:
|
||||
id = request.args.get('user')
|
||||
data = queryUser(id)
|
||||
return data
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/getPaymentDetails', methods=['GET'])
|
||||
def getPaymentDetails():
|
||||
try:
|
||||
id = request.args.get('user','')
|
||||
|
||||
id = id.replace(" ", "")
|
||||
|
||||
if not id:
|
||||
return {}
|
||||
data = query_pay_details(id)
|
||||
return data
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/paymentCallBack', methods=['POST'])
|
||||
def paymentCallBack():
|
||||
# 充值成功后回调 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
print("1111111111paymentCallBack")
|
||||
msg = request.data.decode('utf-8')
|
||||
msg = eval(msg)
|
||||
whp = decode_notify_data(msg)
|
||||
print("充值回调", whp)
|
||||
if whp['trade_state'] == 'SUCCESS':
|
||||
print("充值回调SUCCESS")
|
||||
id = whp['out_trade_no'].split('_')[0]
|
||||
# 查询机构、分司
|
||||
res = filter_jdy_ht(id)
|
||||
transaction_id = whp['transaction_id']
|
||||
amount = float(whp['amount']['total'])
|
||||
amount = amount / 100
|
||||
print("充值回调处理",{"pay_amount": amount, "id": id,
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5], "transaction_id": transaction_id})
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": amount, "id": id,
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5], "transaction_id": transaction_id},))
|
||||
return {"code": 200}
|
||||
except Exception as e:
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/test', methods=['POST'])
|
||||
def test():
|
||||
# 新增未收付明细 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
data = request.data.decode("utf-8")
|
||||
print(data)
|
||||
return {}
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return {}
|
||||
|
||||
|
||||
|
||||
|
||||
@app.route('/addUnPayment', methods=['POST'])
|
||||
def addUnPayment():
|
||||
# 新增未收付明细 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
data = request.data.decode("utf-8")
|
||||
data = data.replace("null", "None")
|
||||
data = eval(data)
|
||||
data = data['data']
|
||||
print("开始========", data)
|
||||
res = filter_jdy_ht(data['sijishenfenzhenghao'])
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": 0, "id": data['sijishenfenzhenghao'],
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5]}, 1))
|
||||
|
||||
return {data}
|
||||
except Exception as e:
|
||||
print("addUnPayment",e, res)
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/addPayment', methods=['POST'])
|
||||
def addPayment():
|
||||
# 新增充值明细 {"pay_amount": 20000, "id": "18515367096"}
|
||||
try:
|
||||
data = request.data.decode("utf-8")
|
||||
print(data)
|
||||
data = data.replace("null", "None")
|
||||
data = eval(data)
|
||||
data = data['data']
|
||||
res = filter_jdy_ht(data['id_card'])
|
||||
if not data['price']:
|
||||
data['price'] = 0
|
||||
if not res:
|
||||
# 合同表单未有数据
|
||||
fsfz = data['fsfz']['dept_no'] if data['fsfz'] else ""
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": data['price'], "id": data['id_card'],
|
||||
"fs": data['fs'], "jg": data['jg'], "name": data['name'],
|
||||
"fsfz": fsfz, "hphm": data['hphm']}, 1))
|
||||
else:
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": data['price'], "id": data['id_card'],
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5]}, 1))
|
||||
return {}
|
||||
except Exception as e:
|
||||
print("addPayment",e, data)
|
||||
return {}
|
||||
|
||||
|
||||
@app.route('/transactions', methods=['GET'])
|
||||
def transactions():
|
||||
# 调起h5支付
|
||||
try:
|
||||
id = request.args.get('user')
|
||||
price = request.args.get('price')
|
||||
|
||||
if not float(price):
|
||||
res = filter_jdy_ht(id)
|
||||
_thread.start_new_thread(add_payment, ({"pay_amount": 0, "id": id,
|
||||
"fs": res[1], "jg": res[0], "name": res[4],
|
||||
"fsfz": res[6],
|
||||
"hphm": res[5]}, 1))
|
||||
return {}
|
||||
else:
|
||||
# 查询商户号、商户号证书
|
||||
res = filter_jdy_ht(id)
|
||||
if not res:
|
||||
return "error"
|
||||
|
||||
wx = WXPay(res[3], res[2])
|
||||
price = float(price) * 100
|
||||
url = wx.unified_order(f"{id}_{int(time.time())}", int(price), "订单支付", res[0]).text
|
||||
url = eval(url)
|
||||
return url
|
||||
except Exception as e:
|
||||
print("error", e)
|
||||
return {}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host="0.0.0.0", port=3004, processes=True)
|
||||
48
config.py
Normal file
48
config.py
Normal file
@ -0,0 +1,48 @@
|
||||
'''
|
||||
coding:utf-8
|
||||
@Time:2023/3/28 5:02 PM
|
||||
@Author:dyq
|
||||
'''
|
||||
|
||||
# 调用域名
|
||||
base_path = 'https://www.jiyuankeshang.com'
|
||||
# 企微应用id 应用ID
|
||||
corpid = 'wwc276f7a0347c310b'
|
||||
SECRET = '8jSj7EF1J6P1zzDeqzMxc-1c4EV3tTGyB5yljB2RWtk'
|
||||
# 商户号
|
||||
#mchid = '1640957093'
|
||||
# APIv3密钥
|
||||
v3_SECRET = '20230626yinjian13370189887jiyuan'
|
||||
# 服务器IP
|
||||
ip = '101.43.208.145'
|
||||
# 商户号证书序列号
|
||||
#serial_no = '22E0F3EA849ABD1E687C82D43D26190C46DA5834'
|
||||
# 未收付应用id
|
||||
# pay_app = '628eeaace7f28c00089a60cc'
|
||||
pay_app = "65122df9d8ce14000e42b2b3"
|
||||
# 已收表单Id
|
||||
#received_id = '645b617ee5c2b50009c9dbea'
|
||||
received_id = '62f8646425997a0007fa2554'
|
||||
# 未收表单Id
|
||||
#uncollected_id = '645b48ab5c72e30008fd9999'
|
||||
uncollected_id = '62ecd78e76f428000749e457'
|
||||
# 充值明细
|
||||
pay_details_id = '645b57e9f3523f0008ba6c23'
|
||||
# 个人账户
|
||||
accout_id = '645b5af630488a0007259b55'
|
||||
# 增减项app
|
||||
# hz_app = '628eeaace7f28c00089a60cc'
|
||||
hz_app = '65122df9d8ce14000e42b2b3'
|
||||
# 增减项表单
|
||||
hz_id = '62ef6cd6741a1e000744cc2c'
|
||||
# 合同信息表单
|
||||
ht_id = '62b80148c6c1af0007f8a824'
|
||||
# apikey
|
||||
apikey = '82bl1lhsgjzhd9ahBYvaMNVAncYYRkbE'
|
||||
# 辅助表单(查询驾驶员身份证号)
|
||||
# fu_app = '628eeaace7f28c00089a60cc'
|
||||
fu_app = '65122df9d8ce14000e42b2b3'
|
||||
fu_id = '64685d55e6051a000edad530'
|
||||
# rule_sort = {"社保": 0, "承包金": 1, "调度费": 2, "保养费": 3}
|
||||
rule_sort = {"社保": 1, "承包金": 1, "调度费": 1, "保养费": 1}
|
||||
|
||||
28
hj.pem
Normal file
28
hj.pem
Normal file
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLyOpJ7+3m0++B
|
||||
/OgtGeD9eKDTjrTKrjDqQYELsAOOgARJ8UuJUNCjGjk4cBqd8ehPwq2YQ4va8Nyx
|
||||
lJmasm/eX17yMz9ucN8eSZphamtuIx2wEq58NXmrYtnGbCCnc87eirC0T1zmBOrU
|
||||
dZ1pld5cQoUqncGkWAWXKk7TDv7ylfQ/I4dgM8tsdYZeC/ZqGCZXCRcZldOTEGDD
|
||||
I8tvqTYmAh5l8GzSrgzs+wwqNyrVoiosaAiaEz/6ZqienHLH3QbwV3cKHS4SiHMT
|
||||
wIftqnpXJN3aRMcQj2Qe9gu3euaGdzUYVre8p3DwEHczxQLyOfLl3bZ9shI0Ajnd
|
||||
djN10NgJAgMBAAECggEAVU4TlUPUiK3rMrTV1BtjLXfTivvP/pAQdd9Zz7SsqHg6
|
||||
U2GoxyCHVd9iWJfE7J0ZLFpIJNcRsmLlX4jfC/zqC2JM8oI1aVviamFROLo9omsc
|
||||
wFnxpJkWB4Jnu0IEIVS/IjVYZwJZ1wfz7WAWtt4/qMtHx2EmcE9Qd8kEGiHK42zW
|
||||
wcAIQNZX/QCxd+QxTZtEJKB0GS6UfCCR3T3vxsT9t9QN4Jiz0xPjMNkOoXkhOee2
|
||||
k0VM9XYnNeFHahMSF05xl0ZBtPcsBAF9zmtycVLRZVafz0tikqVrQl1C8aCA6dUW
|
||||
BEJabFwfCtXZ/9bGAKeL/U+9asvz2RKAXeILirzgoQKBgQDxJ12lt0LSN4TfCw2t
|
||||
9JOTp+DcNU0gBAO4sXGtkbZZBTrQgRIgX0TjNx3TzSskgsbzV8cMEnziUx6SUQ2P
|
||||
iAPwIYD/raVCxRPys9+vzvC1JpIUDlDGNMqPnLRKv9eemBG2Vu0BCr0/YjaqC89S
|
||||
j/k1UETBQmcv196QNFonW7GV7QKBgQDYVJteANHV/vEUFie47IuEmDvDbvZTfm33
|
||||
IJJvpDxREs1VzRFRvAf2spiG0VHMjVZZFiyjqwlhJKLe0vAaAMfkYhvTzmEHeQAa
|
||||
LUo52c9poLNJ2BdyEVmv1o151Z7Qw9hK4OmfkJ1wNycm0N7/Dba9k4wOFe9kbmg3
|
||||
kft3kyXHDQKBgEsBk38XoREBc7JsHbUdfUlPzgCwE20B0qZ/inwR9kV5+vEfNCQd
|
||||
fa+uVPirt9+DTZ4ijyaSGYXLlJat3ynlhFQMF7Nurxg1dB7pE4n7M6MkfAsA6N69
|
||||
TMOeWfVl9gq+AcRVBSJt1K8CPT5mrfVgEoMilEAIB1A6NF9l6SSUwIeBAoGAYu1+
|
||||
B2T0kJn/gSIIlEaIHuDHI75QoyoD+6lHjgpbEvA4Om6G5wvH0IcnvS9n6tUPkbnU
|
||||
PBxxM51fZeqspheJUeWTuC5+rL4mz9G6Se5TLYixtKk/P4izrPe+xuJruCh3dvaX
|
||||
n8KwXKq8GsIV2ClbUiJxP9fEG/dpbVAy4SHHetkCgYEAmR18mBogQibWvahSHLXe
|
||||
jA+iR6CPcfLyF5N1zDevsfWX/hCvcLJpEOCT+3FtS5qGDdOn/7OLC6ZGMMTyAzJk
|
||||
YWzyeEYUjlDaMWhACD5kAQW0YW771IjHyltK84EgxKQ26J+2n9uanjdmm3uZUB1N
|
||||
ukMUFFr/CAJHAB858MvzMNM=
|
||||
-----END PRIVATE KEY-----
|
||||
28
jyj.pem
Normal file
28
jyj.pem
Normal file
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDnPSs6NrRqoB/A
|
||||
X4SF8PnARI/k5pWRuauVrERTLkCd69rYiR/0JMsZq6/kp2zQvZjbWwD0k7tsYE5s
|
||||
mfyVhCYr/ZknCFWkhecV8TPOZZymstgZjW4tQPPbO8C8zQ5PSa87gKaCxpPBpEMK
|
||||
NvNqmteG7uqv7MIP+MJybSuzwTGXe7b3GFKpiz3YhUaILJVvcd75b85/YeI8FtOg
|
||||
SpsYIe4aFpkuTc1MTOVPb7XYIuUREePW4BPBfIQ7m9vFfMOWQASLa1o8qjks3d77
|
||||
il7KUrLifDWaNVU1dx1ybQNDEihvwqkqhwUu8ee+n1uYBvmO7O+UpaAHWTJ8bwMt
|
||||
ba9mpV6bAgMBAAECggEAM+m2n64SWPGzzyNihBNybmi2CUR/BaUyUTrIaAg1N37w
|
||||
tbYrN0tfUVcK+QFhW4eFHpHSqBXWeOEyGg2D+CkfzLZ1QJ8NYw8wrutknwyO25nB
|
||||
DBOFTaGMXYaPoZNDiCdZsLkUKL3eBBYVeuCVSzSR+FgA1hgIBT/qn3fE3Okdcg1F
|
||||
6jx4Xf+koBC4i6bbGL8HekCS33tDacUAVxgHYmSk+Q224Zitp+j77eI6EXOVIbS9
|
||||
+svDwyvgzssR9S3a1rQZRsaB3vZ9QvQ96t4SOOqHOjUbfIQc8YyWLbtSihAMtLY2
|
||||
HSUP0eBUII/HslfioxQ30/WR9Pxcy+cTXgxDtYRfGQKBgQD0WGqUHuuDcShWliZD
|
||||
wyHSsUWXkLkXFsw/PHl/0HFbuXKZw8L5E9Dan6Hg5OvyrdgK7hf+DgQWrVSZlG9a
|
||||
KAFA+I4fD6jyCYekdECHYzA3LN1jRyw9aJrlmdl/euU+U6D55Wrp+Xd4zfk5hFi2
|
||||
yJYeqjwM/28yCJQzp7wobZyMDwKBgQDyRLdWn4DVQaJ9fAf584tb95G0gQolYRqW
|
||||
9qDHlKo7YoZ0UYv5FIIrUDDNLZQyy7rjVvXNF/55g9c6HSaJWWJYsLVOJoshfrpi
|
||||
AZccg6O5jVoZO/QIDzr7IiIHrnLY8M7dncHxOYwTk6Za1Qg3jXrVtwHSdclu/Mqo
|
||||
vIakOawotQKBgQCKRRZap3yirwAir2kL43paXhKBiFYVKMN/7Vrb5zqeqzycotjM
|
||||
VlhTvw291A1pENM2rDFLhObvZjp/hi3VGNpMx9q03Qm/nYDyoQ57DrgUIQFO0tHI
|
||||
Fk/BKeSYbRUYxf5MK3Tq3k6rP/OOhsQk+zFoPPEqccmcyJoE+SBSyGRUJQKBgHNi
|
||||
UONbsjNfQDF9mhrsaGoTvfx3HMrytYRC0A5d+rmv0hOiJwUpRFm2ppeB5rxOlaLi
|
||||
7syQae2b4izWZ10xCgrtllwzNT5tqf01fq/g7mBYNxofmLkh79hdyFFaP26dOhkI
|
||||
oq7t1o4YWzmVjoVOx7rzn1WKLbbDhQ3aRFIA+cKlAoGBALqG/Xb+12TbEXxB4gQb
|
||||
q1VjLFsuoY9OWXs54fhcLm281ODwcS+lrK4hJ7xonZQamvIZamCUPs9V1T869vnM
|
||||
AIwff/dXLXvhh5++Xqjx6/hQ1Zbv7vGZ+nP/ornfDKk5iYAT9o+CxkedhBIoM20Y
|
||||
Pd4dLQQnHo3wuOnXrylG0LSS
|
||||
-----END PRIVATE KEY-----
|
||||
678
utils.py
Normal file
678
utils.py
Normal file
@ -0,0 +1,678 @@
|
||||
import requests, time, json, uuid, datetime
|
||||
from config import *
|
||||
from dateutil.relativedelta import relativedelta
|
||||
import threading
|
||||
import urllib3
|
||||
from Crypto.Cipher import AES
|
||||
from base64 import b64encode, b64decode
|
||||
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
|
||||
def format_uct(origin_date_str):
|
||||
origin_date_str = origin_date_str.split('.')[0]
|
||||
utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%S")
|
||||
local_date = utc_date + datetime.timedelta(hours=8)
|
||||
local_date_str = datetime.datetime.strftime(local_date, '%Y-%m-%d %H:%M:%S')
|
||||
return local_date_str
|
||||
|
||||
|
||||
def filter_jdy_ht(id):
|
||||
"""筛选简道云合同表单中驾驶员对应信息"""
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
filter_data = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": ht_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "shfzhh",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
ht_detail = turn_page(url, filter_data)
|
||||
if not ht_detail:
|
||||
return []
|
||||
ht_detail = ht_detail[0]
|
||||
# 机构
|
||||
jg = ht_detail['jg']
|
||||
# 分司
|
||||
fs = ht_detail['fs']
|
||||
# 商户号
|
||||
sh = ht_detail['sh']
|
||||
# 商户号证书
|
||||
shzs = ht_detail['shxl']
|
||||
# 姓名
|
||||
name = ht_detail['name']
|
||||
# 车牌号
|
||||
hphm = ht_detail['hphm']
|
||||
# 分司负责人
|
||||
fsfz = ht_detail['fsfz']['dept_no'] if ht_detail['fsfz'] else ""
|
||||
#准营证号码
|
||||
zhunyingzhenghaoma = ht_detail['zhunyingzhenghaoma']
|
||||
#管理部门
|
||||
guanlibumen = ht_detail['guanlibumen']
|
||||
#管理部门负责人
|
||||
guanlibumenfuzeren = ht_detail['guanlibumenfuzeren']['dept_no'] if ht_detail['guanlibumenfuzeren'] else ""
|
||||
return [jg, fs, sh, shzs, name, hphm, fsfz,zhunyingzhenghaoma,guanlibumen,guanlibumenfuzeren]
|
||||
|
||||
|
||||
def queryUser(id):
|
||||
# 查询充值明细
|
||||
# user = get_user_info(id)
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
filter_data = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": pay_details_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "pay_type",
|
||||
"method": "eq",
|
||||
"value": ["微信支付"]
|
||||
},
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
pay_detail = turn_page(url, filter_data)
|
||||
for i in pay_detail:
|
||||
i['time'] = format_uct(i['time'])
|
||||
# 查询个人余额
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"filter": {"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
{
|
||||
"field": "date",
|
||||
"method": "empty",
|
||||
|
||||
}
|
||||
]}
|
||||
}
|
||||
# 查询个人余额账户表 没有新增,有更新
|
||||
res = req_tool_jdy(url, info)
|
||||
balance = 0
|
||||
if res['data']:
|
||||
balance = res['data'][0]['balance']
|
||||
balance = float("%.2f" % balance)
|
||||
return {"balance": balance, "pay_detail": pay_detail}
|
||||
|
||||
|
||||
def get_last_8_hour():
|
||||
_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time() - 8 * 60 * 60))
|
||||
return _time
|
||||
|
||||
|
||||
def turn_page(url, data):
|
||||
"""翻页查询"""
|
||||
info = []
|
||||
while 1:
|
||||
try:
|
||||
res = req_tool_jdy(url, data)
|
||||
info += res['data']
|
||||
if len(res['data']) < 100:
|
||||
return info
|
||||
data["data_id"] = res["data"][-1]["_id"]
|
||||
except Exception as e:
|
||||
print("turn_page", e, res)
|
||||
|
||||
|
||||
def get_user_info(id, type=None):
|
||||
"""获取用户信息"""
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
if type:
|
||||
filter_data = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": fu_id,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
else:
|
||||
filter_data = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": fu_id,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "user",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
res = req_tool_jdy(url, filter_data)
|
||||
if res['data']:
|
||||
return res['data'][0]
|
||||
return ''
|
||||
|
||||
|
||||
def query_pay_details(id):
|
||||
# 查询某人未收付明细
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
filter_data = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": uncollected_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "sijishenfenzhenghao",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
{
|
||||
"field": "unpay",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
uncollected_data = turn_page(url, filter_data)
|
||||
#按业务编码后13位数字添加排序号
|
||||
def extract_and_sort(code):
|
||||
extracted = int(code[-13:])
|
||||
return extracted
|
||||
_data = []
|
||||
for i in uncollected_data:
|
||||
# flag = False
|
||||
# for j in ["承包金", "调度费", "保养费", "社保个人费额"]:
|
||||
# if j == i['fukuanshiyou']:
|
||||
# flag = True
|
||||
# break
|
||||
# if not flag:
|
||||
# continue
|
||||
|
||||
# flag = False
|
||||
# if "预收承包金" not in i['fukuanshiyou'] and i['type'] == "收款" and "违约金" not in i['fukuanshiyou'] and "维修费" not in i['fukuanshiyou']:
|
||||
# flag = True
|
||||
# if not flag:
|
||||
# continue
|
||||
if any(j in i['fukuanshiyou'] for j in ["预收承包金", "违约金", "维修费","交通违法赔偿金","营运违法赔偿金","退还奖励"]) or i['type'] != "收款":
|
||||
continue
|
||||
i['jine'] = float("%.2f" % i['jine']) if i['jine'] else 0
|
||||
i['pay'] = float("%.2f" % i['pay']) if i['pay'] != None and i['pay'] != '' else 0
|
||||
i['unpay'] = float("%.2f" % i['unpay']) if i['unpay'] != None and i['unpay'] != '' else 0
|
||||
i['sort'] = 9999
|
||||
# for j in rule_sort:
|
||||
# if j in i['fukuanshiyou']:
|
||||
i['sort'] = extract_and_sort(i['code'])
|
||||
_data.append(i)
|
||||
uncollected_data = _data
|
||||
# uncollected_data = sorted(uncollected_data, key=lambda x: x['createTime'], reverse=True)
|
||||
uncollected_data = sorted(uncollected_data, key=lambda x: x['sort'], reverse=False)
|
||||
# 过滤已结清数据
|
||||
uncollected_data = [i for i in uncollected_data if i['jine'] != i['pay']]
|
||||
undata = {}
|
||||
# 按月份归类 uncollected_data
|
||||
for un in uncollected_data:
|
||||
if un['yuefen'] in undata.keys():
|
||||
undata[un['yuefen']]['data'].append(un)
|
||||
else:
|
||||
undata[un['yuefen']] = {"data": []}
|
||||
undata[un['yuefen']]['data'] = [un]
|
||||
# 按月查询增减项 flowState结束
|
||||
amount = 0
|
||||
for un in undata:
|
||||
_th_amount = 0
|
||||
del_list = []
|
||||
filter_data = {
|
||||
"app_id": hz_app,
|
||||
"entry_id": hz_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
{
|
||||
"field": "month",
|
||||
"method": "eq",
|
||||
"value": [un]
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
hz_data_list = turn_page(url, filter_data)
|
||||
# 应付总额 承包金定额=应收承包金-增减项
|
||||
zj_sum = sum(item['jine'] for item in hz_data_list)
|
||||
for index, j in enumerate(undata[un]['data']):
|
||||
j['unpay'] = j['unpay'] if j['unpay'] else j['jine']
|
||||
|
||||
if '承包金' in j['fukuanshiyou'] and j['yewubiaodanmingcheng'] == '费税计划':
|
||||
if j['pay'] - zj_sum == j['jine']:
|
||||
del_list.append(index)
|
||||
continue
|
||||
# 定额 de = 表单中的金额-增减
|
||||
# 应付金额 jine = 表单中的金额
|
||||
# 未付金额 unpay = 应付金额-增减-已付金额
|
||||
j['pay'] = j['pay'] if j['pay'] else 0
|
||||
|
||||
undata[un]['de'] = j['jine'] - zj_sum
|
||||
# j['jine'] = undata[un]['de'] + zj_sum
|
||||
j['unpay'] = j['jine'] - j['pay']
|
||||
amount += j['unpay'] if j['unpay'] else j['jine']
|
||||
_th_amount += j['unpay'] if j['unpay'] else j['jine']
|
||||
undata[un]['_th_amount'] = _th_amount
|
||||
undata[un]['hz'] = hz_data_list
|
||||
for d in del_list:
|
||||
undata[un]['data'].pop(d)
|
||||
undata['amount'] = float("%.2f" % amount)
|
||||
for i in list(undata.keys()):
|
||||
if i != 'amount' and not undata[i]['data']:
|
||||
del undata[i]
|
||||
return undata
|
||||
|
||||
|
||||
def req_tool_jdy(url, data):
|
||||
headers = {"Authorization": f"Bearer {apikey}"}
|
||||
while 1:
|
||||
try:
|
||||
res = requests.post(url, headers=headers, json=data, timeout=10, verify=False).json()
|
||||
if "code" in res.keys():
|
||||
print("req_tool_jdy", res)
|
||||
time.sleep(2)
|
||||
continue
|
||||
return res
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
def req_tool_vx(url, data=None, flag=None):
|
||||
while 1:
|
||||
try:
|
||||
if not flag:
|
||||
res = requests.post(url, json=data, timeout=10, verify=False).json()
|
||||
else:
|
||||
res = requests.get(url, timeout=10, verify=False).json()
|
||||
return res
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
def update_unpay(data):
|
||||
"""更新未收付,添加已收付明细"""
|
||||
url = f'{base_path}/api/v5/app/entry/data/update'
|
||||
add_url = f'{base_path}/api/v5/app/entry/data/create'
|
||||
del_url = f'{base_path}/api/v1/app/{pay_app}/entry/{uncollected_id}/data_delete'
|
||||
for i in data:
|
||||
if 'amount' == i:
|
||||
continue
|
||||
for j in data[i]['data']:
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": uncollected_id,
|
||||
"data_id": j['_id'],
|
||||
"is_start_trigger": True,
|
||||
"is_start_workflow": True,
|
||||
"data": {
|
||||
"pay": {"value": j['pay']},
|
||||
"unpay": {"value": j['unpay']},
|
||||
}
|
||||
}
|
||||
req_tool_jdy(url, info)
|
||||
# 新增已收付明细
|
||||
if 'flag' in j.keys() and float(j['flag_m']):
|
||||
if not j['flag_m'] or not float(j['flag_m']):
|
||||
continue
|
||||
fs_p = j['fs_p']['dept_no'] if j['fs_p'] else ""
|
||||
add_info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": received_id,
|
||||
"is_start_trigger": True,
|
||||
"is_start_workflow": True,
|
||||
"data": {
|
||||
"code": {"value": j['code']}, "type": {"value": "收款"},
|
||||
"fukuanshiyou": {"value": j['fukuanshiyou']}, "month": {"value": j['yuefen']},
|
||||
"yewubiaodanmingcheng": {"value": j['yewubiaodanmingcheng']},
|
||||
"yewubiaodanbianma": {"value": j['yewubiaodanbianma']},
|
||||
"sijixingming": {"value": j['sijixingming']},
|
||||
"sijishenfenzhenghao": {"value": j['sijishenfenzhenghao']},
|
||||
"company_jc": {"value": j['company_jc']}, "xd": {"value": j['xd']},
|
||||
"sijisuozaigongsi": {"value": j['sijisuozaigongsi']}, "fs": {"value": j['fs']},
|
||||
"license_plate": {"value": j['license_plate']}, "jine": {"value": j['jine']},
|
||||
"pay": {"value": j['flag_m']}, "hz_month": {"value": j['hz_month']},
|
||||
"fs_p": {"value": fs_p}, "bj": {"value": j['bj']}, "status1": {"value": "已清缴"},
|
||||
"sy": {"value": "个人账户抵扣"}, "status": {"value": "已收款"},
|
||||
"ys": {"value": j['ys']},
|
||||
"zhunyingzhenghaoma": {"value": j['zhunyingzhenghaoma']},
|
||||
"guanlibumen": {"value": j['guanlibumen']},
|
||||
"guanlibumenfuzeren": {"value": j['guanlibumenfuzeren']['dept_no'] if j['guanlibumenfuzeren'] else ""},
|
||||
}
|
||||
}
|
||||
req_tool_jdy(add_url, add_info)
|
||||
print("shachu=========", j['pay'], j['jine'])
|
||||
if j['sijixingming'] == '姓名':
|
||||
print(j)
|
||||
if j['pay'] == j['jine']:
|
||||
# 未收付已清缴,删除未收付明细
|
||||
j['sy'] = "个人账户抵扣"
|
||||
del_info = {
|
||||
"data_id": j["_id"],
|
||||
"is_start_trigger": True
|
||||
}
|
||||
req_tool_jdy(del_url, del_info)
|
||||
|
||||
|
||||
def update_info(cz, _balcace, balance, user_info):
|
||||
# 余额 = 累计充值金额-累计抵扣金额
|
||||
# 本次抵扣=本次充值+本次余额-剩余金额
|
||||
di = cz + balance - _balcace
|
||||
"""更新个人账户余额"""
|
||||
# if pay_amount:
|
||||
# # 支付完有剩余余额可直接更新
|
||||
# amount = pay_amount
|
||||
# else:
|
||||
# # 查询未收付历史数据
|
||||
# details = query_pay_details(user_info['user']['username'])
|
||||
# amount = details['amount']
|
||||
# amount *= -1
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"filter": {"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [user_info['id']]
|
||||
},
|
||||
{
|
||||
"field": "date",
|
||||
"method": "empty"
|
||||
},
|
||||
]}
|
||||
}
|
||||
# 查询个人余额账户表 没有新增,有更新
|
||||
res = req_tool_jdy(url, info)
|
||||
if res['data']:
|
||||
# 更新
|
||||
url = f'{base_path}/api/v5/app/entry/data/update'
|
||||
pay = res['data'][-1]['pay'] + cz
|
||||
di = di + (res['data'][-1]['deduction'] if res['data'][-1]['deduction'] else 0)
|
||||
amount = pay - di # 累计充值-累计抵扣
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"data_id": res['data'][-1]["_id"],
|
||||
"is_start_workflow": True,
|
||||
"is_start_trigger": True,
|
||||
"data": {
|
||||
"pay": {"value": pay}, "balance": {"value": amount},
|
||||
"deduction": {"value": di}
|
||||
}
|
||||
}
|
||||
else:
|
||||
# 新增
|
||||
amount = cz - di # 本次充值-本次抵扣
|
||||
if 'name' in user_info.keys():
|
||||
name = user_info['name']
|
||||
else:
|
||||
name = ""
|
||||
url = f'{base_path}/api/v5/app/entry/data/create'
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"is_start_workflow": True,
|
||||
"is_start_trigger": True,
|
||||
"data": {
|
||||
"id_card": {"value": user_info['id']},
|
||||
"name": {"value": name},
|
||||
"pay": {"value": cz},
|
||||
"deduction": {"value": di},
|
||||
"balance": {"value": amount},
|
||||
"jg": {"value": user_info['jg']},
|
||||
"fs": {"value": user_info['fs']},
|
||||
"fsfz": {"value": user_info['fsfz']},
|
||||
"hphm": {"value": user_info['hphm']},
|
||||
"zhunyingzhenghaoma": {"value": user_info['zhunyingzhenghaoma']},
|
||||
"guanlibumen": {"value": user_info['guanlibumen']},
|
||||
"guanlibumenfuzeren": {"value": user_info['guanlibumenfuzeren']}
|
||||
}
|
||||
}
|
||||
req_tool_jdy(url, info)
|
||||
|
||||
|
||||
def add_payment(data, type=None):
|
||||
lock.acquire()
|
||||
print("开始========", data)
|
||||
print(data, type)
|
||||
# user = get_user_info(data['id'])
|
||||
# 充值成功后 回写充值明细
|
||||
now_month = datetime.datetime.now().strftime("%Y-%m")
|
||||
now_time = get_last_8_hour()
|
||||
url = f'{base_path}/api/v5/app/entry/data/create'
|
||||
if not type:
|
||||
info = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": pay_details_id,
|
||||
"is_start_workflow": True,
|
||||
"is_start_trigger": True,
|
||||
"data": {
|
||||
"id_card": {"value": data['id']}, "name": {"value": data['name']},
|
||||
"price": {"value": data['pay_amount']}, "pay_type": {"value": "微信支付"},
|
||||
"coll_type": {"value": "网银"}, "month": {"value": now_month},
|
||||
"jg": {"value": data['jg']}, "fs": {"value": data['fs']},
|
||||
"hphm": {"value": data['hphm']},
|
||||
"time": {"value": now_time}, "transactionid": {"value": data['transaction_id']},
|
||||
"zhunyingzhenghaoma": {"value": data['zhunyingzhenghaoma']},
|
||||
"guanlibumen": {"value": data['guanlibumen']}
|
||||
}
|
||||
}
|
||||
if data['fsfz']:
|
||||
info['data']["fsfz"] = {"value": data['fsfz']}
|
||||
if data['guanlibumenfuzeren']:
|
||||
info['data']["guanlibumenfuzeren"] = {"value": data['guanlibumenfuzeren']}
|
||||
req_tool_jdy(url, info)
|
||||
details = query_pay_details(data['id'])
|
||||
dates = list(details.keys())
|
||||
dates.sort()
|
||||
dates.remove('amount')
|
||||
pay_amount = data['pay_amount']
|
||||
# 查询余额
|
||||
balance = queryUser(data['id'])
|
||||
pay_amount += balance['balance']
|
||||
if pay_amount <= 0:
|
||||
print("余额为0结束========", data)
|
||||
lock.release()
|
||||
return
|
||||
print("执行add_payment", data)
|
||||
next_month = (datetime.datetime.now().date() - relativedelta(months=-1)).strftime("%Y-%m")
|
||||
if now_month in dates:
|
||||
_tmp = details[now_month]['data']
|
||||
_tmp = sorted(_tmp, key=lambda x: x['sort'])
|
||||
for i in _tmp:
|
||||
if pay_amount:
|
||||
i['flag'] = 1
|
||||
if '承包金' in i['fukuanshiyou']:
|
||||
# 承包金实际需要缴纳的
|
||||
if pay_amount < i['jine'] - i['pay']:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= (i['jine'] - i['pay'])
|
||||
i['flag_m'] = (i['jine'] - i['pay'])
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
|
||||
else:
|
||||
if i['jine'] != i['pay']:
|
||||
# 根据未支付的金额,扣除总金额
|
||||
df = i['jine'] - i['pay']
|
||||
if pay_amount < df:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= df
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
i['flag_m'] = df
|
||||
for i in dates:
|
||||
if i == next_month or i == now_month:
|
||||
continue
|
||||
_tmp = details[i]['data']
|
||||
_tmp = sorted(_tmp, key=lambda x: x['sort'])
|
||||
for i in _tmp:
|
||||
if pay_amount:
|
||||
i['flag'] = 1
|
||||
if '承包金' in i['fukuanshiyou']:
|
||||
# 承包金实际需要缴纳的
|
||||
if pay_amount < i['jine'] - i['pay']:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
|
||||
else:
|
||||
pay_amount -= (i['jine'] - i['pay'])
|
||||
i['flag_m'] = (i['jine'] - i['pay'])
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
|
||||
else:
|
||||
if i['jine'] != i['pay']:
|
||||
# 根据未支付的金额,扣除总金额
|
||||
df = i['jine'] - i['pay']
|
||||
if pay_amount < df:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
|
||||
else:
|
||||
pay_amount -= df
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
i['flag_m'] = df
|
||||
# 根据抵扣规则,更新未支付的数据,将清缴数据新增至已收付明细
|
||||
if next_month in dates:
|
||||
_tmp = details[next_month]['data']
|
||||
_tmp = sorted(_tmp, key=lambda x: x['sort'])
|
||||
for i in _tmp:
|
||||
if pay_amount:
|
||||
i['flag'] = 1
|
||||
if '承包金' in i['fukuanshiyou']:
|
||||
# 承包金实际需要缴纳的
|
||||
if pay_amount < i['jine'] - i['pay']:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= (i['jine'] - i['pay'])
|
||||
i['flag_m'] = (i['jine'] - i['pay'])
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
|
||||
else:
|
||||
if i['jine'] != i['pay']:
|
||||
# 根据未支付的金额,扣除总金额
|
||||
df = i['jine'] - i['pay']
|
||||
if pay_amount < df:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= df
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
i['flag_m'] = df
|
||||
print("更新未收付", details)
|
||||
update_unpay(details)
|
||||
# 未收付更新完后,更新个人账户余额update_info
|
||||
print("更新个人账户余额update_info")
|
||||
update_info(data['pay_amount'], pay_amount, balance['balance'], data)
|
||||
lock.release()
|
||||
print("结束========")
|
||||
|
||||
|
||||
def decode_notify_data(res_json):
|
||||
try:
|
||||
ciphertext = res_json['resource']['ciphertext']
|
||||
nonce = res_json['resource']['nonce']
|
||||
associated_data = res_json['resource']['associated_data']
|
||||
cipher = AES.new(v3_SECRET.encode(), AES.MODE_GCM, nonce=nonce.encode())
|
||||
cipher.update(associated_data.encode())
|
||||
en_data = b64decode(ciphertext.encode('utf-8'))
|
||||
auth_tag = en_data[-16:]
|
||||
_en_data = en_data[:-16]
|
||||
plaintext = cipher.decrypt_and_verify(_en_data, auth_tag)
|
||||
decodejson = json.loads(plaintext.decode())
|
||||
except Exception as e:
|
||||
print(f"解密回调失败:{e}")
|
||||
return None
|
||||
return decodejson
|
||||
|
||||
|
||||
def get_wx_token():
|
||||
url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={SECRET}'
|
||||
res = req_tool_vx(url, flag=1)
|
||||
return res['access_token']
|
||||
|
||||
|
||||
def query_wx_fj_info(id):
|
||||
"""查询企微中的附加信息"""
|
||||
token = get_wx_token()
|
||||
url = f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={token}&userid={id}'
|
||||
res = req_tool_vx(url, flag=1)
|
||||
val = ""
|
||||
print("query_wx_fj_info", res, id)
|
||||
for i in res['extattr']['attrs']:
|
||||
if i['name'] == '附加信息':
|
||||
val = i['value']
|
||||
return val
|
||||
|
||||
|
||||
def query_wx_userid(code):
|
||||
"""查询企微中的userid"""
|
||||
token = get_wx_token()
|
||||
url = f'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token={token}&code={code}'
|
||||
res = req_tool_vx(url, flag=1)
|
||||
return res['userid']
|
||||
663
utilsback.py
Normal file
663
utilsback.py
Normal file
@ -0,0 +1,663 @@
|
||||
import requests, time, json, uuid, datetime
|
||||
from config import *
|
||||
from dateutil.relativedelta import relativedelta
|
||||
import threading
|
||||
import urllib3
|
||||
import json
|
||||
from Crypto.Cipher import AES
|
||||
from base64 import b64encode, b64decode
|
||||
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
lock = threading.Lock()
|
||||
|
||||
|
||||
def format_uct(origin_date_str):
|
||||
origin_date_str = origin_date_str.split('.')[0]
|
||||
utc_date = datetime.datetime.strptime(origin_date_str, "%Y-%m-%dT%H:%M:%S")
|
||||
local_date = utc_date + datetime.timedelta(hours=8)
|
||||
local_date_str = datetime.datetime.strftime(local_date, '%Y-%m-%d %H:%M:%S')
|
||||
return local_date_str
|
||||
|
||||
|
||||
def filter_jdy_ht(id):
|
||||
"""筛选简道云合同表单中驾驶员对应信息"""
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
filter_data = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": ht_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "shfzhh",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
ht_detail = turn_page(url, filter_data)
|
||||
if not ht_detail:
|
||||
return []
|
||||
ht_detail = ht_detail[0]
|
||||
# 机构
|
||||
jg = ht_detail['jg']
|
||||
# 分司
|
||||
fs = ht_detail['fs']
|
||||
# 商户号
|
||||
sh = ht_detail['sh']
|
||||
# 商户号证书
|
||||
shzs = ht_detail['shxl']
|
||||
# 姓名
|
||||
name = ht_detail['name']
|
||||
# 车牌号
|
||||
hphm = ht_detail['hphm']
|
||||
# 分司负责人
|
||||
fsfz = ht_detail['fsfz']['dept_no'] if ht_detail['fsfz'] else ""
|
||||
return [jg, fs, sh, shzs, name, hphm, fsfz]
|
||||
|
||||
|
||||
def queryUser(id):
|
||||
# 查询充值明细
|
||||
# user = get_user_info(id)
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
filter_data = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": pay_details_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "pay_type",
|
||||
"method": "eq",
|
||||
"value": ["微信支付"]
|
||||
},
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
pay_detail = turn_page(url, filter_data)
|
||||
for i in pay_detail:
|
||||
i['time'] = format_uct(i['time'])
|
||||
# 查询个人余额
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"filter": {"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
{
|
||||
"field": "date",
|
||||
"method": "empty",
|
||||
|
||||
}
|
||||
]}
|
||||
}
|
||||
# 查询个人余额账户表 没有新增,有更新
|
||||
res = req_tool_jdy(url, info)
|
||||
balance = 0
|
||||
if res['data']:
|
||||
balance = res['data'][0]['balance']
|
||||
balance = float("%.2f" % balance)
|
||||
return {"balance": balance, "pay_detail": pay_detail}
|
||||
|
||||
|
||||
def get_last_8_hour():
|
||||
_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time() - 8 * 60 * 60))
|
||||
return _time
|
||||
|
||||
|
||||
def turn_page(url, data):
|
||||
"""翻页查询"""
|
||||
info = []
|
||||
while 1:
|
||||
try:
|
||||
res = req_tool_jdy(url, data)
|
||||
info += res['data']
|
||||
if len(res['data']) < 100:
|
||||
return info
|
||||
data["data_id"] = res["data"][-1]["_id"]
|
||||
except Exception as e:
|
||||
print("turn_page", e, res)
|
||||
|
||||
|
||||
def get_user_info(id, type=None):
|
||||
"""获取用户信息"""
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
if type:
|
||||
filter_data = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": fu_id,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
else:
|
||||
filter_data = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": fu_id,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "user",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
res = req_tool_jdy(url, filter_data)
|
||||
if res['data']:
|
||||
return res['data'][0]
|
||||
return ''
|
||||
|
||||
|
||||
def query_pay_details(id):
|
||||
# 查询某人未收付明细
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
filter_data = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": uncollected_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "sijishenfenzhenghao",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
{
|
||||
"field": "unpay",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
uncollected_data = turn_page(url, filter_data)
|
||||
#按业务编码后13位数字添加排序号
|
||||
def extract_and_sort(code):
|
||||
extracted = int(code[-13:])
|
||||
return extracted
|
||||
_data = []
|
||||
for i in uncollected_data:
|
||||
# flag = False
|
||||
# for j in ["承包金", "调度费", "保养费", "社保个人费额"]:
|
||||
# if j == i['fukuanshiyou']:
|
||||
# flag = True
|
||||
# break
|
||||
# if not flag:
|
||||
# continue
|
||||
i['jine'] = float("%.2f" % i['jine']) if i['jine'] else 0
|
||||
i['pay'] = float("%.2f" % i['pay']) if i['pay'] != None and i['pay'] != '' else 0
|
||||
i['unpay'] = float("%.2f" % i['unpay']) if i['unpay'] != None and i['unpay'] != '' else 0
|
||||
i['sort'] = 9999
|
||||
# for j in rule_sort:
|
||||
# if j in i['fukuanshiyou']:
|
||||
i['sort'] = extract_and_sort(i['code'])
|
||||
_data.append(i)
|
||||
uncollected_data = _data
|
||||
# uncollected_data = sorted(uncollected_data, key=lambda x: x['createTime'], reverse=True)
|
||||
uncollected_data = sorted(uncollected_data, key=lambda x: x['sort'], reverse=False)
|
||||
# 过滤已结清数据
|
||||
uncollected_data = [i for i in uncollected_data if i['jine'] != i['pay']]
|
||||
undata = {}
|
||||
# 按月份归类 uncollected_data
|
||||
for un in uncollected_data:
|
||||
if un['yuefen'] in undata.keys():
|
||||
undata[un['yuefen']]['data'].append(un)
|
||||
else:
|
||||
undata[un['yuefen']] = {"data": []}
|
||||
undata[un['yuefen']]['data'] = [un]
|
||||
# 按月查询增减项 flowState结束
|
||||
amount = 0
|
||||
for un in undata:
|
||||
_th_amount = 0
|
||||
del_list = []
|
||||
filter_data = {
|
||||
"app_id": hz_app,
|
||||
"entry_id": hz_id,
|
||||
"limit": 100,
|
||||
"filter": {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [id]
|
||||
},
|
||||
{
|
||||
"field": "month",
|
||||
"method": "eq",
|
||||
"value": [un]
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
hz_data_list = turn_page(url, filter_data)
|
||||
# 应付总额 承包金定额=应收承包金-增减项
|
||||
zj_sum = sum(item['jine'] for item in hz_data_list)
|
||||
for index, j in enumerate(undata[un]['data']):
|
||||
j['unpay'] = j['unpay'] if j['unpay'] else j['jine']
|
||||
|
||||
if '承包金' in j['fukuanshiyou'] and j['yewubiaodanmingcheng'] == '费税计划':
|
||||
if j['pay'] - zj_sum == j['jine']:
|
||||
del_list.append(index)
|
||||
continue
|
||||
# 定额 de = 表单中的金额-增减
|
||||
# 应付金额 jine = 表单中的金额
|
||||
# 未付金额 unpay = 应付金额-增减-已付金额
|
||||
j['pay'] = j['pay'] if j['pay'] else 0
|
||||
|
||||
undata[un]['de'] = j['jine'] - zj_sum
|
||||
# j['jine'] = undata[un]['de'] + zj_sum
|
||||
j['unpay'] = j['jine'] - j['pay']
|
||||
amount += j['unpay'] if j['unpay'] else j['jine']
|
||||
_th_amount += j['unpay'] if j['unpay'] else j['jine']
|
||||
undata[un]['_th_amount'] = _th_amount
|
||||
undata[un]['hz'] = hz_data_list
|
||||
for d in del_list:
|
||||
undata[un]['data'].pop(d)
|
||||
undata['amount'] = float("%.2f" % amount)
|
||||
for i in list(undata.keys()):
|
||||
if i != 'amount' and not undata[i]['data']:
|
||||
del undata[i]
|
||||
return undata
|
||||
|
||||
|
||||
def req_tool_jdy(url, data):
|
||||
headers = {"Authorization": f"Bearer {apikey}"}
|
||||
while 1:
|
||||
try:
|
||||
res = requests.post(url, headers=headers, json=data, timeout=10, verify=False).json()
|
||||
if "code" in res.keys():
|
||||
print("req_tool_jdy", res)
|
||||
time.sleep(2)
|
||||
continue
|
||||
return res
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
def req_tool_vx(url, data=None, flag=None):
|
||||
while 1:
|
||||
try:
|
||||
if not flag:
|
||||
res = requests.post(url, json=data, timeout=10, verify=False).json()
|
||||
else:
|
||||
res = requests.get(url, timeout=10, verify=False).json()
|
||||
return res
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
def update_unpay(data):
|
||||
"""更新未收付,添加已收付明细"""
|
||||
url = f'{base_path}/api/v5/app/entry/data/update'
|
||||
add_url = f'{base_path}/api/v5/app/entry/data/create'
|
||||
del_url = f'{base_path}/api/v1/app/{pay_app}/entry/{uncollected_id}/data_delete'
|
||||
for i in data:
|
||||
if 'amount' == i:
|
||||
continue
|
||||
for j in data[i]['data']:
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": uncollected_id,
|
||||
"data_id": j['_id'],
|
||||
"is_start_trigger": True,
|
||||
"is_start_workflow": True,
|
||||
"data": {
|
||||
"pay": {"value": j['pay']},
|
||||
"unpay": {"value": j['unpay']},
|
||||
}
|
||||
}
|
||||
req_tool_jdy(url, info)
|
||||
# 新增已收付明细
|
||||
if 'flag' in j.keys() and float(j['flag_m']):
|
||||
if not j['flag_m'] or not float(j['flag_m']):
|
||||
continue
|
||||
fs_p = j['fs_p']['dept_no'] if j['fs_p'] else ""
|
||||
add_info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": received_id,
|
||||
"is_start_trigger": True,
|
||||
"is_start_workflow": True,
|
||||
"data": {
|
||||
"code": {"value": j['code']}, "type": {"value": "收款"},
|
||||
"fukuanshiyou": {"value": j['fukuanshiyou']}, "month": {"value": j['yuefen']},
|
||||
"yewubiaodanmingcheng": {"value": j['yewubiaodanmingcheng']},
|
||||
"yewubiaodanbianma": {"value": j['yewubiaodanbianma']},
|
||||
"sijixingming": {"value": j['sijixingming']},
|
||||
"sijishenfenzhenghao": {"value": j['sijishenfenzhenghao']},
|
||||
"company_jc": {"value": j['company_jc']}, "xd": {"value": j['xd']},
|
||||
"sijisuozaigongsi": {"value": j['sijisuozaigongsi']}, "fs": {"value": j['fs']},
|
||||
"license_plate": {"value": j['license_plate']}, "jine": {"value": j['jine']},
|
||||
"pay": {"value": j['flag_m']}, "hz_month": {"value": j['hz_month']},
|
||||
"fs_p": {"value": fs_p}, "bj": {"value": j['bj']}, "status1": {"value": "已清缴"},
|
||||
"sy": {"value": "个人账户抵扣"}, "status": {"value": "已收款"},
|
||||
"ys": {"value": j['ys']},
|
||||
"zhunyingzhenghaoma": {"value": j['zhunyingzhenghaoma']},
|
||||
"guanlibumen": {"value": j['guanlibumen']},
|
||||
"guanlibumenfuzeren": {"value": j['guanlibumenfuzeren']['dept_no'] if j['guanlibumenfuzeren'] else ""},
|
||||
}
|
||||
}
|
||||
req_tool_jdy(add_url, add_info)
|
||||
print("shanchu=========", j['pay'], j['jine'])
|
||||
if j['sijixingming'] == '姓名':
|
||||
print(j)
|
||||
if j['pay'] == j['jine']:
|
||||
# 未收付已清缴,删除未收付明细
|
||||
j['sy'] = "个人账户抵扣"
|
||||
del_info = {
|
||||
"data_id": j["_id"],
|
||||
"is_start_trigger": True
|
||||
}
|
||||
req_tool_jdy(del_url, del_info)
|
||||
|
||||
|
||||
def update_info(cz, _balcace, balance, user_info):
|
||||
# 余额 = 累计充值金额-累计抵扣金额
|
||||
# 本次抵扣=本次充值+本次余额-剩余金额
|
||||
di = cz + balance - _balcace
|
||||
"""更新个人账户余额"""
|
||||
# if pay_amount:
|
||||
# # 支付完有剩余余额可直接更新
|
||||
# amount = pay_amount
|
||||
# else:
|
||||
# # 查询未收付历史数据
|
||||
# details = query_pay_details(user_info['user']['username'])
|
||||
# amount = details['amount']
|
||||
# amount *= -1
|
||||
url = f'{base_path}/api/v5/app/entry/data/list'
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"filter": {"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "id_card",
|
||||
"method": "eq",
|
||||
"value": [user_info['id']]
|
||||
},
|
||||
{
|
||||
"field": "date",
|
||||
"method": "empty"
|
||||
},
|
||||
]}
|
||||
}
|
||||
# 查询个人余额账户表 没有新增,有更新
|
||||
res = req_tool_jdy(url, info)
|
||||
if res['data']:
|
||||
# 更新
|
||||
url = f'{base_path}/api/v5/app/entry/data/update'
|
||||
pay = res['data'][-1]['pay'] + cz
|
||||
di = di + (res['data'][-1]['deduction'] if res['data'][-1]['deduction'] else 0)
|
||||
amount = pay - di # 累计充值-累计抵扣
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"data_id": res['data'][-1]["_id"],
|
||||
"is_start_workflow": True,
|
||||
"is_start_trigger": True,
|
||||
"data": {
|
||||
"pay": {"value": pay}, "balance": {"value": amount},
|
||||
"deduction": {"value": di}
|
||||
}
|
||||
}
|
||||
else:
|
||||
# 新增
|
||||
amount = cz - di # 本次充值-本次抵扣
|
||||
if 'name' in user_info.keys():
|
||||
name = user_info['name']
|
||||
else:
|
||||
name = ""
|
||||
url = f'{base_path}/api/v5/app/entry/data/create'
|
||||
info = {
|
||||
"app_id": pay_app,
|
||||
"entry_id": accout_id,
|
||||
"is_start_workflow": True,
|
||||
"is_start_trigger": True,
|
||||
"data": {
|
||||
"id_card": {"value": user_info['id']},
|
||||
"name": {"value": name},
|
||||
"pay": {"value": cz},
|
||||
"deduction": {"value": di},
|
||||
"balance": {"value": amount},
|
||||
"jg": {"value": user_info['jg']},
|
||||
"fs": {"value": user_info['fs']},
|
||||
"fsfz": {"value": user_info['fsfz']},
|
||||
"hphm": {"value": user_info['hphm']},
|
||||
# "zhunyingzhenghaoma": {"value": user_info['zhunyingzhenghaoma']},
|
||||
# "guanlibumen": {"value": user_info['guanlibumen']},
|
||||
# "guanlibumenfuzeren": {"value": user_info['guanlibumenfuzeren']['dept_no'] if user_info['guanlibumenfuzeren'] else ""},
|
||||
}
|
||||
}
|
||||
req_tool_jdy(url, info)
|
||||
|
||||
|
||||
def add_payment(data, type=None):
|
||||
lock.acquire()
|
||||
print("开始========", data)
|
||||
print(data, type)
|
||||
# user = get_user_info(data['id'])
|
||||
# 充值成功后 回写充值明细
|
||||
now_month = datetime.datetime.now().strftime("%Y-%m")
|
||||
now_time = get_last_8_hour()
|
||||
url = f'{base_path}/api/v5/app/entry/data/create'
|
||||
if not type:
|
||||
info = {
|
||||
"app_id": fu_app,
|
||||
"entry_id": pay_details_id,
|
||||
"is_start_workflow": True,
|
||||
"is_start_trigger": True,
|
||||
"data": {
|
||||
"id_card": {"value": data['id']}, "name": {"value": data['name']},
|
||||
"price": {"value": data['pay_amount']}, "pay_type": {"value": "微信支付"},
|
||||
"coll_type": {"value": "网银"}, "month": {"value": now_month},
|
||||
"jg": {"value": data['jg']}, "fs": {"value": data['fs']},
|
||||
"hphm": {"value": data['hphm']},
|
||||
"time": {"value": now_time}, "transactionid": {"value": data['transaction_id']}
|
||||
}
|
||||
}
|
||||
if data['fsfz']:
|
||||
info['data']["fsfz"] = {"value": data['fsfz']}
|
||||
print("开始回写充值明细",'\n',url,'\n',info,'\n',"=======================================")
|
||||
req_tool_jdy(url, info)
|
||||
details = query_pay_details(data['id'])
|
||||
dates = list(details.keys())
|
||||
dates.sort()
|
||||
dates.remove('amount')
|
||||
pay_amount = data['pay_amount']
|
||||
# 查询余额
|
||||
balance = queryUser(data['id'])
|
||||
pay_amount += balance['balance']
|
||||
if pay_amount <= 0:
|
||||
print("余额为0结束========", data)
|
||||
lock.release()
|
||||
return
|
||||
print("执行add_payment", data)
|
||||
next_month = (datetime.datetime.now().date() - relativedelta(months=-1)).strftime("%Y-%m")
|
||||
if now_month in dates:
|
||||
_tmp = details[now_month]['data']
|
||||
_tmp = sorted(_tmp, key=lambda x: x['sort'])
|
||||
for i in _tmp:
|
||||
if pay_amount:
|
||||
i['flag'] = 1
|
||||
if '承包金' in i['fukuanshiyou']:
|
||||
# 承包金实际需要缴纳的
|
||||
if pay_amount < i['jine'] - i['pay']:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= (i['jine'] - i['pay'])
|
||||
i['flag_m'] = (i['jine'] - i['pay'])
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
|
||||
else:
|
||||
if i['jine'] != i['pay']:
|
||||
# 根据未支付的金额,扣除总金额
|
||||
df = i['jine'] - i['pay']
|
||||
if pay_amount < df:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= df
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
i['flag_m'] = df
|
||||
for i in dates:
|
||||
if i == next_month or i == now_month:
|
||||
continue
|
||||
_tmp = details[i]['data']
|
||||
_tmp = sorted(_tmp, key=lambda x: x['sort'])
|
||||
for i in _tmp:
|
||||
if pay_amount:
|
||||
i['flag'] = 1
|
||||
if '承包金' in i['fukuanshiyou']:
|
||||
# 承包金实际需要缴纳的
|
||||
if pay_amount < i['jine'] - i['pay']:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
|
||||
else:
|
||||
pay_amount -= (i['jine'] - i['pay'])
|
||||
i['flag_m'] = (i['jine'] - i['pay'])
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
|
||||
else:
|
||||
if i['jine'] != i['pay']:
|
||||
# 根据未支付的金额,扣除总金额
|
||||
df = i['jine'] - i['pay']
|
||||
if pay_amount < df:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
|
||||
else:
|
||||
pay_amount -= df
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
i['flag_m'] = df
|
||||
# 根据抵扣规则,更新未支付的数据,将清缴数据新增至已收付明细
|
||||
if next_month in dates:
|
||||
_tmp = details[next_month]['data']
|
||||
_tmp = sorted(_tmp, key=lambda x: x['sort'])
|
||||
for i in _tmp:
|
||||
if pay_amount:
|
||||
i['flag'] = 1
|
||||
if '承包金' in i['fukuanshiyou']:
|
||||
# 承包金实际需要缴纳的
|
||||
if pay_amount < i['jine'] - i['pay']:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= (i['jine'] - i['pay'])
|
||||
i['flag_m'] = (i['jine'] - i['pay'])
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
|
||||
else:
|
||||
if i['jine'] != i['pay']:
|
||||
# 根据未支付的金额,扣除总金额
|
||||
df = i['jine'] - i['pay']
|
||||
if pay_amount < df:
|
||||
# 修改 i['pay'] 充值金额,推送修改
|
||||
i['pay'] += pay_amount
|
||||
i['unpay'] = i['jine'] - i['pay']
|
||||
i['flag_m'] = pay_amount
|
||||
pay_amount = 0
|
||||
else:
|
||||
pay_amount -= df
|
||||
i['pay'] = i['jine']
|
||||
i['unpay'] = 0
|
||||
i['flag_m'] = df
|
||||
print("更新未收付", details)
|
||||
update_unpay(details)
|
||||
# 未收付更新完后,更新个人账户余额update_info
|
||||
print("更新个人账户余额update_info")
|
||||
print(data)
|
||||
update_info(data['pay_amount'], pay_amount, balance['balance'], data)
|
||||
lock.release()
|
||||
print("结束========")
|
||||
|
||||
|
||||
def decode_notify_data(res_json):
|
||||
try:
|
||||
ciphertext = res_json['resource']['ciphertext']
|
||||
nonce = res_json['resource']['nonce']
|
||||
associated_data = res_json['resource']['associated_data']
|
||||
cipher = AES.new(v3_SECRET.encode(), AES.MODE_GCM, nonce=nonce.encode())
|
||||
cipher.update(associated_data.encode())
|
||||
en_data = b64decode(ciphertext.encode('utf-8'))
|
||||
auth_tag = en_data[-16:]
|
||||
_en_data = en_data[:-16]
|
||||
plaintext = cipher.decrypt_and_verify(_en_data, auth_tag)
|
||||
decodejson = json.loads(plaintext.decode())
|
||||
except Exception as e:
|
||||
print(f"解密回调失败:{e}")
|
||||
return None
|
||||
return decodejson
|
||||
|
||||
|
||||
def get_wx_token():
|
||||
url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={SECRET}'
|
||||
res = req_tool_vx(url, flag=1)
|
||||
return res['access_token']
|
||||
|
||||
|
||||
def query_wx_fj_info(id):
|
||||
"""查询企微中的附加信息"""
|
||||
token = get_wx_token()
|
||||
url = f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={token}&userid={id}'
|
||||
res = req_tool_vx(url, flag=1)
|
||||
val = ""
|
||||
print("query_wx_fj_info", res, id)
|
||||
for i in res['extattr']['attrs']:
|
||||
if i['name'] == '附加信息':
|
||||
val = i['value']
|
||||
return val
|
||||
|
||||
|
||||
def query_wx_userid(code):
|
||||
"""查询企微中的userid"""
|
||||
token = get_wx_token()
|
||||
url = f'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token={token}&code={code}'
|
||||
res = req_tool_vx(url, flag=1)
|
||||
return res['userid']
|
||||
28
xny.pem
Normal file
28
xny.pem
Normal file
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQClZ5YWvIZLvEgy
|
||||
xNbH6bYeifooKmeET4hr/tL2s+65PI1Ysp6fyouSa44j/p3ZvZjx93qyT+mSJ/hd
|
||||
i5wyeAcOLUz2lzKJN12EKu7H2JTVVh1kFtmZn4q39AkbFBB6Fi7bh0E/XqXQ9nRv
|
||||
ySBBZ8zJbLgcBTFeIGiaspFbon75NkP+y+6t99WMfzWCFf8FMX9IWz/C70kW7boM
|
||||
0CLXjH9EHXJ0dJRUH1eBGFPyPF31mC7ztvk8oNp52j3JrvM8B+hj80j9gBlnIybc
|
||||
QYWrtSHqffPEi7TXzg4HpMgrdpNiJRf36jAqZY0RgcvEtr0cXf/u0LWr3/n9rtY5
|
||||
zMrLwVshAgMBAAECggEAav2OQDbCR8sKiIx6weWTQD3P6ptDSnqHrBOxMpNBH+Dj
|
||||
LTSdFo9VqOiZkP7p7CaQADQs0ZqPY1MnfJsJ9jtdlPYIiplSvx9pBk0fF3YpD7Yc
|
||||
XNnK92wTttnL6hAYeGBQ/v+GXQ9EAt7ogkZ+7s/Nz5zbmoRhYplkEGzhSXza1SgS
|
||||
E/geG7XUMq6uZv8IL6fk6TV1hoOz/A7xfi3tn5QVj6xeMhOZZiaDHIiOUG4tatzO
|
||||
UJsY6m55juKkZZqg50egYdJQ93in6XmZ3nD0E0PjhNrs9/BflATflQVkUnENVNgd
|
||||
3Znm89isAmp6GVwHKNKBzNRuN94SJhmM8l3Y7C7n4QKBgQDcC9+dzcvF6g9BUm7G
|
||||
hvX/+oobePqq6uMwYa64lV/P5a2jHX5qDU+YVVteJk3STM86vjF8qJ/6FBG12h+m
|
||||
U5ekjg7RSt2e0+GNvS2GBFTyRmfsvwGZ4Ar8HMRqgzzCJP5vaip8hSUVNzmDVl0h
|
||||
MFaCTtD4w+xNUYfqUU7LMiwCawKBgQDAbia2HMdVS7//pl5rwk1YQxPd7JAdqozM
|
||||
jFwjZrxUtvqrKgWBzjpQLp1Y+R+w2j30wZEGFg9xP/qPtl2MkgHHnoMB558+5fSe
|
||||
VrchNFjyYMxXlkuYBLsTsYyu3nJXs3rlfNdlGvzuJc01Ib12+6wFrDt674LCb3/X
|
||||
+vp53OGzowKBgBTQTrOHfsnWrOC54l6G74fp89xLYjJ+i0TNSJCPGIP6rqTqKkXv
|
||||
wmKfWEgciWnl+AgPa3DmJlOqSE6SNkIuT/6xrTcgxLu8QO5+QWsWx84u2K+tFYKv
|
||||
jXpxYibNCRc4FpUFTsV+dpZ+JcOFjMOR5ezndZ7CMXzSxG9mh3Ry53THAoGAOYg1
|
||||
Vrlf92aAbuTE0h7zlPHpHK6/n77//Z/xZDwxDnrukwIrR1XrJVHqhVFmYi+92lGN
|
||||
FG7ACzH/rbvuWDrHAXGo5Ybkm5+Q9U4jzm+iMEU0kvNCgp7Xd9nbn+St9v6YPciH
|
||||
dZkOCf2PTtVZmhtAoSmPVwAI7iz74g0NmiWp7VUCgYB2SNJHMAlPGfKTJ4fpQb/P
|
||||
mrmQnnWw9iLWHGTdT8S17am6zmnfG3WGvlcFJ6gOxa5ybzfR7zAj5XfIkauzPJQd
|
||||
H0hnWQkI5NYGEDW8HNslyRVtCTNb4cHI73OS19GCTIr90n4DS8zu6rA6kSbRwxHK
|
||||
W7+X+v0Qon7e3aPiG240Tg==
|
||||
-----END PRIVATE KEY-----
|
||||
28
yj.pem
Normal file
28
yj.pem
Normal file
@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDRm3qfuHzprVgj
|
||||
c+9/hTOUMvIelCw/FxB4GFXhbUpnpzTa0ikKU65LLwKeXTrUoskm6jjNT7pX0mhT
|
||||
vjmZeQWB+chaf8f5FuVe2VcUpeLF4yLJjBEULKgbJ0uTM4cpV+xmZZTsVjJNkAg9
|
||||
U8HP4T9Tqbar78Y9Z4uD09v5/1CpBshDBAdEw3cozISTrHEl8hyPV9C3A2kjoB0v
|
||||
mc7mueipQXQxbRr5PTge0pg7zapMrMdLF9gjezrzE6lN6wH6dvbyJT0RcVbk5SrW
|
||||
4+qhf9rBo2htbqTfpLGgL1xlaHvUFvO2I3wxS25hRFTwysEY6RKj3lUSpYxyhpYC
|
||||
88KAS1i7AgMBAAECggEAIySaTqUz7Env+SG7CfpfR32zMoVNVdacIEaUP5N/Yhma
|
||||
twV9dAnLszdSjRK8hmI0r52doG65o3fXnhLKvXyY+83RVbsO4CiClICEJSYa+2q1
|
||||
rm0Zf/RsywCvnyKIitn+/LwTV/yrum1ntECSwjPV1kUiJ3mwFyOBNL0UqLmx4GTA
|
||||
vM26ZKbjmkEwGiIU3uYcMebI4xYiDbbUTBNm3Kzjz4Ghy2NIhqYW6RP6H+HkteKS
|
||||
mGCzxC6akmf/SA8x7q3rZvL6FVwS9V0Jcrcq18SUNOJeABrpQhMvZjHIzsEEypPu
|
||||
dSropZ9xVjUAL6YO5ChLXVI5bmg0QsA20kof4BrxAQKBgQD86c7kkEBOMfen351B
|
||||
B0XRGGY84CHxrhvbowoWv/I9X43xe74d+Yu54ReoeCZYcXldkffAzvwSKfCKJyMd
|
||||
sg9t8z94KaAUV1R+M49T3pxSDl+Xkb+HaP/2IbpfJAdGLGkCVrCKDq3Wl0glCCka
|
||||
WGqFHDOZrk1/gFkLr2+11vKWGwKBgQDUKl4Q2ZK3nYja8tH70OGHYx4O/xHOmQCf
|
||||
C/ZxOupTTgwzGXe6InyF/tnlJMKEpsAHhcro5kmyIMWEW3haILU1kW8cZ9BSFSkS
|
||||
aPo/voWwjXZCTyDfGDqlGHoLgFXZxsn4PlV0Z/LjbEWpCz8uS6Zbcqlc+SJnFmsy
|
||||
ewHm9bLx4QKBgFnovHYgmduyg7oYEo1FippUtDO78hU6sgiYo0OHJRSQXaOVO/bn
|
||||
+bYwwPpRDECwxlZvR8YxTwceBbb3RtKNtFKAAPY0xgW1LgJXTgKgxq2dEnqNg6sd
|
||||
trDHOLwN0NAvhX0hWE0b/sykpy8TAZmuCOAdMHLXthE3jXBMA8h/C2o1AoGACyBx
|
||||
sHaIoEKNw9XKN2eb/Eqxb93mpCwYAT9SXFvXoCjOsPtb8RIP78MO0FqeLPDFz18v
|
||||
5gj1wna/hRJ6/FcMydNnvVigbz2W2tVQknk+b6Trl8yoj6qooLHo7KN9XR90xiUW
|
||||
vDUbYtvxx0zEsnvbLJ6VzT9vk3J0isAyuFcYXGECgYAOSO0WQA4QJzn1NFReYRdu
|
||||
Hsa/iBWES5LfuO9K1gZkLtoZ/MjwX1239kuMK9rqISJ7ggC3fZZZuaPK6UM3ndpP
|
||||
ZY8o+QOQ2VGIF/V3dQfWfIc0gYz2Qf10a99P2wKRFC1dETCb63cIYlfpyQrI9NSy
|
||||
0BKdyiMwFolUwumKfXjWww==
|
||||
-----END PRIVATE KEY-----
|
||||
Reference in New Issue
Block a user