diff --git a/conf/config.json b/conf/config.json index 9554370..1634353 100644 --- a/conf/config.json +++ b/conf/config.json @@ -1,6 +1,8 @@ { - "baidu_sms_access_key": "您的AK", - "baidu_sms_access_key_secret": "您的SK", - "baidu_sms_host": "sms.bj.baidubce.com", - "baidu_sms_signature_id": "您的短信签名ID" + "smsConfig": { + "baidu_sms_access_key": "ALTAKPk92fX9cgGDax83yNL8mP", + "baidu_sms_access_key_secret": "9b16b8efd4dc463d8bbd5462db1db8a5", + "baidu_sms_host": "sms.bj.baidubce.com", + "baidu_sms_signature_id": "sms-sign-xQYUwp42637" + } } \ No newline at end of file diff --git a/models/table_create.txt b/models/table_create.txt new file mode 100644 index 0000000..7c9f38f --- /dev/null +++ b/models/table_create.txt @@ -0,0 +1,37 @@ + CREATE TABLE `sms_template` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `name` varchar(32) DEFAULT NULL COMMENT '模板名称', + `template_type` varchar(32) DEFAULT NULL COMMENT '模板类型', + `code` varchar(32) DEFAULT NULL COMMENT '模板编码', + `content` varchar(200) DEFAULT NULL COMMENT '模板内容', + `description` varchar(100) DEFAULT NULL COMMENT '场景说明', + `provider` varchar(100) DEFAULT NULL COMMENT '短信供应商名称', + `del_flg` varchar(1) DEFAULT '0' COMMENT '删除标志', + `create_at` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间戳', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='短信模板表'; + +CREATE TABLE `validatecode` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `vcode` varchar(32) DEFAULT NULL COMMENT '验证码', + `expire_time` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '有效期', + `del_flg` varchar(1) DEFAULT '0' COMMENT '删除标志', + `create_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '创建时间戳', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='验证码表'; + +CREATE TABLE `sms_record` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `customerid` varchar(32) DEFAULT NULL COMMENT '客户id', + `send_type` varchar(32) DEFAULT NULL COMMENT '发送类型', + `mobile` varchar(15) DEFAULT NULL COMMENT '手机号', + `email` varchar(32) DEFAULT NULL COMMENT '邮箱', + `message` varchar(510) DEFAULT NULL COMMENT '发送内容', + `send_time` varchar(32) DEFAULT NULL COMMENT '发送时间', + `send_status` varchar(1) DEFAULT NULL COMMENT '发送状态', + `task_status` varchar(2) DEFAULT NULL COMMENT '任务状态 1:待发送,2:待定时发送,11:发送MQ成功,12:MQ消费成功,21:请求成功,22:请求失败,31:取消发送', + `remark` varchar(200) DEFAULT NULL COMMENT '发送失败备注信息', + `del_flg` varchar(1) DEFAULT NULL COMMENT '删除标志', + `create_at` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间戳', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='短信邮箱记录表'; diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..66e4e9f Binary files /dev/null and b/requirements.txt differ diff --git a/smssend/__pycache__/smssend.cpython-310.pyc b/smssend/__pycache__/smssend.cpython-310.pyc index 108009f..de55d18 100644 Binary files a/smssend/__pycache__/smssend.cpython-310.pyc and b/smssend/__pycache__/smssend.cpython-310.pyc differ diff --git a/smssend/smssend.py b/smssend/smssend.py index db74ae9..b5b23fb 100644 --- a/smssend/smssend.py +++ b/smssend/smssend.py @@ -19,10 +19,7 @@ import baidubce.exception as ex from sqlor.dbpools import DBPools from appPublic.uniqueID import getID as uuid from ahserver.serverenv import ServerEnv - -p = 'D:/Code/backend_code/test_/' -config = getConfig(p) -DBPools(config.databases) +from sqlor.dbpools import get_sor_context SMS_TEMPLATE_TABLE = { "summary": [{"name": "sms_template", "primary": "id"}], @@ -106,8 +103,8 @@ class SMSEngine: return {'status': False, 'msg': str(e)} async def send_vcode(self, phone: str, stype: str, vcode) -> dict: - db = DBPools() - async with db.sqlorContext('kboss') as sor: + env = ServerEnv() + async with get_sor_context(env, 'kboss') as sor: template_info = await sor.R('sms_template', {'name': stype, 'del_flg': '0'}) if template_info: template_id = template_info[0]['code'] @@ -126,8 +123,8 @@ class SMSEngine: return await self.send(stype, template_id, phone, vcode) async def __validation(self, stype, template_id, params, phone, resp) -> dict: - db = DBPools() - async with db.sqlorContext('kboss') as sor: + env = ServerEnv() + async with get_sor_context(env, 'kboss') as sor: send_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") log = { 'id': uuid(), @@ -153,10 +150,6 @@ class SMSEngine: code = ''.join(random.choices(string.digits, k=length)) code_id = uuid() expire_time = datetime.datetime.now() + datetime.timedelta(minutes=expire_minutes) - - # db = DBPools(config.databases) - # async with db.sqlorContext('kboss') as sor: - from sqlor.dbpools import get_sor_context env = ServerEnv() async with get_sor_context(env, 'kboss') as sor: await sor.C('validatecode', { @@ -166,11 +159,11 @@ class SMSEngine: 'del_flg': '0', 'create_at': datetime.datetime.now() }) - return code_id + return code_id, code async def check_sms_code(self, code_id: str, vcode: str) -> bool: - db = DBPools() - async with db.sqlorContext('kboss') as sor: + env = ServerEnv() + async with get_sor_context(env, 'kboss') as sor: code_info = await sor.R('validatecode', {'id': code_id, 'del_flg': '0'}) if not code_info: return False @@ -180,14 +173,18 @@ class SMSEngine: return False now = datetime.datetime.now() + # 处理 code_info['expire_time'] 为 datetime 对象 + if isinstance(code_info['expire_time'], str): + code_info['expire_time'] = datetime.datetime.fromisoformat(code_info['expire_time']) + if now > code_info['expire_time']: return False - await sor.U('validatecode', {'id': code_id}, {'del_flg': '1'}) + await sor.U('validatecode', {'id': code_id, 'del_flg': '1'}) return True - async def send_sms(self, phone: str, stype: str, params: dict) -> dict: - code_id = await self.generate_sms_code() + async def send_sms(self, phone: str, stype: str) -> dict: + code_id, code = await self.generate_sms_code() if code_id is None: return { 'status': 'error', @@ -196,7 +193,7 @@ class SMSEngine: } } - vcode = {'SMSvCode': params.get('vcode', '')} + vcode = {'SMSvCode': code} result = await self.send_vcode(phone, stype, vcode) if result.get('status'): diff --git a/test/pwd_encry.py b/test/pwd_encry.py new file mode 100644 index 0000000..30e4592 --- /dev/null +++ b/test/pwd_encry.py @@ -0,0 +1,7 @@ +from appPublic.aes import aes_encode_b64 +import sys + +encry_key = '!@#$%^&*(*&^%$QWERTYUIqwertyui234567' +pwd = 'lima2018' +code = aes_encode_b64(encry_key, pwd) +print(code) diff --git a/test/test_done.py b/test/test_done.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test_smssend.py b/test/test_smssend.py index 375a413..ec57a54 100644 --- a/test/test_smssend.py +++ b/test/test_smssend.py @@ -30,7 +30,7 @@ async def get_vcode_from_db(codeid: str) -> dict: from sqlor.dbpools import DBPools db = DBPools() async with db.sqlorContext('kboss') as sor: - result = await sor.R('validatecode', {'id': codeid}) + result = await sor.R('validatecode', {'id': codeid, 'del_flg': '0'}) if result: return result[0] return None @@ -200,8 +200,8 @@ async def test_send_vcode(): print("测试8: send_vcode() - 发送验证码短信") print("=" * 50) - phone = "13800138000" - stype = "注册登录验证" + phone = "18053191417" + stype = "用户注册登录验证" vcode = {"SMSvCode": "123456"} result = await send_vcode(phone, stype, vcode) @@ -226,11 +226,10 @@ async def test_send_sms(): print("测试9: send_sms() - 发送短信(整合生成和发送)") print("=" * 50) - phone = "13800138000" - stype = "注册登录验证" - params = {"vcode": "666666"} + phone = "18053191417" + stype = "用户注册登录验证" - result = await send_sms(phone, stype, params) + result = await send_sms(phone, stype) print(f"发送结果: {result}") if result.get('status') == 'error': @@ -278,22 +277,22 @@ async def main(): results = [] - results.append(("get_sms_engine", await test_get_sms_engine())) + # results.append(("get_sms_engine", await test_get_sms_engine())) - r, codeid = await test_generate_sms_code() - results.append(("generate_sms_code", r)) + # r, codeid = await test_generate_sms_code() + # results.append(("generate_sms_code", r)) - r, codeid2 = await test_generate_sms_code_with_params() - results.append(("generate_sms_code(自定义参数)", r)) + # r, codeid2 = await test_generate_sms_code_with_params() + # results.append(("generate_sms_code(自定义参数)", r)) - results.append(("check_sms_code(错误验证码)", await test_check_sms_code_wrong())) + # results.append(("check_sms_code(错误验证码)", await test_check_sms_code_wrong())) results.append(("check_sms_code(正确验证码)", await test_check_sms_code_correct())) - results.append(("check_sms_code(无效codeid)", await test_check_sms_code_invalid_codeid())) - results.append(("check_sms_code(已过期)", await test_check_sms_code_expired())) + # results.append(("check_sms_code(无效codeid)", await test_check_sms_code_invalid_codeid())) + # results.append(("check_sms_code(已过期)", await test_check_sms_code_expired())) - results.append(("send_vcode", await test_send_vcode())) + # results.append(("send_vcode", await test_send_vcode())) results.append(("send_sms", await test_send_sms())) - results.append(("SMSEngine属性", await test_sms_engine_attributes())) + # results.append(("SMSEngine属性", await test_sms_engine_attributes())) print("\n" + "=" * 50) print("测试结果汇总") @@ -312,6 +311,10 @@ async def main(): print("-" * 50) print(f"总计: {passed} 通过, {failed} 失败") +from ahserver.serverenv import ServerEnv +env = ServerEnv() +def get_db_name(s=None): return 'kboss' +env.get_module_dbname = get_db_name if __name__ == '__main__': from sqlor.dbpools import DBPools