查看: 690|回复: 0

基于微擎开发 发送短信验证码

[复制链接]

748

主题

39

回帖

3907

积分

管理员

总舵主

积分
3907
QQ
发表于 2024-5-25 19:50:33 | 显示全部楼层 |阅读模式
在微擎的基础上开发一个PC 官网,发送验证码跟内部插件相互独立,以下是简单整理。

  一、  在framework文件夹内 添加alisms.calss.php 和 signaturehelper.class.php:

alisms.class.php
  1. <?php
  2. defined('IN_IA') or exit('Access Denied');
  3. class SmsDemo
  4. {
  5.     /**
  6.      * 发送短信
  7.      * @return stdClass
  8.      */
  9.     public function send_sms($to='',$model=1,$code)
  10.     {


  11.         $params = array ();
  12.         // *** 需用户填写部分 ***

  13.         // fixme 必填: 请参阅 [url]https://ak-console.aliyun.com/[/url] 取得您的AK信息
  14.         $accessKeyId = "xxxxxx";
  15.         $accessKeySecret = "xxxxxxx";

  16.         // fixme 必填: 短信接收号码
  17.         $params["PhoneNumbers"] = $to;

  18.         // fixme 必填: 短信签名,应严格按"签名名称"填写,请参考: [url]https://dysms.console.aliyun.com/dysms.htm#/develop/sign[/url]
  19.         $params["SignName"] = "xxx";

  20.         // fixme 必填: 短信模板Code,应严格按"模板CODE"填写, 请参考: [url]https://dysms.console.aliyun.com/dysms.htm#/develop/template[/url]
  21.         $model = pdo_getcolumn("sms_config",array('id'=>$model),'sms_code',1);//这里是本地自己数据库拿的
  22.         $params["TemplateCode"] = $model;

  23.         // fixme 可选: 设置模板参数, 假如模板中存在变量需要替换则为必填项
  24.         $params['TemplateParam'] = Array (
  25.             "code" => $code['code']
  26.         );

  27.         // fixme 可选: 设置发送短信流水号
  28.         $params['OutId'] = "";

  29.         // fixme 可选: 上行短信扩展码, 扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段
  30.         $params['SmsUpExtendCode'] = "";


  31.         // *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
  32.         if(!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
  33.             $params["TemplateParam"] = json_encode($params["TemplateParam"]);
  34.         }

  35.         // 初始化SignatureHelper实例用于设置参数,签名以及发送请求
  36.         load()->classs('signaturehelper');
  37.         $helper = new Signaturehelper();

  38.         // 此处可能会抛出异常,注意catch
  39.         $content = $helper->request(
  40.             $accessKeyId,
  41.             $accessKeySecret,
  42.             "dysmsapi.aliyuncs.com",
  43.             array_merge($params, array(
  44.                 "RegionId" => "cn-hangzhou",
  45.                 "Action" => "SendSms",
  46.                 "Version" => "2018-11-20",
  47.             ))
  48.         );

  49.         return  $content;
  50.     }
  51. }
复制代码
signaturehelper.class.php
  1. <?php

  2. /**
  3. * 签名助手
  4. * Class SignatureHelper
  5. */
  6. defined('IN_IA') or exit('Access Denied');
  7. class SignatureHelper {

  8.     /**
  9.      * 生成签名并发起请求
  10.      *
  11.      * @param $accessKeyId string AccessKeyId ([url]https://ak-console.aliyun.com/[/url])
  12.      * @param $accessKeySecret string AccessKeySecret
  13.      * @param $domain string API接口所在域名
  14.      * @param $params array API具体参数
  15.      * @return bool|\stdClass 返回API接口调用结果,当发生错误时返回false
  16.      */
  17.     public function request($accessKeyId, $accessKeySecret, $domain, $params) {
  18.         $apiParams = array_merge(array (
  19.             "SignatureMethod" => "HMAC-SHA1",
  20.             "SignatureNonce" => uniqid(mt_rand(0,0xffff), true),
  21.             "SignatureVersion" => "1.0",
  22.             "AccessKeyId" => $accessKeyId,
  23.             "Timestamp" => gmdate("Y-m-d\TH:i:s\Z"),
  24.             "Format" => "JSON",
  25.         ), $params);
  26.         ksort($apiParams);

  27.         $sortedQueryStringTmp = "";
  28.         foreach ($apiParams as $key => $value) {
  29.             $sortedQueryStringTmp .= "&" . $this->encode($key) . "=" . $this->encode($value);
  30.         }

  31.         $stringToSign = "GET&%2F&" . $this->encode(substr($sortedQueryStringTmp, 1));

  32.         $sign = base64_encode(hash_hmac("sha1", $stringToSign, $accessKeySecret . "&",true));

  33.         $signature = $this->encode($sign);

  34.         $url = "http://{$domain}/?Signature={$signature}{$sortedQueryStringTmp}";

  35.         try {
  36.             $content = $this->fetchContent($url);
  37.             return json_decode($content);
  38.         } catch( \Exception $e) {
  39.             return false;
  40.         }
  41.     }

  42.     private function encode($str)
  43.     {
  44.         $res = urlencode($str);
  45.         $res = preg_replace("/\+/", "%20", $res);
  46.         $res = preg_replace("/\*/", "%2A", $res);
  47.         $res = preg_replace("/%7E/", "~", $res);
  48.         return $res;
  49.     }

  50.     private function fetchContent($url) {
  51.         if(function_exists("curl_init")) {
  52.             $ch = curl_init();
  53.             curl_setopt($ch, CURLOPT_URL, $url);
  54.             curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  55.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  56.             curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  57.                 "x-sdk-client" => "php/2.0.0"
  58.             ));
  59.             $rtn = curl_exec($ch);

  60.             if($rtn === false) {
  61.                 trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
  62.             }
  63.             curl_close($ch);

  64.             return $rtn;
  65.         }

  66.         $context = stream_context_create(array(
  67.             "http" => array(
  68.                 "method" => "GET",
  69.                 "header" => array("x-sdk-client: php/2.0.0"),
  70.             )
  71.         ));

  72.         return file_get_contents($url, false, $context);
  73.     }

  74. }
复制代码
二、然后在你的对应控制器中 加入
  1. load()->classs('alisms');
  2. $alisms = new SmsDemo($to, $model, array('code'=>$code));//参数分别是:发送对象,模版,验证码
  3. $send = $alisms->send_sms($to, $model,array('code'=>$code));
复制代码


道不同,不相为谋!理想要有,万一实现了呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:2513533699@qq.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鲁ICP备19000917号|鲁公网安备37078302000320号

在本版发帖
关注公众号
QQ客服返回顶部