才開始学习微信开发模式和PHP,在此记录以供后阅。

<?php
/**
* wechat php test
*/ //define your token
define( "TOKEN", "weixin" );
$wechatObj = new wechatCallbackapiTest();
if ( !isset( $_GET['echostr'] ) ) {
$wechatObj->responseMsg();
}else {
$wechatObj->valid();
}
class wechatCallbackapiTest {
public function valid() {
$echoStr = $_GET["echostr"];
//valid signature , option
if ( $this->checkSignature() ) {
echo $echoStr;
exit;
}
} public function responseMsg() {
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data
if ( !empty( $postStr ) ) {
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader( true );
$postObj = simplexml_load_string( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
$RX_TYPE = trim( $postObj->MsgType );
switch ( $RX_TYPE ) {
case "text":
$resultStr = $this->receiveText( $postObj );
break;
case "event":
$resultStr = $this->receiveEvent( $postObj );
break;
default:
$resultStr = "";
break;
}
echo $resultStr;
} else {
echo "";
exit;
}
} private function receiveText( $object ) {
$getkeyword = $object->Content;
switch ( $getkeyword ) {
case '产品':
$funcFlag = 0;
$contentStr = "产品链接:http://www.xxx.com/products/";
$resultStr = $this->transmitText( $object, $contentStr, $funcFlag );
break;
case '新闻':
$funcFlag = 0;
$contentStr ="新闻链接:http://www.xxx.com/news/";
$resultStr = $this->transmitText( $object, $contentStr, $funcFlag );
break;
case '方案':
$funcFlag = 0;
$contentStr ="方案链接:http://www.xxx.com/articles/";
$resultStr = $this->transmitText( $object, $contentStr, $funcFlag );
break;
case '我们':
$funcFlag = 0;
$contentStr ="我们链接:http://www.xxx.com/culture/? type=detail&id=1";
$resultStr = $this->transmitText( $object, $contentStr, $funcFlag );
break;
default:
break;
} return $resultStr;
} private function receiveEvent( $object ) {
$contentStr = "";
switch ( $object->Event ) {
case "subscribe":
$contentStr = "欢迎您关注xxx";
case "unsubscribe":
break;
case "CLICK":
switch ( $object->EventKey ) {
case "V1001_GETCODE":
$contentStr = "xxx";
break;
case "V1002_HISTORY":
$contentStr[] = array( "Title" =>"最后一条历史记录",
"Description" =>"xxx",
"PicUrl" =>"xxx",
"Url" =>"xxx" );
break;
case "V2001_INTERDUCE":
$contentStr[] = array( "Title" =>"xxx",
"Description" =>"xxx",
"Url" =>"http://mp.weixin.qq.com/xxx" );
break;
case "V3001_JOIN":
$getuid = $this->getUid( $object );
if ( $getuid==1 ) {
$contentStr = 'Could not connect: '.mysql_error();
}else {
$contentStr = "唯一码:".$getuid;
}
break;
default:
$contentStr[] = array( "Title" =>"默认菜单回复",
"Description" =>"xxx",
"PicUrl" =>"xxx",
"Url" =>"xxx" );
break;
}
break;
default:
break; }
if ( is_array( $contentStr ) ) {
$resultStr = $this->transmitNews( $object, $contentStr );
}else {
$resultStr = $this->transmitText( $object, $contentStr );
}
return $resultStr;
} private function transmitText( $object, $content, $funcFlag = 0 ) {
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>%d</FuncFlag>
</xml>";
$resultStr = sprintf( $textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $funcFlag );
return $resultStr;
} private function transmitNews( $object, $arr_item, $funcFlag = 0 ) { 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>
<FuncFlag>%s</FuncFlag>
</xml>";
$resultStr = sprintf( $newsTpl, $object->FromUserName, $object->ToUserName, time(), count( $arr_item ), $funcFlag );
return $resultStr;
} /* 生成唯一码*/
public function getUid( $object ) {
$getOpenid = $object->FromUserName;
$con = mysql_connect( "localhost", "root", "xxx" );
mysql_select_db( "xxx", $con );
if ( !$con ) {
return 1;
}
$flag = true;
$getUserresult = mysql_query( "SELECT * FROM loginuser WHERE openid = '".$getOpenid."'" );
$getuserrow = mysql_num_rows( $getUserresult );
if ( $getuserrow>0 ) {
$userrow = mysql_fetch_array( $getUserresult );
if ( $userrow['state']==0 ) {
return $userrow['userPassword']."[未完毕考试]";
$flag = false;
}else {
return $userrow['userPassword']."[已完毕考试]";
$flag = false;
}
}
/* 循环确定唯一性 */
while ( $flag ) {
$uid = uniqid( true );
$uid = substr( $uid, -8 );
$result = mysql_query( "SELECT * FROM loginuser where userPassword = '".$uid."'" );
$row = mysql_num_rows( $result );
if ( $row == 0 ) {
mysql_query( "INSERT INTO loginuser (userPassword,state,openid) VALUES ('".$uid."','0','".$getOpenid."')" );
mysql_close( $con );
return $uid;
$flag =false; }
} }
private function getUidtest( $object ) {
return $object->FromUserName;
}
private function checkSignature() {
// you must define TOKEN by yourself
if ( !defined( "TOKEN" ) ) {
throw new Exception( 'TOKEN is not defined!' );
} $signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"]; $token = TOKEN;
$tmpArr = array( $token, $timestamp, $nonce );
// use SORT_STRING rule
sort( $tmpArr, SORT_STRING );
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr ); if ( $tmpStr == $signature ) {
return true;
}else {
return false;
}
}
} ?>

