From bd71f843fee7f4cb9f5cc1a1ba97965b37429eb6 Mon Sep 17 00:00:00 2001
From: "ZLW-PC\\Administrator" <374861669@qq.com>
Date: Fri, 29 Jun 2018 11:18:45 +0800
Subject: [PATCH] smsbao
---
README.md | 7 +
app/Common/Wechat/WechatAuth.php | 184 ++++++++++++++++++
app/Common/{ => Wechat}/WechatCallbackApi.php | 2 +-
app/Common/{ => Wechat}/WechatMenu.php | 2 +-
app/Common/{ => Wechat}/WxComponent.php | 12 +-
app/Common/{ => Wechat}/aes/demo.php | 2 +-
app/Common/{ => Wechat}/aes/errorCode.php | 2 -
app/Common/{ => Wechat}/aes/pkcs7Encoder.php | 34 ++--
app/Common/{ => Wechat}/aes/sha1.php | 4 -
app/Common/Wechat/aes/wxBizDataCrypt.php | 81 ++++++++
app/Common/{ => Wechat}/aes/wxBizMsgCrypt.php | 9 +-
app/Common/{ => Wechat}/aes/xmlparse.php | 6 +-
app/Common/WechatAuth.php | 103 ----------
app/Common/aes/ReadMe.txt | 4 -
.../Admin/WeixinMenuController.php | 2 +-
app/Http/Controllers/Api/ImageController.php | 50 +++++
app/Http/Controllers/Api/NotifyController.php | 4 +-
.../Controllers/Weixin/UserController.php | 2 +-
app/Http/Service/Smsbao.php | 86 ++++++++
public/images/pcscreenshots1.jpg | Bin 0 -> 139313 bytes
public/images/pcscreenshots2.jpg | Bin 0 -> 79375 bytes
21 files changed, 440 insertions(+), 156 deletions(-)
create mode 100644 app/Common/Wechat/WechatAuth.php
rename app/Common/{ => Wechat}/WechatCallbackApi.php (99%)
rename app/Common/{ => Wechat}/WechatMenu.php (99%)
rename app/Common/{ => Wechat}/WxComponent.php (98%)
rename app/Common/{ => Wechat}/aes/demo.php (99%)
rename app/Common/{ => Wechat}/aes/errorCode.php (99%)
rename app/Common/{ => Wechat}/aes/pkcs7Encoder.php (96%)
rename app/Common/{ => Wechat}/aes/sha1.php (99%)
create mode 100644 app/Common/Wechat/aes/wxBizDataCrypt.php
rename app/Common/{ => Wechat}/aes/wxBizMsgCrypt.php (99%)
rename app/Common/{ => Wechat}/aes/xmlparse.php (99%)
delete mode 100644 app/Common/WechatAuth.php
delete mode 100644 app/Common/aes/ReadMe.txt
create mode 100644 app/Http/Service/Smsbao.php
create mode 100644 public/images/pcscreenshots1.jpg
create mode 100644 public/images/pcscreenshots2.jpg
diff --git a/README.md b/README.md
index c378890..3889ac5 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,15 @@
PC端
+PC企业站
+
![alt text](/public/images/screenshots.jpg "网站截图")
+PC商城
+
+![alt text](/public/images/pcscreenshots1.jpg "网站截图")
+![alt text](/public/images/pcscreenshots2.jpg "网站截图")
+
WAP端
![alt text](/public/images/wapscreenshots.png "手机站截图")
diff --git a/app/Common/Wechat/WechatAuth.php b/app/Common/Wechat/WechatAuth.php
new file mode 100644
index 0000000..fb4d920
--- /dev/null
+++ b/app/Common/Wechat/WechatAuth.php
@@ -0,0 +1,184 @@
+开发者模式->获取
+ private $app_id;
+ private $app_secret;
+
+ public function __construct($app_id, $app_secret)
+ {
+ $this->app_id = $app_id;
+ $this->app_secret = $app_secret;
+ }
+
+ /**
+ * 获取微信授权链接
+ *
+ * @param string $redirect_uri 回调地址,授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
+ * @param mixed $state 可以为空,重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
+ */
+ public function get_authorize_url($redirect_uri = '', $state = '')
+ {
+ return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->app_id."&redirect_uri=".urlencode($redirect_uri)."&response_type=code&scope=snsapi_userinfo&state=".$state."#wechat_redirect";
+ }
+
+ /**
+ * 微信PC扫码授权登录链接
+ *
+ * @param string $redirect_uri 回调地址,授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
+ * @param mixed $state 可以为空,重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
+ */
+ public function get_qrconnect_url($redirect_uri = '', $state = '')
+ {
+ return "https://open.weixin.qq.com/connect/qrconnect?appid".$this->app_id."&redirect_uri=".urlencode($redirect_uri)."&response_type=code&scope=snsapi_login&state=".$state."#wechat_redirect";
+ }
+
+ /**
+ * 获取授权token
+ *
+ * @param string $code 通过get_authorize_url获取到的code
+ */
+ public function get_access_token($code = '')
+ {
+ $token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->app_id}&secret={$this->app_secret}&code={$code}&grant_type=authorization_code";
+ $token_data = $this->http($token_url);
+
+ return json_decode($token_data, true);
+ }
+
+ /**
+ * 获取access_token,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
+ */
+ public function get_token()
+ {
+ $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->app_id}&secret={$this->app_secret}";
+ $token_data = $this->http($token_url);
+ return json_decode($token_data, true);
+ }
+
+ /**
+ * 获取小程序码,适用于需要的码数量较少的业务场景,通过该接口生成的小程序码,永久有效,数量限制见文末说明,请谨慎使用。
+ * @param string $path 不能为空,最大长度 128 字节
+ * @param int $width 二维码的宽度,默认430
+ */
+ public function getwxacode($path, $width = 430)
+ {
+ $access_token = $this->get_token();
+ $url = 'https://api.weixin.qq.com/wxa/getwxacode?access_token='.$access_token['access_token'];
+ $path ="pages/mine/mine/mine?query=1";
+ $data ='{"path":"'.$path.'","width":'.$width.'}';
+ $res = $this->http($url, $data);
+
+ return $res;
+ //将生成的小程序码存入相应文件夹下
+ //file_put_contents('./public/wxyido/img/'.time().'.jpg',$return);
+ }
+
+ /**
+ * 获取小程序码,通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。
+ * @param string $data['scene'] 二维码场景值
+ * @param string $data['page'] 必须是已经发布的小程序存在的页面(否则报错),例如 "pages/index/index" ,根路径前不要填加'/',不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
+ * @param int $data['width'] 二维码的宽度,默认430
+ * @param int $data['type'] 0路径存储,1base64
+ */
+ public function getwxacodeunlimit($data)
+ {
+ $access_token = $this->get_token();
+ $url = 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token='.$access_token['access_token'];
+
+ $post_data = array();
+ $post_data['scene'] = $data['scene'];
+ $post_data['page'] = $data['page'];
+ $post_data['width'] = $data['width'];
+
+ $res = $this->http($url, json_encode($post_data));
+ if($data['type']==0)
+ {
+ file_put_contents($data['image_path'], $res);
+ }
+ else
+ {
+ $res = $this->data_uri($res);
+ }
+
+ return $res;
+ //将生成的小程序码存入相应文件夹下
+ //file_put_contents('./public/wxyido/img/'.time().'.jpg',$res);
+ }
+
+ public function data_uri($contents, $mime = 'image/png')
+ {
+ $base64 = base64_encode($contents);
+ return ('data:' . $mime . ';base64,' . $base64);
+ }
+
+ /**
+ * 获取授权后的微信用户信息
+ *
+ * @param string $access_token
+ * @param string $open_id
+ */
+ public function get_user_info($access_token = '', $open_id = '')
+ {
+ $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
+ $info_data = $this->http($info_url);
+
+ return json_decode($info_data, true);
+ }
+
+ /**
+ * 获取用户基本信息(包括UnionID机制)
+ *
+ * @param string $access_token
+ * @param string $open_id
+ */
+ public function get_user_unionid($access_token = '', $open_id = '')
+ {
+ $info_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
+ $info_data = $this->http($info_url);
+
+ return json_decode($info_data, true);
+ }
+
+ /**
+ * 小程序登录凭证校验
+ * 小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
+ * 开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。
+ * 临时登录凭证校验接口是一个 HTTPS 接口,开发者服务器使用 临时登录凭证code 获取 session_key 和 openid 等。
+ * @param string $js_code 小程序登录时获取的code
+ */
+ public function miniprogram_wxlogin($js_code)
+ {
+ $url = "https://api.weixin.qq.com/sns/jscode2session?appid={$this->app_id}&secret={$this->app_secret}&js_code=$js_code&grant_type=authorization_code";
+ $res = $this->http($url);
+
+ return json_decode($res, true);
+ }
+
+ // cURL函数简单封装
+ public function http($url, $data = null)
+ {
+ $curl = curl_init();
+ curl_setopt($curl, CURLOPT_URL, $url);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
+
+ if (!empty($data))
+ {
+ curl_setopt($curl, CURLOPT_POST, 1);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
+ }
+
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ $output = curl_exec($curl);
+ curl_close($curl);
+
+ return $output;
+ }
+}
\ No newline at end of file
diff --git a/app/Common/WechatCallbackApi.php b/app/Common/Wechat/WechatCallbackApi.php
similarity index 99%
rename from app/Common/WechatCallbackApi.php
rename to app/Common/Wechat/WechatCallbackApi.php
index 0fef54d..a39b445 100644
--- a/app/Common/WechatCallbackApi.php
+++ b/app/Common/Wechat/WechatCallbackApi.php
@@ -1,5 +1,5 @@
$this->component_appid);
- $result = $this->httpPost(self::API_URL_PREFIX . self::GET_PREAUTHCODE_URL . $access_token, json_encode($arr));
+ $result = $this->httpPost(self::API_URL_PREFIX . self::GET_PREAUTHCODE_URL . $component_access_token, json_encode($arr));
if ($result) {
$json = json_decode($result, true);
if (!$json || !empty($json['errcode'])) {
diff --git a/app/Common/aes/demo.php b/app/Common/Wechat/aes/demo.php
similarity index 99%
rename from app/Common/aes/demo.php
rename to app/Common/Wechat/aes/demo.php
index 896d4b8..a32fc28 100644
--- a/app/Common/aes/demo.php
+++ b/app/Common/Wechat/aes/demo.php
@@ -37,4 +37,4 @@ if ($errCode == 0) {
print("解密后: " . $msg . "\n");
} else {
print($errCode . "\n");
-}
+}
\ No newline at end of file
diff --git a/app/Common/aes/errorCode.php b/app/Common/Wechat/aes/errorCode.php
similarity index 99%
rename from app/Common/aes/errorCode.php
rename to app/Common/Wechat/aes/errorCode.php
index f56a914..cb37f17 100644
--- a/app/Common/aes/errorCode.php
+++ b/app/Common/Wechat/aes/errorCode.php
@@ -1,5 +1,4 @@
@@ -31,5 +30,4 @@ class ErrorCode
public static $DecodeBase64Error = -40010;
public static $GenReturnXmlError = -40011;
}
-
?>
\ No newline at end of file
diff --git a/app/Common/aes/pkcs7Encoder.php b/app/Common/Wechat/aes/pkcs7Encoder.php
similarity index 96%
rename from app/Common/aes/pkcs7Encoder.php
rename to app/Common/Wechat/aes/pkcs7Encoder.php
index f040fb5..bde0587 100644
--- a/app/Common/aes/pkcs7Encoder.php
+++ b/app/Common/Wechat/aes/pkcs7Encoder.php
@@ -1,5 +1,4 @@
32) {
+
+ if ($pad < 1 || $pad > 32)
+ {
$pad = 0;
}
+
return substr($text, 0, (strlen($text) - $pad));
}
}
@@ -58,12 +59,12 @@ class PKCS7Encoder
class Prpcrypt
{
public $key;
-
+
function __construct($k)
{
$this->key = base64_decode($k . "=");
}
-
+
/**
* 对明文进行加密
* @param string $text 需要加密的明文
@@ -71,7 +72,6 @@ class Prpcrypt
*/
public function encrypt($text, $appid)
{
-
try {
//获得16位随机字符串,填充到明文之前
$random = $this->getRandomStr();
@@ -97,7 +97,7 @@ class Prpcrypt
return array(ErrorCode::$EncryptAESError, null);
}
}
-
+
/**
* 对密文进行解密
* @param string $encrypted 需要解密的密文
@@ -105,7 +105,6 @@ class Prpcrypt
*/
public function decrypt($encrypted, $appid)
{
-
try {
//使用BASE64对需要解密的字符串进行解码
$ciphertext_dec = base64_decode($encrypted);
@@ -120,8 +119,7 @@ class Prpcrypt
} catch (Exception $e) {
return array(ErrorCode::$DecryptAESError, null);
}
-
-
+
try {
//去除补位字符
$pkc_encoder = new PKCS7Encoder;
@@ -141,26 +139,24 @@ class Prpcrypt
if ($from_appid != $appid)
return array(ErrorCode::$ValidateAppidError, null);
return array(0, $xml_content);
-
}
-
-
+
/**
* 随机生成16位字符串
* @return string 生成的字符串
*/
function getRandomStr()
{
-
$str = "";
$str_pol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($str_pol) - 1;
- for ($i = 0; $i < 16; $i++) {
+
+ for ($i = 0; $i < 16; $i++)
+ {
$str .= $str_pol[mt_rand(0, $max)];
}
+
return $str;
}
-
}
-
?>
\ No newline at end of file
diff --git a/app/Common/aes/sha1.php b/app/Common/Wechat/aes/sha1.php
similarity index 99%
rename from app/Common/aes/sha1.php
rename to app/Common/Wechat/aes/sha1.php
index 0a0a79e..f5e8d3f 100644
--- a/app/Common/aes/sha1.php
+++ b/app/Common/Wechat/aes/sha1.php
@@ -1,5 +1,4 @@
\ No newline at end of file
diff --git a/app/Common/Wechat/aes/wxBizDataCrypt.php b/app/Common/Wechat/aes/wxBizDataCrypt.php
new file mode 100644
index 0000000..a9079d0
--- /dev/null
+++ b/app/Common/Wechat/aes/wxBizDataCrypt.php
@@ -0,0 +1,81 @@
+
+
+ *
-41001: encodingAesKey 非法
+ * -41003: aes 解密失败
+ * -41004: 解密后得到的buffer非法
+ * -41005: base64加密失败
+ * -41016: base64解密失败
+ *
+ */
+class ErrorCode
+{
+ public static $OK = 0;
+ public static $IllegalAesKey = -41001;
+ public static $IllegalIv = -41002;
+ public static $IllegalBuffer = -41003;
+ public static $DecodeBase64Error = -41004;
+}
+
+class WXBizDataCrypt
+{
+ private $appid;
+ private $sessionKey;
+
+ /**
+ * 构造函数
+ * @param $sessionKey string 用户在小程序登录后获取的会话密钥
+ * @param $appid string 小程序的appid
+ */
+ public function __construct( $appid, $sessionKey)
+ {
+ $this->sessionKey = $sessionKey;
+ $this->appid = $appid;
+ }
+
+ /**
+ * 检验数据的真实性,并且获取解密后的明文.
+ * @param $encryptedData string 加密的用户数据
+ * @param $iv string 与用户数据一同返回的初始向量
+ * @param $data string 解密后的原文
+ *
+ * @return int 成功0,失败返回对应的错误码
+ */
+ public function decryptData( $encryptedData, $iv, &$data )
+ {
+ if (strlen($this->sessionKey) != 24) {
+ return ErrorCode::$IllegalAesKey;
+ }
+ $aesKey=base64_decode($this->sessionKey);
+
+
+ if (strlen($iv) != 24) {
+ return ErrorCode::$IllegalIv;
+ }
+ $aesIV=base64_decode($iv);
+
+ $aesCipher=base64_decode($encryptedData);
+
+ $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
+
+ $dataObj=json_decode( $result );
+ if( $dataObj == NULL )
+ {
+ return ErrorCode::$IllegalBuffer;
+ }
+ if( $dataObj->watermark->appid != $this->appid )
+ {
+ return ErrorCode::$IllegalBuffer;
+ }
+ $data = $result;
+ return ErrorCode::$OK;
+ }
+}
\ No newline at end of file
diff --git a/app/Common/aes/wxBizMsgCrypt.php b/app/Common/Wechat/aes/wxBizMsgCrypt.php
similarity index 99%
rename from app/Common/aes/wxBizMsgCrypt.php
rename to app/Common/Wechat/aes/wxBizMsgCrypt.php
index 672541b..83cf743 100644
--- a/app/Common/aes/wxBizMsgCrypt.php
+++ b/app/Common/Wechat/aes/wxBizMsgCrypt.php
@@ -1,12 +1,10 @@
generate($encrypt, $signature, $timeStamp, $nonce);
return ErrorCode::$OK;
}
-
-
+
/**
* 检验消息的真实性,并且获取解密后的明文.
*
@@ -145,6 +142,4 @@ class WXBizMsgCrypt
return ErrorCode::$OK;
}
-
-}
-
+}
\ No newline at end of file
diff --git a/app/Common/aes/xmlparse.php b/app/Common/Wechat/aes/xmlparse.php
similarity index 99%
rename from app/Common/aes/xmlparse.php
rename to app/Common/Wechat/aes/xmlparse.php
index f740847..6474ce2 100644
--- a/app/Common/aes/xmlparse.php
+++ b/app/Common/Wechat/aes/xmlparse.php
@@ -8,7 +8,6 @@ include_once "errorCode.php";
*/
class XMLParse
{
-
/**
* 提取出xml数据包中的加密消息
* @param string $xmltext 待提取的xml字符串
@@ -29,7 +28,7 @@ class XMLParse
return array(ErrorCode::$ParseXmlError, null, null);
}
}
-
+
/**
* 生成xml消息
* @param string $encrypt 加密后的消息密文
@@ -47,8 +46,5 @@ class XMLParse
";
return sprintf($format, $encrypt, $signature, $timestamp, $nonce);
}
-
}
-
-
?>
\ No newline at end of file
diff --git a/app/Common/WechatAuth.php b/app/Common/WechatAuth.php
deleted file mode 100644
index cc37d45..0000000
--- a/app/Common/WechatAuth.php
+++ /dev/null
@@ -1,103 +0,0 @@
-开发者模式->获取
- private $app_id;
- private $app_secret;
-
- public function __construct($app_id, $app_secret)
- {
- $this->app_id = $app_id;
- $this->app_secret = $app_secret;
- }
-
- /**
- * 获取微信授权链接
- *
- * @param string $redirect_uri 回调地址,授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
- * @param mixed $state 可以为空,重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
- */
- public function get_authorize_url($redirect_uri = '', $state = '')
- {
- return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->app_id."&redirect_uri=".urlencode($redirect_uri)."&response_type=code&scope=snsapi_userinfo&state=".$state."#wechat_redirect";
- }
-
- /**
- * 微信PC扫码授权登录链接
- *
- * @param string $redirect_uri 回调地址,授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
- * @param mixed $state 可以为空,重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
- */
- public function get_qrconnect_url($redirect_uri = '', $state = '')
- {
- return "https://open.weixin.qq.com/connect/qrconnect?appid".$this->app_id."&redirect_uri=".urlencode($redirect_uri)."&response_type=code&scope=snsapi_login&state=".$state."#wechat_redirect";
- }
-
- /**
- * 获取授权token
- *
- * @param string $code 通过get_authorize_url获取到的code
- */
- public function get_access_token($code = '')
- {
- $token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->app_id}&secret={$this->app_secret}&code={$code}&grant_type=authorization_code";
- $token_data = $this->http($token_url);
-
- return json_decode($token_data, true);
- }
-
- /**
- * 获取授权后的微信用户信息
- *
- * @param string $access_token
- * @param string $open_id
- */
- public function get_user_info($access_token = '', $open_id = '')
- {
- $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
- $info_data = $this->http($info_url);
-
- return json_decode($info_data, true);
- }
-
- /**
- * 获取用户基本信息(包括UnionID机制)
- *
- * @param string $access_token
- * @param string $open_id
- */
- public function get_user_unionid($access_token = '', $open_id = '')
- {
- $info_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$open_id}&lang=zh_CN";
- $info_data = $this->http($info_url);
-
- return json_decode($info_data, true);
- }
-
- // cURL函数简单封装
- public function http($url, $data = null)
- {
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
-
- if (!empty($data))
- {
- curl_setopt($curl, CURLOPT_POST, 1);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
- }
-
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
- $output = curl_exec($curl);
- curl_close($curl);
-
- return $output;
- }
-}
\ No newline at end of file
diff --git a/app/Common/aes/ReadMe.txt b/app/Common/aes/ReadMe.txt
deleted file mode 100644
index e93b8ff..0000000
--- a/app/Common/aes/ReadMe.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-ע
-1.WXBizMsgCrypt.phpļṩWXBizMsgCryptʵ֣ûҵŵĽӿࡣSample.phpṩʾԹ߲οerrorCode.php, pkcs7Encoder.php, sha1.php, xmlparse.phpļʵĸ࣬ʵ֡
-2.WXBizMsgCryptװ DecryptMsg, EncryptMsgӿڣֱڿ߽ԼظϢļܡʹ÷ԲοSample.phpļ
-3.ӽЭοŹƽ̨ٷĵ
\ No newline at end of file
diff --git a/app/Http/Controllers/Admin/WeixinMenuController.php b/app/Http/Controllers/Admin/WeixinMenuController.php
index 0c8d4a5..09e0a64 100644
--- a/app/Http/Controllers/Admin/WeixinMenuController.php
+++ b/app/Http/Controllers/Admin/WeixinMenuController.php
@@ -6,7 +6,7 @@ use App\Common\Helper;
use Illuminate\Http\Request;
use App\Http\Logic\WeixinMenuLogic;
use App\Http\Model\WeixinMenu;
-use App\Common\WechatMenu;
+use App\Common\Wechat\WechatMenu;
class WeixinMenuController extends CommonController
{
diff --git a/app/Http/Controllers/Api/ImageController.php b/app/Http/Controllers/Api/ImageController.php
index 258f07f..1eafbbd 100644
--- a/app/Http/Controllers/Api/ImageController.php
+++ b/app/Http/Controllers/Api/ImageController.php
@@ -207,4 +207,54 @@ class ImageController extends CommonController
return $fileArray;
}
+
+ /**
+ * base64图片上传,成功返回路径,不含域名,只能单图上传
+ * @param string img base64字符串
+ * @return string
+ */
+ public function base64ImageUpload(Request $request)
+ {
+ $res = [];
+ $base64_img = $_POST['img'];
+
+ if($base64_img)
+ {
+ if(preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result))
+ {
+ $type = $result[2];
+ if(in_array($type, array('jpeg','jpg','gif','bmp','png')))
+ {
+ $image_path = $this->path.'/'.date('Ymdhis',time()).rand(1000,9999).'.'.$type;
+ $uploads_path = $this->path; //存储路径
+
+ if(!file_exists($this->public_path.$uploads_path))
+ {
+ Helper::createDir($this->public_path.$uploads_path); //创建文件夹;
+ }
+
+ if(file_put_contents($this->public_path.$image_path, base64_decode(str_replace($result[1], '', $base64_img))))
+ {
+ return ReturnData::create(ReturnData::SUCCESS,null,$image_path);
+ }
+ else
+ {
+ return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'图片上传失败');
+ }
+ }
+ else
+ {
+ //文件类型错误
+ return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'图片上传类型错误');
+ }
+ }
+ else
+ {
+ //文件错误
+ return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'文件错误');
+ }
+ }
+
+ return ReturnData::create(ReturnData::SYSTEM_FAIL,null,'请上传文件');
+ }
}
\ No newline at end of file
diff --git a/app/Http/Controllers/Api/NotifyController.php b/app/Http/Controllers/Api/NotifyController.php
index 9c3d2f1..628b407 100644
--- a/app/Http/Controllers/Api/NotifyController.php
+++ b/app/Http/Controllers/Api/NotifyController.php
@@ -24,7 +24,9 @@ class NotifyController extends CommonController
Log::info('微信支付回调数据:'.$GLOBALS['HTTP_RAW_POST_DATA']);
//获取通知的数据
- $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
+ //$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
+ $xml = file_get_contents("php://input");
+
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
diff --git a/app/Http/Controllers/Weixin/UserController.php b/app/Http/Controllers/Weixin/UserController.php
index 5ed85db..c9f74c2 100644
--- a/app/Http/Controllers/Weixin/UserController.php
+++ b/app/Http/Controllers/Weixin/UserController.php
@@ -5,7 +5,7 @@ use App\Http\Controllers\Weixin\CommonController;
use Illuminate\Http\Request;
use App\Common\ReturnCode;
use App\Common\ReturnData;
-use App\Common\WechatAuth;
+use App\Common\Wechat\WechatAuth;
use App\Common\Helper;
class UserController extends CommonController
diff --git a/app/Http/Service/Smsbao.php b/app/Http/Service/Smsbao.php
new file mode 100644
index 0000000..f1bb861
--- /dev/null
+++ b/app/Http/Service/Smsbao.php
@@ -0,0 +1,86 @@
+ "短信发送成功",
+ "-1" => "参数不全",
+ "-2" => "服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间!",
+ "30" => "密码错误",
+ "40" => "账号不存在",
+ "41" => "余额不足",
+ "42" => "帐户已过期",
+ "43" => "IP地址限制",
+ "50" => "内容含有敏感词"
+ );
+
+ public function __construct($user_name, $password)
+ {
+ $this->user_name = $user_name;
+ $this->password = $password;
+ }
+
+ /**
+ * 国内短信
+ *
+ * @param string $sms_content 要发送的短信内容
+ * @param string $sms_phone 接收的手机号,单发:15205201314,群发:15205201314,15205201315,群发时多个手机号以逗号分隔,一次不要超过99个号码
+ * return string
+ */
+ public function sms($sms_content, $sms_phone)
+ {
+ $user = $this->user_name; //短信平台帐号
+ $pass = md5($this->password); //短信平台密码
+ $content = $sms_content; //要发送的短信内容
+ $phone = $sms_phone; //要发送短信的手机号码
+ $sendurl = $this->smsapi."sms?u=".$user."&p=".$pass."&m=".$phone."&c=".urlencode($content);
+ $result = file_get_contents($sendurl) ;
+
+ return $this->status_str[$result];
+ }
+
+ /**
+ * 国际短信
+ *
+ * @param string $sms_content 要发送的短信内容
+ * @param string $sms_phone 接收的手机号,单发:+60901234567,群发:+60901234567,+60901234567,群发时多个手机号以逗号分隔,一次不要超过99个号码,注:国际号码需包含国际地区前缀号码,格式必须是"+"号开头("+"号需要urlencode处理,如:urlencode("+60901234567")否则会出现格式错误)
+ * return string
+ */
+ public function wsms($sms_content, $sms_phone)
+ {
+ $user = $this->user_name; //短信平台帐号
+ $pass = md5($this->password); //短信平台密码
+ $content = $sms_content; //要发送的短信内容
+ $phone = $sms_phone; //要发送短信的手机号码
+ $sendurl = $this->smsapi."wsms?u=".$user."&p=".$pass."&m=".$phone."&c=".urlencode($content);
+ $result = file_get_contents($sendurl) ;
+
+ return $this->status_str[$result];
+ }
+
+ /**
+ * 语音验证码发送
+ *
+ * @param string $sms_code 发送的验证码
+ * @param string $sms_phone 目标手机号码
+ * return string
+ */
+ public function voice($sms_code, $sms_phone)
+ {
+ $user = $this->user_name; //短信平台帐号
+ $pass = md5($this->password); //短信平台密码
+ $content = $sms_code; //要发送的短信内容
+ $phone = $sms_phone; //要发送短信的手机号码
+ $sendurl = $this->smsapi."voice?u=".$user."&p=".$pass."&m=".$phone."&c=".urlencode($content);
+ $result = file_get_contents($sendurl) ;
+
+ return $this->status_str[$result];
+ }
+}
\ No newline at end of file
diff --git a/public/images/pcscreenshots1.jpg b/public/images/pcscreenshots1.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fc61f93617156bb040620f3bbb4af223c3cb3fa7
GIT binary patch
literal 139313
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%0AFF&t)
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