commit 9565e29ae0bcbe5f8fe89b443f319cd9418a19b0
Author: jefferyzhao <375696853@qq.com>
Date: Thu Jul 31 17:39:37 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/1.py b/1.py
new file mode 100644
index 0000000..5880702
--- /dev/null
+++ b/1.py
@@ -0,0 +1,3 @@
+from utils import *
+from FuiouPay import H5Main
+add_payment({'pay_amount': 0.01, 'id': '520103200111013211', 'sh': '0001000F7152040', 'base_company': '1', 'name': '王治轶', 'transaction_id': '2024112022001473261446621310', 'payment_items': '承包金', 'pay_type': '支付宝支付'},)
\ No newline at end of file
diff --git a/FuiouPay.py b/FuiouPay.py
new file mode 100644
index 0000000..cb492c5
--- /dev/null
+++ b/FuiouPay.py
@@ -0,0 +1,53 @@
+import json
+from datetime import datetime
+
+import requests
+from Crypto.PublicKey import RSA
+import base64
+from Crypto.Cipher import PKCS1_v1_5
+
+# 使用公钥加密
+def rsa_long_encrypt(public_key,msg, length=100):
+ """
+ 单次加密串的长度最大为 (key_size/8)-11
+ 1024bit的证书用100, 2048bit的证书用 200
+ """
+ pub_key = RSA.importKey(open(public_key).read())
+ # pub_key = RSA.importKey(open('E:/YinJian/银建支付对接维护说明/富友/fy-enterprise-wechat-payment-push/pub_key.pem').read())
+ pubobj = PKCS1_v1_5.new(pub_key)
+ res = []
+ for i in range(0, len(msg), length):
+ res.append(pubobj.encrypt(msg[i:i + length].encode('GBK')))
+ return base64.b64encode(b"".join(res)).decode('GBK')
+
+
+class H5Main:
+ def __init__(self, sub_mchnt_cd):
+ self.mchnt_cd = "0001000F7152279"
+ self.sub_mchnt_cd = sub_mchnt_cd
+ self.url = 'https://aggpcpay.fuioupay.com/aggh5Gate.fuiou'
+ self.notify_url = "http://web.jiyuankeshang.com/api4/paymentCallBack"
+ self.page_notify_url = "http://web.jiyuankeshang.com/api4/page_notify"
+ # self.notify_url = "http://172.16.6.15:3006/paymentCallBack"
+
+ def unified_order(self, order_no, total, description):
+ param = {
+ "mchnt_cd": self.mchnt_cd,
+ "sub_mchnt_cd": self.sub_mchnt_cd,
+ "order_date": datetime.now().strftime("%Y%m%d"),
+ "order_id": order_no,
+ "order_amt": total,
+ "page_notify_url": self.page_notify_url,
+ "back_notify_url": self.notify_url,
+ "ver": "4.0.0",
+ "goods_name": "云学堂年费",
+ "goods_detail": description,
+ "fee_type": "CNY",
+ }
+ pub_key_location = 'pub_key.pem'
+ # pub_key_location = 'E:\YinJian\银建支付对接维护说明\技培\jp-enterprise-wechat-payment-push\pub_key.pem'
+ print("======================发起支付====================",param)
+ # 加密
+ message = json.dumps(param)
+ encrypted_message = rsa_long_encrypt(pub_key_location,message,100)
+ return json.dumps({"message": encrypted_message})
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/__pycache__/FuiouPay.cpython-36.pyc b/__pycache__/FuiouPay.cpython-36.pyc
new file mode 100644
index 0000000..cc38f7e
Binary files /dev/null and b/__pycache__/FuiouPay.cpython-36.pyc differ
diff --git a/__pycache__/FuiouPay.cpython-37.pyc b/__pycache__/FuiouPay.cpython-37.pyc
new file mode 100644
index 0000000..f604592
Binary files /dev/null and b/__pycache__/FuiouPay.cpython-37.pyc differ
diff --git a/__pycache__/WXPay.cpython-36.pyc b/__pycache__/WXPay.cpython-36.pyc
new file mode 100644
index 0000000..5e9d7b4
Binary files /dev/null and b/__pycache__/WXPay.cpython-36.pyc differ
diff --git a/__pycache__/WXPay.cpython-37.pyc b/__pycache__/WXPay.cpython-37.pyc
new file mode 100644
index 0000000..805c9a8
Binary files /dev/null and b/__pycache__/WXPay.cpython-37.pyc differ
diff --git a/__pycache__/app.cpython-37.pyc b/__pycache__/app.cpython-37.pyc
new file mode 100644
index 0000000..fd68221
Binary files /dev/null and b/__pycache__/app.cpython-37.pyc differ
diff --git a/__pycache__/config.cpython-36.pyc b/__pycache__/config.cpython-36.pyc
new file mode 100644
index 0000000..302ab66
Binary files /dev/null and b/__pycache__/config.cpython-36.pyc differ
diff --git a/__pycache__/config.cpython-37.pyc b/__pycache__/config.cpython-37.pyc
new file mode 100644
index 0000000..d144046
Binary files /dev/null and b/__pycache__/config.cpython-37.pyc differ
diff --git a/__pycache__/utils.cpython-36.pyc b/__pycache__/utils.cpython-36.pyc
new file mode 100644
index 0000000..1951645
Binary files /dev/null and b/__pycache__/utils.cpython-36.pyc differ
diff --git a/__pycache__/utils.cpython-37.pyc b/__pycache__/utils.cpython-37.pyc
new file mode 100644
index 0000000..1c89f7d
Binary files /dev/null and b/__pycache__/utils.cpython-37.pyc differ
diff --git a/config.py b/config.py
new file mode 100644
index 0000000..b2109cd
--- /dev/null
+++ b/config.py
@@ -0,0 +1,42 @@
+'''
+coding:utf-8
+@Time:2023/3/28 5:02 PM
+@Author:dyq
+'''
+
+# 调用域名
+base_path = 'https://www.jiyuankeshang.com'
+# 企微应用id 应用ID
+corpid = 'wweb8b852846334c2f'
+SECRET = 'MPa5NNk5SpE51CWrJEr6CkjWOzcpUxA_oIMC47bmj5c'
+agentid = '1000005'
+# 商户号
+#mchid = '1640957093'
+# APIv3密钥
+v3_SECRET = '87568e2507acb94056e7310c9c2ab9d5'
+# 服务器IP
+ip = '101.43.208.145'
+# 商户号证书序列号
+#serial_no = '22E0F3EA849ABD1E687C82D43D26190C46DA5834'
+# 未收付应用id
+pay_app = '66e3dd31d396a07cd2c0974b'
+# # 已收表单Id
+received_id = '659af2d8771e971c583622ac'
+# # 未收表单Id
+uncollected_id = '66e412f9d396a07cd2c2662d'
+# # 充值明细
+pay_details_id = '66e412f9d396a07cd2c2662d'
+# # 个人账户
+accout_id = '6600d0ebcdefd20d64271f9c'
+# 增减项app
+hz_app = '66e3dd31d396a07cd2c0974b'
+# 增减项表单
+hz_id = '65a1b20255499f701ee7eee3'
+# 合同信息表单
+ht_id = '66e3e1f4d396a07cd2c0e663'
+# apikey
+apikey = '82bl1lhsgjzhd9ahBYvaMNVAncYYRkbE'
+# 辅助表单(查询驾驶员身份证号)
+fu_app = '628eeaace7f28c00089a60cc'
+fu_id = '64685d55e6051a000edad530'
+rule_sort = {"收预收承包金": 0, "承包金": 1, "调度费": 2, "保养费": 3, "费税收取-其他": 4}
diff --git a/jpapp.py b/jpapp.py
new file mode 100644
index 0000000..28a89e1
--- /dev/null
+++ b/jpapp.py
@@ -0,0 +1,143 @@
+from flask import Flask, request, redirect, abort, session, jsonify, url_for
+from utils import *
+from FuiouPay import H5Main
+# from WXPay import WXPay
+import os, _thread, urllib
+from flask_cors import CORS, cross_origin
+
+
+
+app = Flask(__name__)
+app.config['SECRET_KEY'] = os.urandom(24)
+CORS(app, supports_credentials=True)
+
+@app.route('/queryUser', methods=['GET'])
+def queryUserApi():
+ # 获取支付明细
+ try:
+ id = request.args.get('user')
+ data = queryUser(id)
+ print("===================", data)
+ return data
+ except Exception as e:
+ return {}
+
+@app.route('/page_notify', methods=['POST'])
+@cross_origin()
+def pageNotify():
+ """处理 POST 请求并重定向为 GET 请求到 /redirect"""
+ try:
+ # 使用 303 See Other 状态码,将 POST 请求转换为 GET 请求的重定向
+ return redirect('/redirect', code=303)
+ except Exception as e:
+ print(f"Error occurred: {e}")
+ return jsonify({"error": "Internal Server Error"}), 500
+
+@app.route('/redirect', methods=['GET'])
+@cross_origin()
+def redirectApi():
+ """处理 GET 请求并重定向到外部 URL"""
+ try:
+ # 处理 GET 请求并重定向到外部 URL
+ return redirect('https://www.jiyuankeshang.com/f/66e412f9d396a07cd2c2662f', code=302)
+ except Exception as e:
+ print(f"Error occurred: {e}")
+ return jsonify({"error": "Internal Server Error"}), 500
+
+
+@app.route('/getPaymentDetails', methods=['GET'])
+def getPaymentDetails():
+ try:
+ id = request.args.get('user', '')
+
+ id = id.replace(" ", "")
+
+ if not id:
+ print("no 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("====================================paymentCallBack=========================================")
+ msg = request.data.decode('UTF-8')
+ print("回调参数为====", msg)
+ msg = eval(msg)
+ print("eval参数为====", msg)
+ if msg['resp_desc'] == '成功':
+ print("=================================充值回调SUCCESS==========================================")
+ # rsa_key = RSA.importKey(open('priv_key.pem').read())
+ rsa_key = RSA.importKey(open('E:\YinJian\银建支付对接维护说明\DP\DP-enterprise-wechat-payment-push\priv_key.pem').read())
+ print("msg===",msg['message'])
+ print(rsa_key)
+ whp = rsa_long_decrypt(rsa_key, msg['message'])
+ print("报文已解密", whp)
+ whp_dict = json.loads(whp)
+ # 打印字典中的所有键
+ print("1111111",whp_dict.keys())
+ # 获取'order_id'键的值并取前18个字符
+ id = whp_dict['order_id'][:18]
+ # 查询机构、分司
+ res = filter_jdy_ht(id)
+ transaction_id = whp_dict['pay_ssn']
+ amount = float(whp_dict['order_amt'])
+ order_pay_type = whp_dict['order_pay_type']
+ # 判断支付类型
+ if order_pay_type[:2] == "We":
+ pay_type = "微信支付"
+ elif order_pay_type[:3] == "Ali":
+ pay_type = "支付宝支付"
+ elif order_pay_type == "0000000000":
+ pay_type = "云闪付支付"
+ else:
+ pay_type = "企微支付"
+ amount = amount / 100
+ payment_items = "承包金"
+ print("充值回调处理",{"pay_amount": amount, "id": id,
+ "sh": res[1], "base_company": res[0], "name": res[2], "transaction_id": transaction_id, "payment_items": payment_items, "pay_type": pay_type})
+ _thread.start_new_thread(add_payment, ({"pay_amount": amount, "id": id,
+ "sh": res[1], "base_company": res[0], "name": res[2], "transaction_id": transaction_id, "payment_items": payment_items, "pay_type": pay_type},))
+ return {"code": 200}
+ except Exception as e:
+ return jsonify(error=str(e)), 500
+
+
+@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('/transactions', methods=['GET'])
+def transactions():
+ # 调起h5支付
+ try:
+ print("开始支付")
+ id = request.args.get('user')
+ price = request.args.get('price')
+ print("金额", price)
+ price = float(price) * 100
+ fy = H5Main("0001000F8079871")
+ print("发起费用缴纳",f"{id}{int(time.time())}", int(price), "")
+ message = fy.unified_order(f"{id}{int(time.time())}", int(price), "订单支付")
+ return message
+ except Exception as e:
+ print("error", e)
+ return jsonify(error=str(e)), 500
+
+
+if __name__ == '__main__':
+ app.run(host="0.0.0.0", port=3010, processes=True)
diff --git a/priv_key.pem b/priv_key.pem
new file mode 100644
index 0000000..612efe9
--- /dev/null
+++ b/priv_key.pem
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC/32miL42GsFcVwII+YDxjbjAdASu6f0SyD6fz5jFl+QWYJ16Z8suIpFOpsrvlVE9t8PD1gX1tJmmJYCi1IjoUrVxdKc6nBZ8w68xhttIdnP341W2bBMjWK1Tr3IWC1BwUFYOaGT4c5RJf886BzmUQpQetxi88nXWJCVbAEedhi4OdCgULS7Z74leTDgIi3+xlU7qLICndcCC4zPQM3IsETt/WQBW0bed+sNYI7RxMaAKQ6PaGcbryjZshDtRby+s8UqgdHVnDXY4++DafJjg+FzflE7rM+TyDBY80gvZduMZXHlGytZm9FQNFZSbhvYW0mOOznuwpq7DDLOank6qzAgMBAAECggEBAIdP/WT9eCeGcMPMUY2/vJa6fH/X9Yi+fCm+1Mkyi5/IcGOPUC3thhBFIyNIAy6FuMZl5uice2HgdwkEoXCsRJ2UbNDezPgJBO0xPZ+jmKZ9srYrffKW+zPetzLm/9j10R9w1LB2INGr0ruMaxQsBCYq3DF21JVAzkToKx+lALJOwC+ZEdjwYBCEzSSAKI/VupEMucuRMlSRRIQQXlqDPO0s5ymSkhynslBstpeKsGhl38hLgRA6aQIuhuvtLO00OlOwLxAfWTxgT+2VKntvvBZ3waoUw7sKLlSpX99dfgfARdAj08+ZR4cD06QtLSgAoiYvCet+/1yX457/coH1UdECgYEA/HUAAsD0dM6LG99ki0879ep3+2nd3Msk+4/IPV6p7J3qKuXpG8yGIXGacXzo+gjTxbfkE0l/xD41TcOz8HV7ZRJHtOBGEy6ZZoyqzqTVFS71FjzUL2W1P7RQjDqOpCxZyuW3vsLFVdVrN3fVuMv0NBHDvnzB55HAAeJFrL6Hj70CgYEAwpDAegggdaOFWj9eo03+oiwqJsutK6O6Fa1OZAA+QPG4tXqgiRIAqQ87HEi+a7GPKbntYkJX0YYNhSDkIUqebT1Fb/7kDVfLuDhF2cRa6Qr4CNrIi+F9KguJo3grNzBk/SWNUyouJsSxnQ3XS9kGbIddIzTMOukrnNmNebvOUy8CgYEAij7HsrpXI1+3bZv3QxIwk4nCCjr+81mK9vbVgEXGZ3xSLwuXi1GEYewD1wG/0qviy/LXQniNLrmiFuOENbkfyUkpWzM1LGvoNO/y2RYKWX9NVtAYoZvglPH46dFnKx/eS+1foWanCUnFXKqSro+BOsI/nqBSzqxRqLZv0RjEw0ECgYBeKr7tkRdcuFrnVfpQ4YPXK7bu9e8HSwPaT/m7zp5SwmsacpJWJP9q03NReienadWXZWRuBRwJzW6nu0aOklXhGyGLVfs8NfzkWV/9SNqTJfrsFi+v+9+fRNxF4PhRirumBdHDqYuSueoY0EUecZh5WH6MdpZOAOJZ1LVzcKEogwKBgQDkA5O4Fcxgo8fZaCkeV7Tlg1C1RJBXDD+E29ToAJw2EOruPkWV+rkrZZSpz+4pwgKgcM9IIZJKo/fI7tKDIwj3D+JzFO+H0RNiyMvrCZe7fDnvaPcFGPwqKwyCpjkurKtUdXYbHz9wapFJzaLpYD9opPRBRwZK8TkmXSWNyJi0Kw==
+-----END PRIVATE KEY-----
\ No newline at end of file
diff --git a/pub_key.pem b/pub_key.pem
new file mode 100644
index 0000000..83dad9f
--- /dev/null
+++ b/pub_key.pem
@@ -0,0 +1,3 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCg2Sk+UF++991s65lk5rIekfG82nvlzz5P8JKxm98ZA4e2UE4avHvGnFv16maFl6SzOTtKcVMnJzyxJsyTIUZvOeEuBXv2ChdVpqux19h1UJPrUoaSH1gi8sYYSkQkiX8i4JJy4yXEmShdajDEPU/ywZ2/0MqXahO1GlFwQid+wwIDAQAB
+-----END PUBLIC KEY-----
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..c7d9ce4
--- /dev/null
+++ b/test.py
@@ -0,0 +1,16 @@
+from flask import Flask, request, redirect, abort, session
+
+from FuiouPay import H5Main
+from utils import *
+from WXPay import WXPay
+import os, _thread, urllib
+
+id = "513030197011230614"
+# 商户号
+# price = float(1) * 100
+# fy = H5Main('0001000F7152364')
+# print("发起缴纳履约服务费", f"{id}{int(time.time())}", int(price), "")
+# message = fy.unified_order(f"{id}{int(time.time())}", int(price), "订单支付")
+# print("=============",message)
+data = filter_jdy_ht(id)
+print(data)
\ No newline at end of file
diff --git a/utils.py b/utils.py
new file mode 100644
index 0000000..5ce5758
--- /dev/null
+++ b/utils.py
@@ -0,0 +1,394 @@
+from datetime import datetime
+from Crypto.PublicKey import RSA
+import base64
+from Crypto.Cipher import PKCS1_v1_5
+import requests, time, json, uuid, datetime
+from flask import jsonify
+
+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 queryUser(id):
+ # 查询充值明细
+ # user = get_user_info(id)
+ url = f'{base_path}/api/v5/app/entry/data/list'
+ filter_data = {
+ "app_id": pay_app,
+ "entry_id": pay_details_id,
+ "limit": 100,
+ "filter": {
+ "rel": "and",
+ "cond": [
+ {
+ "field": "order_status",
+ "method": "eq",
+ "value": ["已完成"]
+ },
+ {
+ "field": "id_card",
+ "method": "eq",
+ "value": [id]
+ }
+ ]
+ }
+ }
+ pay_detail = turn_page(url, filter_data)
+ for i in pay_detail:
+ i['pay_time'] = format_uct(i['pay_time'])
+ balance = 0
+ balance = float("%.2f" % balance)
+ return {"balance": balance, "pay_detail": pay_detail}
+
+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": "id_card",
+ "method": "eq",
+ "value": [id]
+ }
+ ]
+ }
+ }
+ print("开始查询合同信息",filter_data)
+ ht_detail = turn_page(url, filter_data)
+ if not ht_detail:
+ return []
+ ht_detail = ht_detail[0]
+ # 机构
+ base_company = ht_detail['base_company']
+ # 商户号
+ sh = '0001000F7152040'
+ # 姓名
+ name = ht_detail['name']
+ # 车牌号
+ phone_num = ht_detail['phone_num']
+ return [base_company, sh, name, phone_num]
+
+def querydpUser(id):
+ # 查询充值明细
+ # user = get_user_info(id)
+ url = f'{base_path}/api/v5/app/entry/data/list'
+ filter_data = {
+ "app_id": pay_app,
+ "entry_id": pay_details_id,
+ "limit": 100,
+ "filter": {
+ "rel": "and",
+ "cond": [
+ {
+ "field": "order_status",
+ "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": 0, "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": "id_card",
+ "method": "eq",
+ "value": [id]
+ },
+ {
+ "field": "order_status",
+ "method": "eq",
+ "value": "已发起"
+ },
+ ]
+ }
+ }
+
+ uncollected_data = turn_page(url, filter_data)
+ undata = {}
+ # 按月份归类 uncollected_data
+ for un in uncollected_data:
+ if un['month1'] in undata.keys():
+ undata[un['month1']]['data'].append(un)
+ else:
+ undata[un['month1']] = {"data": []}
+ undata[un['month1']]['data'] = [un]
+ # # 按月查询增减项 flowState结束
+ amount = 0
+ for un in undata:
+ _th_amount = 0
+ for index, j in enumerate(undata[un]['data']):
+ amount += j['pay_amount']
+ _th_amount += j['pay_amount']
+ undata[un]['_th_amount'] = _th_amount
+ 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 add_payment(data, atype=None):
+ lock.acquire()
+ print("开始========", data, atype)
+ # user = get_user_info(data['id'])
+ # 充值成功后 回写充值明细
+ now_month = datetime.datetime.now().strftime("%Y-%m")
+ now_time = get_last_8_hour()
+ list_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": "id_card",
+ "method": "eq",
+ "value": data['id']
+ },
+ {
+ "field": "base_company",
+ "method": "eq",
+ "value": data['base_company']
+ },
+ {
+ "field": "order_status",
+ "method": "eq",
+ "value": "已发起"
+ },
+ ]
+ }
+ }
+ res = req_tool_jdy(list_url, filter_data)
+ print("=========================res=========================",res)
+ print(type(res))
+ _id = res["data"][-1]["_id"]
+ url = f'{base_path}/api/v5/app/entry/data/update'
+ info = {
+ "app_id": pay_app,
+ "entry_id": pay_details_id,
+ "data_id": _id,
+ "is_start_workflow": True,
+ "is_start_trigger": True,
+ "data": {
+ "id_card": {"value": data['id']}, "name": {"value": data['name']},
+ "pay_type": {"value": data['pay_type']},
+ "pay_status": {"value": "已支付"}, "order_status": {"value": "已完成"},
+ "pay_time": {"value": now_time}, "transaction_id": {"value": data['transaction_id']}
+ }
+ }
+ req_tool_jdy(url, info)
+ lock.release()
+ print("结束========")
+
+
+def rsa_long_decrypt(priv_key, msg, length=256):
+ """
+ 1024bit的证书用128,2048bit证书用256位
+ """
+ try:
+ privobj = PKCS1_v1_5.new(priv_key)
+ res = []
+ b64_msg = base64.b64decode(msg)
+ for i in range(0, len(b64_msg), length):
+ chunk = b64_msg[i:i + length]
+ decrypted_chunk = privobj.decrypt(chunk, 'xyz').decode('GBK')
+ res.append(decrypted_chunk)
+ print("解密回调完成:",res)
+ except Exception as e:
+ print(f"解密回调失败:{e}")
+ return jsonify(error=str(e)), 500
+ return "".join(res)
+
+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']
+