旧版悟空crm系统二次开发对接互亿无线短信 SMS插件开发

1、本插件针对悟空CRM V0.5.5版本开发,安装前请仔细核对你的系统版本。
2、设置短信参数:系统设置->SMTP设置,填写互亿无线账号密码,其他参数请参照截图。
在这里插入图片描述
修改了的代码文件位置:
\App\Common\common.php
\App\Lang\zh-cn\setting.php
\App\Lib\Action\SettingAction.class.php
\App\Runtime\Data\sms.php
\App\Tpl\Setting\smtp.html

/*
*
* 返回码说明 短信函数返回2发送成功
*
* */

//发送到目标手机号码 $telphone手机号码 $message短信内容
function sendSMS($telphone, $message, $sign_name = "sign_name", $sendtime = '')
{
    $sms    = F('sms');
    $argv   = array(
        'account'  => $sms['uid'],
        'password' => $sms['passwd'],
        'mobile'   => $telphone,
        'content'  => $message,
    );
    $result = file_get_contents('http://106.ihuyi.com/webservice/sms.php?method=Submit&' . http_build_query($argv));
    $result = xml_to_array($result);
    if ($result['SubmitResult']['code'] == 2) {
        return 1;
    } else {
        return 0;
    }
}

function sendtestSMS($uid, $uname, $telphone, $sign_name = "sign_name")
{
    $sms    = F('sms');
    $argv   = array(
        'account'  => $sms['uid'],
        'password' => $sms['passwd'],
        'mobile'   => $telphone,
        'content'  => '您的验证码是:' . rand(111111, 999999) . '。请不要把验证码泄露给其他人。',
    );
    $result = file_get_contents('http://106.ihuyi.com/webservice/sms.php?method=Submit&' . http_build_query($argv));
    $result = xml_to_array($result);
    if ($result['SubmitResult']['code'] == 2) {
        return 1;
    } else {
        return 0;
    }
}

//发送到目标手机号码字符串 用","隔开 $telphone手机号码 $message短信内容
function sendGroupSMS($telphone, $message, $sign_name = "sign_name", $sendtime = '')
{
    $sms  = F('sms');
    $argv = array(
        'account'  => $sms['yx_uid'],
        'password' => $sms['yx_passwd'],
        'mobile'   => $telphone,
        'content'  => $message,
    );

    $result = file_get_contents('http://api.yx.ihuyi.com/webservice/sms.php?method=Submit&' . http_build_query($argv));
    $result = xml_to_array($result);
    if ($result['SubmitResult']['code'] == 2) {
        return 1;
    } else {
        return 0;
    }
}

