Zhiqim Account(前端账户管理台)是在ZhiqimManager基础上改造成用于前端注册登录的管理系统,增加组织结构和余额,开放注册组织和组织管理员,可以添加组织内的部门和角色和操作员。并增加该管理台上的一些组件,如充值支付等组件。适用于二级代理管理或该大型组织机构
ZmrSmsDao.java9KB
/*
* 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙,邂逅框架梦]
*
* https://zhiqim.org/project/zhiqim_components/zhiqim_account.htm
*
* Zhiqim Account is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.zhiqim.manager.dao;
import org.zhiqim.kernel.httpclient.HttpPost;
import org.zhiqim.kernel.json.Jsons;
import org.zhiqim.kernel.logging.Log;
import org.zhiqim.kernel.logging.LogFactory;
import org.zhiqim.kernel.model.codes.MD5;
import org.zhiqim.kernel.model.maps.HashMapSO;
import org.zhiqim.kernel.model.maps.TreeMapSO;
import org.zhiqim.kernel.model.results.RS;
import org.zhiqim.kernel.util.DateTimes;
import org.zhiqim.kernel.util.Ids;
import org.zhiqim.kernel.util.Longs;
import org.zhiqim.kernel.util.Randoms;
import org.zhiqim.kernel.util.Sqls;
import org.zhiqim.kernel.util.Strings;
import org.zhiqim.kernel.util.Urls;
import org.zhiqim.kernel.util.Validates;
import org.zhiqim.manager.ZmrConstants;
import org.zhiqim.manager.dbo.ZmrOperator;
import org.zhiqim.manager.dbo.ZmrOrg;
import org.zhiqim.manager.dbo.ZmrSms;
import org.zhiqim.orm.ORM;
import org.zhiqim.zml.Zmls;
/**
* 短信数据访问对象
*
* @version v2023 @author zouzhigang 2023年5月27日 新建与整理
*/
public class ZmrSmsDao implements ZmrConstants
{
private static Log log = LogFactory.getLog(ZmrSmsDao.class);
/****
* 发送短信
*
* @param operatorCode 操作员
* @param orgId 接受组织编号
* @param smsContent 短信内容
* @param smsRemark 短信备注
* @throws Exception 可能的异常
*/
public static void sendMsg(String operatorCode, long orgId, String smsContent, String smsRemark) throws Exception
{
ZmrOrg org = ZmrOrgDao.item(orgId);
if (org == null)
{
log.error("短信接收者["+orgId+"]不存在");
return;
}
ZmrOperator operator = ZmrOperatorDao.admin(orgId);
if (operator == null)
{
log.error("短信接收者["+org.getOrgName()+"]没有管理员账号");
return;
}
if (Validates.isEmptyBlank(operator.getOperatorMobile()))
{
log.error("短信接收者["+org.getOrgName()+"]未配置手机号");
return;
}
String mobile = Strings.trim(operator.getOperatorMobile());
if (!Validates.isIntegerPositive(mobile) || mobile.length() != 11)
{
log.error("短信接收者["+org.getOrgName()+"]手机号无效");
return;
}
int sendResult = send(mobile, smsContent);
ZmrSms sms = new ZmrSms();
sms.setOperatorCode(operatorCode);
sms.setSmsId(Ids.longId());
sms.setSmsReceiver(orgId);
sms.setSmsMobile(Longs.toLong(mobile));
sms.setSmsContent(smsContent);
sms.setSmsTime(Sqls.nowTimestamp());
sms.setSmsResult(sendResult);
sms.setSmsRemark(smsRemark);
ORM.table().insert(sms);
}
/**
* 发送注册成功短信
*
* @param orgId 商户号
* @throws Exception
*/
public static void sendRegisterSuccess(long orgId) throws Exception
{
String smsContent = ZmrParamDao.getString(G_SMS_NAME, P_SMS_SUCCESS_MSG);
if (Validates.isEmpty(smsContent))
{
log.error("系统未配置注册成功短信内容");
return;
}
ZmrOrg org = ZmrOrgDao.item(orgId);
if (org == null)
{
log.error("短信接收者["+orgId+"]不存在");
return;
}
ZmrOperator operator = ZmrOperatorDao.admin(orgId);
if (operator == null)
{
log.error("短信接收者["+org.getOrgName()+"]没有管理员账号");
return;
}
if (Validates.isEmptyBlank(operator.getOperatorMobile()))
{
log.error("短信接收者["+org.getOrgName()+"]未配置手机号");
return;
}
String mobile = Strings.trim(operator.getOperatorMobile());
if (!Validates.isIntegerPositive(mobile) || mobile.length() != 11)
{
log.error("短信接收者["+org.getOrgName()+"]手机号无效");
return;
}
int smsResult = send(mobile, smsContent);
ZmrSms sms = new ZmrSms();
sms.setOperatorCode(SYSTEM_OPERATOR_CODE);
sms.setSmsId(Ids.longId());
sms.setSmsReceiver(orgId);
sms.setSmsMobile(Longs.toLong(mobile));
sms.setSmsContent(smsContent);
sms.setSmsTime(Sqls.nowTimestamp());
sms.setSmsResult(smsResult);
sms.setSmsRemark("注册成功自动发送");
ORM.table().insert(sms);
}
/**
* 发送验证码
*
* @param userNumber 手机号
* @param type 验证码类型(0:注册,1:找回密码,2:修改手机号)
* @return RS<String>
*/
public static RS<String> sendVcode(String userNumber, int type)
{
if (!Validates.isIntegerPositive(userNumber) || userNumber.length() != 11)
{
log.error("手机号无效");
return RS.error("手机号无效");
}
String smsContent = ZmrParamDao.getString(G_SMS_NAME, P_SMS_VCODE_MSG);
if (Validates.isEmpty(smsContent))
{
log.error("系统未配置验证码短信内容");
return RS.error("系统未配置验证码短信内容");
}
String vcodeType = ZmrVcodeTypeDao.name(type);
String vcodeValue = Randoms.digits(6);
HashMapSO variableMap = new HashMapSO();
variableMap.put("vcodeType", vcodeType);
variableMap.put("vcodeValue", vcodeValue);
try
{
smsContent = Zmls.parse(smsContent, variableMap);
}
catch (Exception e)
{
log.error("系统配置的验证码短信内容格式不正确");
return RS.error("系统配置的验证码短信内容格式不正确");
}
int smsResult = send(userNumber, smsContent);
ZmrSms sms = new ZmrSms();
sms.setOperatorCode(SYSTEM_OPERATOR_CODE);
sms.setSmsId(Ids.longId());
sms.setSmsReceiver(ROOT_ORG_ID);
sms.setSmsMobile(Longs.toLong(userNumber));
sms.setSmsContent(smsContent);
sms.setSmsTime(Sqls.nowTimestamp());
sms.setSmsResult(smsResult);
sms.setSmsRemark(vcodeType + "验证码");
ORM.tabler().insert(sms);
return (smsResult == 0)?RS.value(vcodeValue):RS.error("错误码:"+smsResult);
}
/**
* 发送短信
*
* @param userNumber 手机号
* @param content 短信内容(不带签名)
* @return =0表示成功,!=0表示错误码
*/
private static int send(String userNumber, String content)
{
String url = ZmrParamDao.getString(G_SMS_NAME, P_SMS_URL);
String accountId = ZmrParamDao.getString(G_SMS_NAME, P_SMS_ACCOUNT_ID);
String accountSecret = ZmrParamDao.getString(G_SMS_NAME, P_SMS_ACCOUNT_SECRET);
String signature = ZmrParamDao.getString(G_SMS_NAME, P_SMS_SIGNATURE);
if (Validates.isEmptyBlank(url) || Validates.isEmptyBlank(accountId) || Validates.isEmptyBlank(accountSecret) || Validates.isEmptyBlank(signature))
{//配置不正确,不支持发送
return 1;
}
String timestamp = DateTimes.getDateTimeString();
String sign = MD5.encodeUTF8(accountId + timestamp + accountSecret);
TreeMapSO paramMap = new TreeMapSO();
paramMap.put("accountId", accountId);
paramMap.put("timestamp", timestamp);
paramMap.put("sign", sign);
paramMap.put("userNumber", userNumber);
paramMap.put("content", "【" + signature + "】" + content);
HttpPost conn = new HttpPost(url);
conn.setQueryString(Urls.toQueryString(paramMap), _UTF_8_);
conn.execute();
if (!conn.isResponseSuccess())
{//HTTP错误
return conn.getResponseStatus();
}
String responseText = conn.getResponseText();
String error = Jsons.getString(responseText, "error");
if (Validates.isNotEmptyBlank(error))
{//短信平台返回错误
return Jsons.getInt(error, "code");
}
return 0;
}
}