此功能是为了完成一个影像大赛的小项目,客户在公众号内发送影像大赛字样或点击影像大赛按钮即可按照要求输入个人信息参加比赛。
微信公众号都需要一个重要的配置文件,用于管理收发用户信息,与客户交互,这个不多说。
直接上代码。
wx.php页面
<?php
header('Content-type:text');
define("TOKEN", "weixin");
//此处引入数据库配置文件
include("php/dbconfig.php");
$_SERVER['$conn']=mysqli_connect($host,$db_user,$db_pass,$db_name);
date_default_timezone_set($timezone); //北京时间
//此公众号的appid与APPsecret
$_SERVER['$appid'] = "wxxxxxxxxxxxxxxx00";
$_SERVER['$appsecret'] = "9xxxxxxxxxxxxxxxxxxxxxxxxxxxe";
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//$postStr = file_get_contents('php://input');
if (!empty($postStr)){
$this->logger("R ".$postStr);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch ($RX_TYPE)
{
case "event":
$result = $this->receiveEvent($postObj);
break;
case "text":
$result = $this->receiveText($postObj);
break;
//接受图片信息处理事件
case "image":
$this->logger("R "."处理图片消息");
$result = $this->receiveImage($postObj);
break;
//接受视频处理事件
case "video":
$this->logger("R "."处理视频消息");
$result = $this->receiveVideo($postObj);
break;
}
$this->logger("T ".$result);
echo $result;
}else {
echo "";
exit;
}
}
public function mkThumbnail($src, $width, $filename) {
if (!isset($width) && !isset($height))
return false;
if (isset($width) && $width <= 0)
return false;
//if (isset($height) && $height <= 0)
// return false;
$size = getimagesize($src);
if (!$size)
return false;
list($src_w, $src_h, $src_type) = $size;
$src_mime = $size['mime'];
switch($src_type) {
case 1 :
$img_type = 'gif';
break;
case 2 :
$img_type = 'jpeg';
break;
case 3 :
$img_type = 'png';
break;
case 15 :
$img_type = 'wbmp';
break;
default :
return false;
}
//if (!isset($width))
// $width = $src_w * ($height / $src_h);
//if (!isset($height))
$height = $src_h * ($width / $src_w);
$imagecreatefunc = 'imagecreatefrom' . $img_type;
$src_img = $imagecreatefunc($src);
$dest_img = imagecreatetruecolor($width, $height);
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $width, $height, $src_w, $src_h);
$imagefunc = 'image' . $img_type;
if ($filename) {
$imagefunc($dest_img, $filename);
}
else {
// header('Content-Type: ' . $src_mime);
// $imagefunc($dest_img);
}
imagedestroy($src_img);
imagedestroy($dest_img);
return true;
}
// 接收图片信息
private function receiveImage($object)
{
// $mediaid=$object->MediaId;
//获取用户在公众号的唯一标志符openID
$fromusername=$object->FromUserName;
$picurl=$object->PicUrl;
function downloadWeixinFile($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package=curl_exec($ch);
curl_close($ch);
return $package;
}
function saveWeixinFile($filename,$filecontent){
$local_file=fopen($filename,'w');
if(false!==$local_file){
if(false!==fwrite($local_file, $filecontent)){
fclose($local_file);
}
}
}
echo "success";
$sql3 = "SELECT * from 表名 WHERE openId='$fromusername' and mark='0' and isDeleted=0 order by createTime desc limit 1";
$query3 = mysqli_query($_SERVER['$conn'], $sql3);
$row3=mysqli_fetch_array($query3);
$time=time();
if($row3!=null){
$id=$row3['id'];
$url=$picurl;
$fileInfo=downloadWeixinFile($url);
//源文件
$filename="img/".$fromusername.$time.".jpg";
//压缩图片
$filename2="img/".$fromusername.$time."_s".".jpg";
saveWeixinFile($filename,$fileInfo);
$this->mkThumbnail($filename, 484, $filename2);
//判断用户姓名,手机,作品名是否已全部填完
if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['imgsrc']==""){
$sql2 = "UPDATE 表名 SET imgsrc='$filename2',mark='1',kind='1' WHERE id='$id'";
$query2 = mysqli_query($_SERVER['$conn'], $sql2);
$content ="感谢您提交作品参赛!现在您可以<a href='http://www.xxxxxx.com/xxxx/index.html'>去欣赏参赛作品</a>。";
}else if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['img']!=""){
$content ="观迎关注";
}else{
$content ="观迎关注";
}
}else{
$content ="观迎关注";
}
$result = $this->transmitText($object, $content);
return $result;
}
// 接收视频信息
private function receiveVideo($object)
{
$mediaid=$object->MediaId;
$thumbmediaid=$object->ThumbMediaId;
$fromusername=$object->FromUserName;
// $content=$thumbmediaid;
function downloadWeixinFile($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package=curl_exec($ch);
curl_close($ch);
return $package;
}
function saveWeixinFile($filename,$filecontent){
$local_file=fopen($filename,'w');
if(false!==$local_file){
if(false!==fwrite($local_file, $filecontent)){
fclose($local_file);
}
}
}
$appid=$_SERVER['$appid'];
$appsecret=$_SERVER['$appsecret'];
//Get access_token
$access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $access_token_url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
if (curl_errno($curl)){
return 'ERROR'.curl_error($curl);
}
curl_close($curl);
$access_token_array = json_decode($data,1);//对 JSON 格式的字符串进行解码,转换为 PHP 变量,自带函数
//获取access_token
$access_token = $access_token_array['access_token'];//获取access_token对应的值
$url="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$access_token&media_id=$thumbmediaid";
$url2="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$access_token&media_id=$mediaid";
$time=time();
echo "success";
$sql3 = "SELECT * from 表名 WHERE openId='$fromusername' and mark='0' and isDeleted=0 order by createTime desc limit 1";
$query3 = mysqli_query($_SERVER['$conn'], $sql3);
$row3=mysqli_fetch_array($query3);
if($row3!=null){
$id=$row3['id'];
$fileInfo=downloadWeixinFile($url);
//视频缩略图
$filename="video/".$fromusername.$time.".jpg";
saveWeixinFile($filename,$fileInfo);
$fileInfo2=downloadWeixinFile($url2);
//视频源文件
$filename2="videosrc/".$fromusername.$time.".mp4";
saveWeixinFile($filename2,$fileInfo2);
if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['video_img']==""){
$sql2 = "UPDATE 表名 SET video_img='$filename',videosrc='$filename2',mark='1',kind='0' WHERE openId='$fromusername' and id='$id'";
$query2 = mysqli_query($_SERVER['$conn'], $sql2);
$content ="感谢您提交作品参赛!现在您可以<a href='http://www.xxxxx.com/xxxxx/index.html'>去欣赏参赛作品</a>";
}else if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""&&$row3['video_img']!=""){
$content ="观迎关注";
}else{
$content ="观迎关注";
}
}else{
$content ="观迎关注";
}
$result = $this->transmitText($object, $content);
return $result;
}
private function receiveEvent($object)
{
$fromusername=$object->FromUserName;
$content = "";
switch ($object->Event)
{
case "subscribe":
$content = "欢迎关注";
break;
case "unsubscribe":
$content = "取消关注";
break;
case "CLICK":
if($object->EventKey =="yxds_submit"){
$sql6 = "DELETE from 表名 where openId='$fromusername' and mark = 0";
$query6 = mysqli_query($_SERVER['$conn'], $sql6);
$createTime=date('Y-m-d H:i:s', time());
$sql="INSERT into 表名 (openId,createTime,isDeleted,mark,clicks,praise,frost) values ('$fromusername','$createTime','0','0','0','0','0')";
$query=mysqli_query($_SERVER['$conn'], $sql);
if(!$query){
$this->logger("失败");
$content = "记录失败";
}else{
$content = "欢迎参赛,作品提交完成前,您可以随时发送“取消”一词(不含引号)退出报名。请输入并发送您的姓名";
}
}else{
$content = "欢迎关注";
}
break;
}
$result = $this->transmitText($object, $content);
return $result;
}
//接收文本消息
private function receiveText($object)
{
$keyword = trim($object->Content);
$fromusername=$object->FromUserName;
if($keyword=="影像大赛"){
$sql6 = "DELETE from 表名 where openId='$fromusername' and mark = 0";
$query6 = mysqli_query($_SERVER['$conn'], $sql6);
$createTime=date('Y-m-d H:i:s', time());
$sql="INSERT into 表名 (openId,createTime,isDeleted,mark,clicks,praise,frost) values ('$fromusername','$createTime','0','0','0','0','0')";
$query=mysqli_query($_SERVER['$conn'], $sql);
if(!$query){
$this->logger("失败");
$content = "记录失败";
}else{
$content = "欢迎参赛,作品提交完成前,您可以随时发送“取消”一词(不含引号)退出报名。请输入并发送您的姓名";
}
}else if($keyword=="作品欣赏"){
$content ="http://www.xxxxxxx.com/xxxxx/index.html";
}else if(strpos($keyword,'取消')!== false){
$sql7="SELECT COUNT(*) FROM 表名 where openId='$fromusername' and mark=0 and isDeleted = 0";
$count=mysqli_fetch_array(mysqli_query($_SERVER['$conn'], $sql7))[0];
if($count>0){
$sql4 = "DELETE from 表名 where openId='$fromusername' and mark = 0";
$query4 = mysqli_query($_SERVER['$conn'], $sql4);
$content = "已经退出报名,期待您下次提交作品。";
}else{
$content ="欢迎关注";
}
}else{
$sql3 = "SELECT * from 表名 WHERE openId='$fromusername' and mark=0 and isDeleted = 0 order by createTime desc ";
$query3 = mysqli_query($_SERVER['$conn'], $sql3);
$row3=mysqli_fetch_array($query3);
if($row3==null){
$content ="欢迎关注";
}else{
$id=$row3['id'];
if($row3['name']==""){
$sql2 = "UPDATE 表名 SET name='$keyword' WHERE openId='$fromusername' and id='$id'";
$query2 = mysqli_query($_SERVER['$conn'], $sql2);
$content ="请输入并发送您的手机号码。";
}else if($row3['phone']==""){
$sql2 = "UPDATE 表名 SET phone='$keyword' WHERE openId='$fromusername' and id='$id'";
$query2 = mysqli_query($_SERVER['$conn'], $sql2);
$content ="请输入并发送您参赛作品的标题。";
}else if($row3['title']==""){
$sql2 = "UPDATE 表名 SET title='$keyword' WHERE openId='$fromusername' and id='$id'";
$query2 = mysqli_query($_SERVER['$conn'], $sql2);
$content ="请发送您的参赛作品(单张照片或视频)。";
}else if($row3['name']!=""&&$row3['phone']!=""&&$row3['title']!=""){
$content ="欢迎关注";
}
}
mysqli_close($_SERVER['$conn']);
}
$result = $this->transmitText($object, $content);
return $result;
}
private function transmitText($object, $content)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
private function transmitNews($object, $arr_item)
{
if(!is_array($arr_item))
return;
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "";
foreach ($arr_item as $item)
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";
$result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
return $result;
}
private function transmitMusic($object, $musicArray)
{
$itemTpl = "<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";
$item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
private function logger($log_content)
{
if(isset($_SERVER['HTTP_APPNAME'])){ //SAE
//sae_set_display_errors(false);
//sae_debug($log_content);
//sae_set_display_errors(true);
}else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
$max_size = 10000;
$log_filename = "log.xml";
if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);
}
}
}
?>
如有疑问可在下方评论——