function getSmsNum()
{
    $sms    = F('sms');
    $argv   = array(
        'account'  => $sms['uid'],
        'password' => $sms['passwd'],
    );
    $result = file_get_contents('http://106.ihuyi.com/webservice/sms.php?method=GetNum&' . http_build_query($argv));
    $result = xml_to_array($result);
    if ($result['GetNumResult']['code'] == 2) {
        return $result['GetNumResult']['num'];
    } else {
        return 0;
    }
}
public function sendSms(){
	if($this->isPost()){
		$phoneNum = trim($_POST['phoneNum']);
		$message = trim($_POST['smsContent']);
		if($_POST['settime']){
			$send_time = strtotime(trim($_POST['sendtime']));
			if($send_time > time()){
				$sendtime = date('YmdHis',$send_time);
			}
		}
		$current_sms_num = getSmsNum();
		if(!F('sms')) alert('success',L('SEND_SMS_FAILED'),$_SERVER['HTTP_REFERER']);
		$phoneNum = str_replace(" ","",$phoneNum);
		$phone_array = explode(chr(10),$phoneNum);
		if(sizeof($phone_array) > 0){
			//if(sizeof($phone_array) > $current_sms_num) alert('error','短信余额不足,请联系管理员,及时充值!',$_SERVER['HTTP_REFERER']);
		}
		$fail_array = array();
		$success_array = array();
		if($phoneNum && $message){		
			if(strpos($message,'{$name}',0) === false){
				foreach($phone_array as $k=>$v){
					if($v){
						$phone = substr($v,0,11);
						if(is_phone($phone)){
							$success_array[] = $phone;
						}else{
							$fail_array[] = $v;
						}
					}
				}
				if(!empty($fail_array)){
					$fail_message = L('PART_OF_NUMBER_SEND_FAILED').implode(',', $fail_array);
				}
				//echo '发送成功!';die();
				$result = sendGroupSMS(implode(',', $success_array),$message,'yx_uid', $sendtime);
				if($result == 1){
				    $m_sms_record=M('smsRecord');
					$data['role_id'] = session('role_id');
					$data['telephone'] = implode(',', $success_array);
					$data['content'] = $message;
					$data['sendtime'] = time();
					$m_sms_record->add($data);
					alert('success', L('SEND_SUCCESS_MAY_DELAY_BY_BAD_NETWORK').$fail_message,$_SERVER['HTTP_REFERER']);
				}else{
					alert('error',L('SMS_NOTIFICATION_FAILS_CODE', array($result)),$_SERVER['HTTP_REFERER']);
				}
			}else{
				foreach($phone_array as $k=>$v){
					$real_message = $message;
					$name = ''; 
					if($v){
						$no = str_replace(" ","",$v);
						$phone = substr($no,0,11);
						if(is_phone($phone)){
							if(strpos($v,',',0) === false){
								$info_array = explode(',', $v);
							}else{
								$info_array = explode(',', $v);
							}
							$real_message = str_replace('{$name}',$info_array[1],$real_message);
							$result =sendSMS($phone, $real_message, 'yx_uid', $sendtime);
							$m_sms_record=M('smsRecord');
							$data['role_id']=session('role_id');
							$data['telephone']=$phone;
							$data['content']=$real_message;
							$data['sendtime']=time();
							$m_sms_record->add($data);
							
							if($result<0 && $k==0){
								alert('error', L('SMS_NOTIFICATION_FAILS_CODE', array($result)),$_SERVER['HTTP_REFERER']); 
							}
						}else{
							$fail_array[] = $v;
						}
					}
				}
				
				if(!empty($fail_array)){
					$fail_message = L('PART_OF_NUMBER_SEND_FAILED').implode(',', $fail_array);
				}
				
				alert('success',L('SEND_SUCCESS_MAY_DELAY_BY_BAD_NETWORK').$fail_message,U('setting/sendsms'));
				
			}
		}else{
			alert('error',L('INCOMPLETE_INFORMATION'),$_SERVER['HTTP_REFERER']);
		}
	}else{
		$current_sms_num = getSmsNum();
		
		$model = trim($_GET['model']);
		if($model == 'customer'){
			$customer_ids = trim($_GET['customer_ids']);
			if($customer_ids){
				$contacts_ids = M('RContactsCustomer')->where('customer_id in (%s)', $customer_ids)->getField('contacts_id', true);
				$contacts_ids = implode(',', $contacts_ids);
				$contacts = D('ContactsView')->where('contacts.contacts_id in (%s)', $contacts_ids)->select();
				$this->contacts = $contacts;
			}else{
				alert('error',L('SELECT_CUSTOMER_TO_SEND'),$_SERVER['HTTP_REFERER']);
			}
		}elseif($model == 'contacts'){
			$contacts_ids = trim($_GET['contacts_ids']);
			if(!$contacts_ids) alert('error',L('SELECT_CONTACTS_TO_SEND'),$_SERVER['HTTP_REFERER']);
			$contacts = D('ContactsView')->where('contacts.contacts_id in (%s)', $contacts_ids)->select();
			$this->contacts = $contacts;
		}elseif($model == 'leads'){
			$d_v_leads = D('LeadsView');
			$leads_ids = trim($_GET['leads_ids']);
			$where['leads_id'] = array('in',$leads_ids);
			$customer_list = $d_v_leads->where($where)->select();
			$contacts = array();
			foreach ($customer_list as $k => $v) {
				$contacts[] = array('name'=>$v['contacts_name'], 'customer_name'=>$v['name'], 'telephone'=>trim($v['mobile']));
			}
			$this->contacts = $contacts;
		}
		$this->templateList = M('SmsTemplate')->order('order_id')->select();
		$this->alert = parseAlert();
		$this->current_sms_num = $current_sms_num;
		$this->display();
	}
}

