【转】微信公众平台配置

http://www.cnblogs.com/mchina/archive/2013/06/05/3108618.html

微信公众平台开发(二) 微信公众平台示例代码分析http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html

一、简介

微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字、图片、语音的全方位沟通、互动。

二、通讯机制

三、注册微信平台公众帐号

注册地址:https://mp.weixin.qq.com

四、服务器端配置

4.1 示例代码设置

微信公众平台提供了一个php示例代码:

http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip

下载下来,解压缩,打开编辑。

将token值设置为你所需要的值,token可由开发者任意填写,用作生成签名。

编辑完保存并关闭文件,将文件wx_sample.php 更改成自定义的名字,这里改为wxapi.php,再次打包成wxapi.zip。

4.2 服务器平台设置

如果有自己的服务器,而且支持php,可以将接口文件上传至服务器,如果没有自己的服务器,则可以选择部分免费的云平台进行开发,如百度应用引擎BAE(http://developer.baidu.com/bae),新浪云平台SAE(http://sae.sina.com.cn/)。

4.2.1 百度BAE设置

a. 注册BAE帐户并登录

https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F

b. 加入开发者中心

c. 创建应用

接入方式选择 “手机web应用”。

d. 托管设置

选择云环境(BAE)-> 托管设置。

环境类型 选择 “PHP”。

e. 创建新版本,上传接口文件

f. 上线并获取链接

获得的URL为:http://zhuojin.duapp.com/

注:zhuojinsz 之前已经被我注册过了,所以不能再次注册。这里应该获得的二级域名应该和上面的截图中写的一样。

BAE 设置完毕。

4.2.2 新浪SAE设置

a. 注册SAE帐户并登录

http://sae.sina.com.cn/

b. 创建新应用

我的首页 -> 创建新应用

c. 配置应用

d. 上传代码

应用管理 -> 代码管理 -> 上传代码包

e. 获取URL地址

获得的URL 地址为:http://1.zhuojin.sinaapp.com/

SAE 配置完毕。

五、配置接口

5.1 登录微信公众平台 -> 高能功能 -> 开发模式

5.2 成为开发者

5.3 接口配置信息

URL填写上面得到的BAE URL:http://zhuojin.duapp.com/,再加上上传的php文件名。即 http://zhuojin.duapp.com/wxapi.php

Token 填写自定义的token 值,这里为zhuojinsz。

对于SAE,URL填写 http://1.zhuojin.sinaapp.com/wxapi.php

5.4 提交

点击 “提交”,若一切设置正确,则会提示 “提交成功”。

5.5 查看接口配置信息

BAE 接口信息

SAE 接口信息

5.6 开启开发模式

至此,配置完毕。

六、关注

请关注 卓锦苏州 微信公众帐号,卓锦苏州 基于SAE 平台开发,针对于主流的微信功能进行开发测试。

您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

1. 登录微信客户端,通讯录 -> 添加朋友 -> 查找公众号 -> zhuojinsz,查找并关注。

2. 扫描二维码:

卓锦苏州 小黄鸡测试。

[算法]求最大连续子数组和的PHP程序

之前遇到过这样一道题目:一个任意长度的整数数组{1,-3,4,5,6,7,-6,10,-15},求最大的连续子数组和。这里就是4,5,6,7,-6,10的和。这道题运用动态规划的思想,找以数组下标i位置的最大和Max[i]。
Max[i] = (Max[i-1] > 0) ? (Max[i-1] + Max[i] ) : Max[i];
之后在所有Max[i]中求一个最大值即可,时间复杂度为O(n),以下程序用php代码写出:

<?php  
function maxArr($arr) {  
  
    $max    = $arr[0]; //最大值  
    $endMax = $arr[0]; //以KEY结尾的最大值  
  
    foreach($arr as $key => $value) {  
        if($key == 0) {  
            //以0结尾作为开始,这里直接跳过  
            continue;  
        }  
  
        $endMax = ($endMax > 0) ?  ($endMax + $value) : $value;  //以$key结尾的数组最大值  
        $max    = ($endMax > $max) ? $endMax : $max;             //总的最大值  
    }  
    return $max;  
}  
//测试用例  
$test = array(-1,4,5,6,-10,12,-2,1);  
echo maxArr($test);  

Yii框架下安装xhprof

xhprof 是一款非常不错的php性能分析工具,由facebook开发,有直观的图形分析,可以看到各个流程的性能损耗。下面是在Yii框架下安装xhprof
1,安装xhprof
如果安装了php,很简单执行:pecl install xhprof 就可以了
否则找个靠谱的源 sudo yum install xhprof 也可以
2,配置php.ini

1 view plaincopy
[xhprof]  
extension=xhprof.so  
xhprof.output_dir=/home/work/tmp/xhprof  

其中oupput_idr 是输出文件的目录
3,安装libpng

wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz  
tar zxf libpng-1.5.1.tar.gz  
cd libpng-1.5.1  
./configure  
make  
make install 

或者直接sudo yum install libpng* 简单
4 安装Graphviz

 
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz  
tar zxf graphviz-2.24.0.tar.gz  
cd graphviz-2.24.0  
./configure --with-png=yes
make  
make install

5 配置nginx


server {  
    listen 8088;  
    root /home/work/local/php-5.5.18/lib/php/xhprof_html;  
  
    location @php {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME "$document_root/index.php";  
        fastcgi_pass php;  
    }     
  
    location ~ /robots\.(txt|php) {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME "$document_root/robots.php";  
        fastcgi_pass php;  
    }     
  
    location ~ \.php$ {  
        include fastcgi_params;  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        fastcgi_pass php;  
        fastcgi_index index.php;  
    }     
  
  
    location / {   
        try_files $uri @php;  
    }     
}  

重启nginx , nginx -s reload
重启php-fpm , pkill -USR2 php-fpm, php-fpm
6 配置Yii框架下使用xhprof
找到protected目录下的yii.php
加入以下代码

public static function createApplication($class,$config=null) {  
<span style="white-space:pre">    </span>$app->attachEventHandler("onBeginRequest", function() {  
                xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);  
            });   
       $app->attachEventHandler("onEndRequest", function() use ($app) {  
                $data = xhprof_disable();   //返回运行数据  
                include_once "xhprof_lib/utils/xhprof_runs.php";  
                $objXhprofRun = new XHProfRuns_Default();   
                $run_id = $objXhprofRun->save_run($data, $app->name);  
            });   
}  

