commit 506dceb0f73ec7fbd721db879835fe561e186d12
Author: jefferyzhao <375696853@qq.com>
Date: Thu Jul 31 15:53:14 2025 +0800
first commit
diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..a25e513
Binary files /dev/null and b/.DS_Store differ
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..081b737
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 数据源本地存储已忽略文件
+/dataSources/
+/dataSources.local.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
diff --git a/.idea/enterprise-wechat-payment-push.iml b/.idea/enterprise-wechat-payment-push.iml
new file mode 100644
index 0000000..f936df0
--- /dev/null
+++ b/.idea/enterprise-wechat-payment-push.iml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..a2e120d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..4adf23a
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.utils.py.swo b/.utils.py.swo
new file mode 100644
index 0000000..95212ec
Binary files /dev/null and b/.utils.py.swo differ
diff --git a/.utils.py.swp b/.utils.py.swp
new file mode 100644
index 0000000..ebed62a
Binary files /dev/null and b/.utils.py.swp differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/WXPay.py b/WXPay.py
new file mode 100644
index 0000000..14581b6
--- /dev/null
+++ b/WXPay.py
@@ -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
+
diff --git a/__pycache__/WXPay.cpython-37.pyc b/__pycache__/WXPay.cpython-37.pyc
new file mode 100644
index 0000000..6c5e33e
Binary files /dev/null and b/__pycache__/WXPay.cpython-37.pyc differ
diff --git a/__pycache__/config.cpython-37.pyc b/__pycache__/config.cpython-37.pyc
new file mode 100644
index 0000000..5341fda
Binary files /dev/null and b/__pycache__/config.cpython-37.pyc differ
diff --git a/__pycache__/utils.cpython-37.pyc b/__pycache__/utils.cpython-37.pyc
new file mode 100644
index 0000000..1036415
Binary files /dev/null and b/__pycache__/utils.cpython-37.pyc differ
diff --git a/apiclient_key.pem b/apiclient_key.pem
new file mode 100644
index 0000000..0384db0
--- /dev/null
+++ b/apiclient_key.pem
@@ -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-----
diff --git a/app.py b/app.py
new file mode 100644
index 0000000..0fda549
--- /dev/null
+++ b/app.py
@@ -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)
diff --git a/appsh_backup.py b/appsh_backup.py
new file mode 100644
index 0000000..952f172
--- /dev/null
+++ b/appsh_backup.py
@@ -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)
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..fa49481
--- /dev/null
+++ b/config.py
@@ -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}
+
diff --git a/hj.pem b/hj.pem
new file mode 100644
index 0000000..ad7e878
--- /dev/null
+++ b/hj.pem
@@ -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-----
diff --git a/jyj.pem b/jyj.pem
new file mode 100644
index 0000000..92d1ed3
--- /dev/null
+++ b/jyj.pem
@@ -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-----
diff --git a/utils.py b/utils.py
new file mode 100644
index 0000000..4f2d694
--- /dev/null
+++ b/utils.py
@@ -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']
diff --git a/utilsback.py b/utilsback.py
new file mode 100644
index 0000000..095f757
--- /dev/null
+++ b/utilsback.py
@@ -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']
diff --git a/xny.pem b/xny.pem
new file mode 100644
index 0000000..81c533e
--- /dev/null
+++ b/xny.pem
@@ -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-----
diff --git a/yj.pem b/yj.pem
new file mode 100644
index 0000000..94d8ccf
--- /dev/null
+++ b/yj.pem
@@ -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-----