//短信发件箱

public function smsRecord(){	
    $m_sms_record=M('smsRecord');
	$where = array();
	$params = array();
	
	if ($_REQUEST["field"]) {
		$field = trim($_REQUEST['field']) == 'all' ? 'title|content' : $_REQUEST['field'];
		$search = empty($_REQUEST['search']) ? '' : trim($_REQUEST['search']);
		$condition = empty($_REQUEST['condition']) ? 'is' : trim($_REQUEST['condition']);
		if	('sendtime' == $field) $search = is_numeric($search)?$search:strtotime($search);
		switch ($condition) {
			case "is" : $where[$field] = array('eq',$search);break;
			case "isnot" :  $where[$field] = array('neq',$search);break;
			case "contains" :  $where[$field] = array('like','%'.$search.'%');break;
			case "not_contain" :  $where[$field] = array('notlike','%'.$search.'%');break;
			case "start_with" :  $where[$field] = array('like',$search.'%');break;
			case "end_with" :  $where[$field] = array('like','%'.$search);break;
			case "is_empty" :  $where[$field] = array('eq','');break;
			case "is_not_empty" :  $where[$field] = array('neq','');break;
			case "gt" :  $where[$field] = array('gt',$search);break;
			case "egt" :  $where[$field] = array('egt',$search);break;
			case "lt" :  $where[$field] = array('lt',$search);break;
			case "elt" :  $where[$field] = array('elt',$search);break;
			case "eq" : $where[$field] = array('eq',$search);break;
			case "neq" : $where[$field] = array('neq',$search);break;
			case "between" : $where[$field] = array('between',array($search-1,$search+86400));break;
			case "nbetween" : $where[$field] = array('not between',array($search,$search+86399));break;
			case "tgt" :  $where[$field] = array('gt',$search+86400);break;
			default : $where[$field] = array('eq',$search);
		}
		$params = array('field='.$field, 'condition='.$condition, 'search='.trim($_REQUEST["search"]));
	}
    $p = isset($_GET['p']) ? intval($_GET['p']) : 1 ;
	if(!session('?admin')){
		$where['role_id'] = session('role_id');
	}
	$list = $m_sms_record->where($where)->page($p.',10')->select();
	foreach($list as $k=>$v){
		//查发送人名字
		$list[$k]['send_user'] = M('user')->where('role_id = %d', $v['role_id'])->getField('name');
		//截取手机号
		if(strstr($v['telephone'],',')){
			$list[$k]['subtelephone'] = substr($v['telephone'],0,strpos($v['telephone'],',')).'...';
		}else{
			$list[$k]['subtelephone'] = $v['telephone'];
		}
		//截取内容
		if(mb_strlen($v['content'],'utf-8') >= 30){
			$list[$k]['subcontent'] = mb_substr($v['content'],0,30,'utf8').'...';
		}else{
			$list[$k]['subcontent'] = $v['content'];
		}
	}
	$count =$m_sms_record->where($where)->count();
	import("@.ORG.Page");
	$Page = new Page($count,10);
	$Page->parameter = implode('&', $params);
	$this->assign('page',$Page->show());
	$this->assign('data',$list);
	$this->alert=parseAlert();
	$this->display();
}

如果大家需要开发悟空CRM插件的 可以联系我
在这里插入图片描述