7 结束
打开你的任意网页,会在/home/work/tmp/xhprof目录下产生性能分析文件,之后通过localhost:8088/index.php就可以访问文件了,点击view_all_callgraph还可以看到直观的性能分析图。

[VIM]Linux下打造自己的IDE

对于用惯IDE的同学,突然用Vim会发现没有那么快捷和方便,以下用到的三个插件能打造VIM 比较方便的效果,先看效果:

要用到如此效果需要三个插件:
一 NERDTree
下载地址:http://www.vim.org/scripts/script.php?script_id=1658
然后解压,解压缩后把plugin,doc,syntax,nerdtree_plugin四个目录复制到/usr/share/vim/vim73/目录下,即可完成安装。
之后输入:NERDTre就可以打开
二 安装Taglist
taglist
下载下载Taglist
cp doc/taglist.txt /usr/share/vim/vim72/doc/
cp plugin/taglist.vim /usr/share/vim/vim72/plugin/
安装ctags => ctags -R
vimrc
let Tlist_Show_One_File=1 “只显示当前文件的tags
let Tlist_WinWidth=40 “设置taglist宽度
let Tlist_Exit_OnlyWindow=1 “tagList窗口是最后一个窗口,则退出Vim
let Tlist_Use_Right_Window=1 “在Vim窗口右侧显示taglist窗口
:Tlist就可以打开Taglist ,显示所有变量和函数
三 winmanager
前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!

分别从http://www.vim.org/scripts/script.php?script_id=1658
http://www.vim.org/scripts/script.php?script_id=159
http://www.vim.org/scripts/script.php?script_id=95
下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。
1)像其它插件一样,将NERDTree安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行”helptags .”命令。
2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。
3)在~/.vimrc文件中加入以下几行:

let g:miniBufExplMapWindowNavVim = 1   
let g:miniBufExplMapWindowNavArrows = 1   
let g:miniBufExplMapCTabSwitchBufs = 1   
let g:miniBufExplModSelTarget = 1  
let g:miniBufExplMoreThanOne=0 

