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-----