悟空CRM采用全新的前后端分离模式,本仓库代码中已集成前端vue打包后文件,可免去打包操作 如需调整前端代码,请单独下载前端代码,前端代码在根目录的ux文件夹中 主要技术栈 核心框架:jfinal3.8 缓存:redis 数据库连接池:Druid 工具类:hutool,fastjson,poi-ooxml 定时任务:jfinal-cron 项目构建工具:maven Web容器:tomcat,jetty,undertow(默认) 前端MVVM框架:Vue.JS 2.5.x 路由:Vue-Router 3.x 数据交互:Axios UI框架:Element-UI 2.6.3 安装说明 配置java运行环境,redis环境,mysql环境将目录doc下的72crm.sql导入到数据库,修改resources/config/erpsnow-config.txt下的数据库以及redis的配置文件undertow启动端口号在resources/config/undertow.txt下修改jetty启动端口号在Application.java中修改 部署说明 本项目JDK要求JDK8及以上 一、Tomcat部署 javax.servlet javax.servlet-api 4.0.1 provided 取消以上代码的注释,将jetty和undertow的引用注释掉,将packaging从jar改为war然后运行maven package命令,将war包放在tomcat/webapps目录下 二、Jetty部署 com.jfinal jetty-server 2019.3 provided 取消以上代码的注释,将tomcat和undertow的引用注释掉,将packaging改为jar其他同Undertow 三、Undertow(默认) com.jfinal jfinal-undertow 1.5 取消以上代码的注释,将jetty和undertow的引用注释掉,将packaging改为jar运行 maven package。将上述打包命令生成的 zip 文件上传到服务器并解压,将目录下的 72crm.sh/72crm.bat 放到解压后的目录下,运行即可 更换启动方式jetty和undertow时,需要更改Application.java中的启动文件 前端部署 安装node.js 前端部分是基于node.js上运行的,所以必须先安装node.js,版本要求为6.0以上 使用npm安装依赖 下载悟空CRM9.0前端代码; 可将代码放置在后端同级目录frontend,执行命令安装依赖: npm install 修改内部配置 修改请求地址或域名:config/dev.env.js里修改BASE_API(开发环境服务端地址,默认localhost) 修改自定义端口:config/index.js里面的dev对象的port参数(默认8080,不建议修改) 运行前端 npm run dev 注意:前端服务启动,默认会占用8080端口,所以在启动前端服务之前,请确认8080端口没有被占用。 程序运行之前需搭建好Server端
很高兴为您解答关于悟空CRM二次开发的问题。 悟空CRM是一款基于云计算的客户关系管理系统,它提供了丰富的功能模块,包括销售管理、客户服务、营销管理等。同时,悟空CRM也提供了二次开发平台,使得用户可以根据自己的业务需求进行个性化定制。 以下是悟空CRM二次开发的教学步骤: 1.注册开发者账号 首先,您需要注册悟空CRM开发者账号,登录后即可进入二次开发平台。 2.了解二次开发平台 在二次开发平台中,您可以使用开放API接口、Webhook、自定义组件等方式进行二次开发。其中,API接口是最为常用的一种方式,通过调用API接口,可以实现对悟空CRM中数据的增删改查等操作。 3.创建应用 在二次开发平台中,您需要创建应用来进行二次开发。创建应用后,您可以获取到应用的AppId和AppSecret,这些信息在调用API接口时需要用到。 4.调用API接口 在二次开发中,您可以使用HTTP请求方式调用API接口。调用API接口的URL格式为:https://api.wukongcrm.com/api/{version}/{module}/{action},其中version为API版本,module为操作模块,action为执行操作。 例如,如果您要调用获取客户列表的接口,URL格式为:https://api.wukongcrm.com/api/v1/Customer/GetList。 5.使用自定义组件 在二次开发平台中,您也可以使用自定义组件来进行二次开发。自定义组件可以添加到悟空CRM中的页面上,实现对页面的个性化定制。 总的来说,悟空CRM二次开发是一个非常灵活和强大的工具,它可以满足不同用户的不同需求。但是,二次开发过程中需要有一定的编程基础和技术能力,如果您对此不太熟悉,建议寻求专业人士的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值