4)将Winmanager安装包解压到~/.vim目录。
5)在~/.vimrc文件中加入以下几行

let g:NERDTree_title="[NERDTree]"  
let g:winManagerWindowLayout="NERDTree|TagList"  
  
function! NERDTree_Start()  
    exec 'NERDTree'  
endfunction  
  
function! NERDTree_IsValid()  
    return 1  
endfunction  
  
nmap wm :WMToggle<CR> 

6)这个版本的Winmanager好像有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

1 view plaincopy
function! <SID>ToggleWindowsManager()  
   if IsWinManagerVisible()  
      call s:CloseWindowsManager()  
   else  
      call s:StartWindowsManager()  
      exe 'q'  
   end  
endfunction

到这里,就大功告成了!
好啦 可以愉快的使用VIM了!!~~

c++函数实现*的正则匹配判断功能

今天在面试的时候面试官出了一道算法题,给出字符串a和字符串b,其中字符串a含有*,这个匹配所有的正则表达式符号,让写出一个函数判断字符串b是否符合规则,面试的时候有些紧张,思路又有些乱,写了一晚上终于成功了,这里提供一下我的算法,欢迎交流沟通。首先贴上完成的代码:

#include<iostream>
using namespace std;

/**********************************************************************
* 名    称:bool match(char *a, char *b, int startA, int startB)
* 功    能:匹配字符串b是否符合正则表达式规则
* 输入参数:字符串a(带*号匹配规则), 字符串b(被匹配的字符), a字符串开始的位置startA, b字符串开始的位置startB
* 返回参数:bool类型
-----------------------------------------------------------------------
* 说    明:无
***********************************************************************/
bool match(char *a, char *b, int startA, int startB)
{
	//字符串a,b的长度
	int lenA   = strlen(a);
	int lenB   = strlen(b);
	//posB,b字符串的startB位置标记
	int	posB = startB;
	//a,b同时结束返回真
	if(startA == lenA && startB == lenB)
	{
		return true;
	}
	//不是*开头 一定要匹配b
	if(a[startA] != '*')
	{
		if(a[startA] != b[startB])
		{
			return false;
		}
		//递归
		return match(a, b, ++startA, ++startB);

	}else{
		//是*开头 找到非*开始的地方
		while(a[startA] == '*' && startA < lenA)
		{
			startA ++;
		}
		//以*结尾 同时遍历结束 返回真
		if(startA == lenA && startB == lenB)
		{
			return true;
		}
	}
	//记录a的位置
	int posA = startA;
	while(startB < lenB) 
	{
		//遍历b找到 与startA 相同的字符
		while(a[startA] != b[startB] && startB < lenB) 
		{
			startB ++;
		}	
		posB = startB;
		//相同均++, a到头或者a遍历到*结束
		while(a[startA] == b[startB] && startA < lenA && a[startA] != '*')
		{
			startA ++;
			startB ++;
		}
		//a遍历到*并且没有结束的情况递归
		while(a[startA] == '*' && startA < lenA) 
		{
			return match(a, b, startA, startB);
		}
		//a,b同时到头的情况,返回true
		if(startA == lenA && startB == lenB) {
			
			return true;
		}
		//没有发现满足的字符串,b的startB + 1,在次做遍历
		startA = posA;
		startB = posB + 1;
	}
	return false;
}


void main() 
{
	char *a = "*a*b*c*";
	char *b = "adbaeabeaeac";

	bool c = match(a, b, 0, 0);
	cout<<c<<endl;

}

算法解析:
函数是用C++写的,运用递归的思想。分为*开头和非*开头的情况。非*开头一路找到非*的位置开始匹配。
这里有个小坑,例如在字符串ababababcab中找abc的位置,这是比较常见的KMP算法,数据结构中有学,这里找到abc的位置后,两个字符串进行截取后再递归调用函数
测试用例:
分别进行了以下测试用例
字符串a为,字符串为符合和不符合的情况

测试通过!!
有兴趣的朋友们可以自己下载程序试一试,同时欢迎提供更好的算法。

Zend Studio 基本设置

