<commit_before><?php

namespace buddysoft\sms;

use buddysoft\sms\SmsModel;

class SmsSender{
	CONST apiurl = "http://yunpian.com/v1/sms/send.json";

	private $apiKey;
	private $validTime;

	/**
	 *
	 * 构造函数，必须通过该构造函数创建对象
	 * @param string $apkKey 从云片网申请的 apikey
	 * @param integer $validTime 验证码记录有效时间，用来区分失效的验证码
	 *
	 */
	
	public function __construct($apiKey, $validTime){
		$this->apiKey = $apiKey;
		$this->validTime = $validTime;
	}

	/**
	 *
	 * 返回十分钟前的时间
	 * 
	 * 用于查找十分钟（600秒）内是否发送过验证码
	 */
	
	private function validBeginTime(){
		$now = time();
		$now -= $this->validTime;
		$timeString = date('Y-m-d H:i:s', $now);
		// $timeString .= ".000Z";

		return $timeString;
	}

	/*
     * 调用云片 API 发送短信
     * 
     * url 为服务的url地址
     * query 为请求串
     */
	private	function sock_post($url,$query){
	    $data = "";
	    $info=parse_url($url);
	    $fp=fsockopen($info["host"],80,$errno,$errstr,30);
	    if(!$fp){
		    return $data;
		}

	    $head="POST ".$info['path']." HTTP/1.0\r\n";
	    $head.="Host: ".$info['host']."\r\n";
	    $head.="Referer: http://".$info['host'].$info['path']."\r\n";
	    $head.="Content-type: application/x-www-form-urlencoded\r\n";
		$head.="Content-Length: ".strlen(trim($query))."\r\n";
		$head.="\r\n";
		$head.=trim($query);
		$write=fputs($fp,$head);
		$header = "";
		while ($str = trim(fgets($fp,4096))) {
		    $header.=$str;
		}

		while (!feof($fp)) {
			$data .= fgets($fp,4096);
	    }

	    return $data;
	}

	/**
	 *
	 * 组合短信内容和发送参数，发送验证码
	 *
	 */
	
	private function directSendSms($mobile, $code){
		$text="【曦光科技】您的验证码是".$code;
		$encodedText = urlencode($text);
		$mobile=urlencode("$mobile");
		$postString = "apikey=".$this->apiKey;
		$postString .= "&text=".$encodedText;
		$postString .= "&mobile=".$mobile;

		return $this->sock_post(self::apiurl, $postString);
	}

	/**
	 *
	 * 发送验证码外部服务接口
	 *
	 */
	
	public function sendCode($mobile){

		if (! is_numeric($mobile) || strlen($mobile) < 11) {
			return fasle;
		}

		# 【#company#】您的验证码是#code#
		$code = $this->newCode($mobile);
		$result = $this->directSendSms($mobile, $code);

		$data['code'] = $code;
		$data['yunpian'] = $result;

		return $data;
	}

	/**
	 *
	 * 针对某个手机号生成新的验证码
	 *
	 * 首先检查该手机最近（10分钟内）是否有验证码记录，有的话，更新记录中的验证码，否则创建新的记录。
	 */
	
	private function newCode($mobile){
		$timeString = $this->validBeginTime();
<commit_msg>支持通过参数设置短信模板<commit_after><?php

namespace buddysoft\sms;

use buddysoft\sms\SmsModel;

class SmsSender{
	CONST apiurl = "http://yunpian.com/v1/sms/send.json";

	// 从云片网申请的 apikey，必须设置
	public $apiKey;

	// 在云片网络设置的短信发送模板，必须以【服务名称】开头，包含 #code# 字符串，必须设置
	public $yunpianTemplate;

	// 验证码记录有效时间，用来区分失效的验证码，单位秒
	public $validTime = 600;
	
	/**
	 *
	 * 设置短信发送模板
	 * @param string $template 必以【服务名称】开头，包含 #code# 的字符串
	 * @return boolean true 设置成功，false 设置失败
	 */
	
	public function setTemplate($template){
		if (false === strstr($template, '#code#')) {
			return false;
		}

		// if (empty(preg_match('【.*】', $template))) {
		// 	return false;
		// }

		$this->yunpianTemplate = $template;

		return true;
	}

	/**
	 *
	 * 返回十分钟前的时间
	 * 
	 * 用于查找十分钟（600秒）内是否发送过验证码
	 */
	
	private function validBeginTime(){
		$now = time();
		$now -= $this->validTime;
		$timeString = date('Y-m-d H:i:s', $now);
		// $timeString .= ".000Z";

		return $timeString;
	}

	/*
     * 调用云片 API 发送短信
     * 
     * url 为服务的url地址
     * query 为请求串
     */
	private	function sock_post($url,$query){
	    $data = "";
	    $info=parse_url($url);
	    $fp=fsockopen($info["host"],80,$errno,$errstr,30);
	    if(!$fp){
		    return $data;
		}

	    $head="POST ".$info['path']." HTTP/1.0\r\n";
	    $head.="Host: ".$info['host']."\r\n";
	    $head.="Referer: http://".$info['host'].$info['path']."\r\n";
	    $head.="Content-type: application/x-www-form-urlencoded\r\n";
		$head.="Content-Length: ".strlen(trim($query))."\r\n";
		$head.="\r\n";
		$head.=trim($query);
		$write=fputs($fp,$head);
		$header = "";
		while ($str = trim(fgets($fp,4096))) {
		    $header.=$str;
		}

		while (!feof($fp)) {
			$data .= fgets($fp,4096);
	    }

	    return $data;
	}

	private function makeSms($code){
		$text = str_replace('#code#', $code, $this->yunpianTemplate);
		return $text;
	}

	/**
	 *
	 * 组合短信内容和发送参数，发送验证码
	 *
	 */
	
	private function directSendSms($mobile, $code){

		// $text="【曦光科技】您的验证码是".$code;
		$text = $this->makeSms($code);
		$encodedText = urlencode($text);
		$mobile=urlencode("$mobile");
		$postString = "apikey=".$this->apiKey;
		$postString .= "&text=".$encodedText;
		$postString .= "&mobile=".$mobile;
		
		return $this->sock_post(self::apiurl, $postString);
	}

	/**
	 *
	 * 发送验证码外部服务接口
	 *
	 */
	
	public function sendCode($mobile){

		if (! is_numeric($mobile) || strlen($mobile) < 11) {
			return false;
		}

		if (empty($this->yunpianTemplate)) {
			return false;
		}

		# 【#company#】您的验证码是#code#
		$code = $this->newCode($mobile);
		$result = $this->directSendSms($mobile, $code);

		$data['code'] = $code;
		$data['yunpian'] = $result;

		return $data;
	}

	/**
	 *
	 * 针对某个手机号生成新的验证码
	 *
	 * 首先检查该手机最近（10分钟内）是否有验证码记录，有的话，更新记录中的验证码，否则创建新的记录。
	 */
	
	private function newCode($mobile){
		$timeString = $this->validBeginTime();

{'fraction_non_alphanumeric': 0.21246130030959753, 'fraction_numerical': 0.010255417956656347, 'mean_word_length': 3.2719008264462808, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1915738', 'n_tokens_mistral': 2564, 'n_tokens_neox': 2513, 'n_words': 310}