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