使用IDE编码快捷方便,但是需要一些tab和编码风格的设置,下面是新手第一次配置IDE的简单方法。
一 连接远程文件
我们的代码文件全部放在linux开发机上,首先需要连接到开发机上的代码
1点击File->PHP Project from Remote Server

2,点击Manage,输入host及用户名密码,同时点击Test Connection测试连接是否正常。

3,接下来开始拉代码,会有树级目录,选择需要的目录即可。
注意Zend并不会实时更新Linux机器上的代码,如果在远端使用VIM直接修改文件后,记得在文件上点击右键->RemoteServers->Download from server更新代码。

二 设置Tab键默认为4个空格
为了兼容代码的格式,一般不建议使用Tab键,所以设置Tab为4个空格后,使用Tab全部变为4个空格,检测方法是用了Tab键再次按Back space键,如果一次只回一个空格距离,则设置成功。

1,点击Window->Preferences->General->Editors->TextEditors
在Displayed tab width 输入4

2,点击PHP->CodeStyle->Formatter->Edit选择Spaces 填入红色框中的数字4,4即可

3 最后在General->Workspace中选择UTF-8和Unix编码风格即可。

好啦,设置以上步骤后,就可以愉快的便代码啦!
*以上图片截取Zend Studio 10.6

[GIT]git创建及其使用心得

本文章涉及到了git的创建和基本操作,适合初学者使用

查看本地分支 git branch
切换分支 git checkout ‘name’
删除本地分支 git branch -d ‘name’
创建新分支 并切换到改分支 git checkout -b ‘name’
查看线上分支 git branch -r
克隆并创建分支 git checkout -b ‘newname’ master
本地分支提交到远程 git push origin ‘name’
撤销本地的修改 git checkout — 文件名
撤销本次提交的代码 git reset –hard HEAD~1

查看所有版本 git reflog
回到某个版本 git reset –hard XXXXX

分支提交 git push origin resblock 最后为分支名
分支下载 git pull origin resblock ‘resblock 为分支名’
删除远程分支 git push origin : 自己分支名 删除远程分支
合分支 git merge deyou(分支名) –no-ff git push origin master
rebase
在自己分支上进行 git rebase master 处理冲突后进行 git rebase –continue 放弃处理 git rebase -abort
git checkout –our

//暂存修改
git stash
git stash pop

//修改配置,快捷键
vim ~/.gitconfig
[alias]
last = log >—lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
ci = commit
br = branch
co = checkout
df = diff
st = status

创建自己的git方法
1, 下载git 找到相应目录,git init
2, 根目录下去寻找.ssh目录。寻找SSH KEY

$ ssh-keygen -t rsa -C &quot;youremail@example.com&quot;

3, 登录github 打开account setting Add SSH KEY
4, Create
a new repo
5, 按照提示
//git init
//git add README.md
//git commit -m “first commit”
git remote add origin
git@github.com:wangchunwei/shulan.git
git push -u origin master

[算法]找数组中和为定值的数组对

一道简单的算法题,要求在数组中,找到所有和为定值的数组对。比如在array(11,11,1,2,-1,3,4,6,7,8,9,5,-1)中,找到所有和为10的数组对。
考虑到时间复杂度,牺牲空间,每个值作为一个key,他的互补对为value-key,每遍历一个数组值,先判断有没有互补对,有则打印此key,和互补key,互补key-1,否则添加一个key.php代码如下:

&lt;?php  
function findSum($arr, $sum) {  
    $total  = 0;  
    $sumArr = array();  
    foreach($arr as $key) {  
        //如果有此key,并且有和为sum的key,总数加一,失去一个互补key  
        if(isset($sumArr[$sum-$key]) &amp;&amp; ($sumArr[$sum-$key] &gt; 0)) {  
            $total ++ ;  
            //打印出来  
            $diff = $sum-$key;  
            echo &quot;($key, $diff)&lt;/br&gt;&quot;;  
            //互补key -1 
            $sumArr[$sum-$key] --;  
        }else{  
            //添加一个key  
            isset($sumArr[$key]) ?  $sumArr[$key]++ : ($sumArr[$key] = 1);  
        }  
    }  
    echo &quot;total:{$total}&quot;;  
}  
//测试用例  
$arr = array(11,11,1,2,-1,3,4,6,7,8,9,5,-1);  
findSum($arr, 10);  