微信开发模式(php)的更多相关文章

  1. 微信开发模式 api 接口文档简介

    微信公众平台分为订阅号和服务号,服务号提供9大接口,需要通过微信认证后才能使用这些接口.认证费用300元.下面是接口的大致介绍: 1. 语音识别:通过语音识别接口,用户发送的语音,将会同时给出语音识别 ...

  2. 【微信开发】微信开发模式 api 接口文档简介

    微信公众平台分为订阅号和服务号,服务号提供9大接口,需要通过微信认证后才能使用这些接口.认证费用300元.下面是接口的大致介绍: 1. 语音识别:通过语音识别接口,用户发送的语音,将会同时给出语音识别 ...

  3. java微信开发

    所谓的微信开发就是在微信开发模式之下,对微信进行公众号和企业号的扩展开发.     如果要让你的微信公众号有更多的功能,比如菜单支持,自动的信息服务,查询,消息推送等,就必须开启微信的开发模式.进入微 ...

  4. 《C#微信开发系列(1)-启用开发者模式》

    1.0启用开发者模式 ①填写服务器配置 启用开发模式需要先成为开发者,而且编辑模式和开发模式只能选择一个(进入微信公众平台=>开发=>基本配置)就可以看到以下的界面: 点击修改配置,会出现 ...

  5. 使用delphi+intraweb进行微信开发2—intraweb以.net方式发布(以asp.net mvc4模式部署)在IIS(.net虚拟主机)上

    在第一讲使用delphi+intraweb进行微信开发1--微信平台接入中我们编写了一个简单的微信接口程序,这个程序我是用Stand Alone Server / Service 方式编译的程序,并且 ...

  6. 如何用php开启企业微信开发的回调模式

    猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/ ...

  7. php微信开发 -- 两种运营模式及服务器配置

    微信的两种运营模式 编辑模式:使用微信公众平台提供的功能 开发者模式:通过腾讯的api接口调用相应程序进行二次开发 编辑模式 应用场景: l 不具备开发能力的运营者 l 主要是进行品牌宣传.新闻媒体. ...

  8. 微信公众帐号开发教程第4篇-----开发模式启用及接口配置Java

    欢迎加入群:347245650   345531810 进行讨论相互交流  我的微信号:572839485 我的微信公众账号  我的微社区欢迎关注 索取源码←请点击 图床:没有服务器 拖拽图片 外网即 ...

  9. 微信小程序:首页设置方法(开发模式,使用模式)与其他相关设置

    小程序开发并不愉快,许多必建的文件不会自动生成,页面之间的跳转没有快捷键,开发者工具显示区域受限……如果谁有对应的解决办法求告知…… 开始的时候每次保存代码,页面都会刷洗重新渲染一次,而且自动跳回首页 ...

随机推荐

  1. 【栈思想、DP】NYOJ-15 括号匹配(二)

    括号匹配(二) 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能 ...

  2. shell 删除日志

    一般线上服务的日志都是采用回滚的防止,写一定数量的日志 或是有管理工具定期去转移老旧日志 前几天删除一个测试环境的日志,只保留两天的日志,结果把正在写的日志都给删掉了,不得不重启了服务,经过这一次的错 ...

  3. 使用carrierwave出现MiniMagick::Invalid错误的解决方法

    安装Imagemagick不能从源码安装,要从软件市场安装,否则会出现错误:MiniMagick::Invalid 使用make uninstall卸载后,重新在软件市场里安装,问题解决.

  4. 【转】SDP file

    SDP file Introduction The Session Description Protocol (SDP) is a format for describing the initiali ...

  5. Android中不混淆类中函数

    情况一:混淆不同的函数aTest.bTest -keep class com.zony.Test { void aTest(byte[], int, int); void bTest(String, ...

  6. HDU5764 After a Sleepless Night 树形乱搞题

    分析(官方题解): 假设根已确定,可以发现新树若合法,需满足以下性质:根节点是n:儿子的值不大于父亲:具有相同值的节点形成一条链,并且链不会发生“分叉”(即有多个最低点).所以对于新树中有出现的值x, ...

  7. XShell 屏幕锁定的恢复方法(Ctrl+Q)

    操作XShell过程中很多时间大家会习惯性的按Ctrl+S进行保存. Ctrl+S在XShell的作用是屏幕锁定,很多朋友会无法操作,会直接把窗口关闭. 解决方法: 快捷键 Ctrl+Q 即能完成解锁 ...

  8. 纯css实现扁平化360卫士logo demo

    前几天在w3ctech上看到有人用纯css写出了360卫士的logo,感觉蛮好玩的. 因为自己用css以来,还没有写过这种玩意,出于娱乐,我也来试着尝试一下. 开始也不知到怎么下手,最棘手的是那两个像 ...

  9. 如何避免JavaScript的内存泄露及内存管理技巧

    发表于谷歌WebPerf(伦敦WebPerf集团),​​2014年8月26日. 高效的JavaScript Web应用必须流畅,快速.与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果 ...

  10. AHOI2013 Round2 Day1 简要题解

    第一题,好吧这是个dp.(搜素也能在BZOJ上卡过). 第二题,BFS搜索碰到的立方体面数,智硬没有想到... 第三题,其实一看就有思路,但关键是求x坐标不交的矩形对数+y坐标不交的矩形对数 - x, ...