测试结果为:
(-1, 11)
(6, 4)
(7, 3)
(8, 2)
(9, 1)
(-1, 11)
total:6

[应用]手机端连接本地服务器进行调试

目前开发涉及到手机开发,由于手机设置host比较麻烦,最好的就是可以让手机通过代理来访问开发机。下面介绍一种通过node服务来搭建代理的方式:

 

一、安装 nproxy

1.安装nodejs,去www.nodejs.org下载安装即可

2.安装nproxy,打开命令行,执行

npm install -g nproxy

安静的等待安装即可。

3.在命令行中运行 nproxy 即可启动代理服务。

二、设置手机代理

1.手机连接同一局域网下的WIFI

2.选中wifi,下面有个代理设置

代理服务器就是你机器的ip

端口默认8989

 

设置完毕后,就可以通过你本机访问测试环境了。

 

三、nproxy更多功能

   上面只是一个简单的代理,其实nproxy实现的功能比较多,前端多用来设置代理规则将服务代码指向本地代码。比fiddler方便多了

更多功能 https://www.npmjs.com/package/nproxy

搭配chrome插件 switchysharp使用更爽。

四、更多代理

还可以通过笔记本搭建热点的方式。(笔记本要有网线,通过笔记本wifi搭建热点),比如大家可以在无线中找到 dongyajie’s mac pro

win可以下载fiddler来设置代理,设置方式去网上搜搜。也可以设置规则,正则不太好写。

[PHP]运用PHPMailer发送带压缩附件的邮件

某些情况经常要定期收集信息,当数据量大时,附件就超过了邮件的限制,此时将附件压缩,在通过PHPMailer发送是一个简单可靠的方式。

1,首先下载PHPMailer的函数库  http://sourceforge.net/projects/phpmailer/,放在可以加载的地方

2,配置邮件参数

3,用Linux自带的命令zip -r $filename.zip $filename 压缩附件(或者安装的其他压缩方式,tar等)

4,加载附件发送邮件

    protected function _sendMail($subject, $content, $address = '')
    {           
        $mailer = new PHPmailer();
        
        $mailer-&gt;Host = 'smtp.163.com';
        $mailer-&gt;IsSMTP();
        $mailer-&gt;SMTPAuth = true;
        
        //链家邮件发件人设置
        $mailer-&gt;Username = &quot;willwcw&quot;;
        $mailer-&gt;Password = 'XXXXXXX';  //密码
        
        $mailer-&gt;From = &quot;willwcw@163.com&quot;;
        $mailer-&gt;FromName = &quot;通知邮件&quot;;
        $mailer-&gt;CharSet = &quot;UTF-8&quot;;

        //收件人设置
        $mailer-&gt;Encoding = &quot;base64&quot;;
        $mailer-&gt;AddAddress('xxxx@163.com'); 
        //$mailer-&gt;AddCC('webrd@l63.com');  //抄送

        $filename = $subject.&quot;.html&quot;;
        $file = fopen($filename, &quot;w+&quot;);
        fwrite($file, $content);
        fclose($file);
        //文件太大,采取压缩后附件形式
        //shell_exec(&quot;tar zcvf $filename.tar $filename &quot;);
        shell_exec(&quot;zip -r $filename.zip $filename &quot;);
        
        $mailer-&gt;IsHTML(true);
        $mailer-&gt;Subject = $subject;
        $mailer-&gt;Body =  $title = &quot;&lt;h1 align='center'&gt;&quot;.$this-&gt;yesterday.$filename.&quot;邮件提醒&lt;/h1&gt;&quot;;    
        $tarName = $filename.'.zip';
        $mailer-&gt;AddAttachment('./'.$tarName, &quot;$tarName&quot;);//附件的路径和附件名称
       
        if($mailer-&gt;Send()){
            Yii::info(&quot;send email $subject successful!&quot;);
        }else{
            Yii::warning(&quot;sendmail wrong&quot;, $mailer-&gt;ErrorInfo);
        }
        shell_exec(&quot;rm $tarName&quot;);
        shell_exec(&quot;rm $filename&quot;);
    }