php微信公众号开发入门
<h2>1 公众号准备</h2><p>首先申请一个公众号申请公众号网页</p>
<p>由于一般的个人订阅号开放的功能有限,作为学习者,我们并不推荐使用这种账号的开发者模式进行开发,而是另外申请一个测试号进行开发学习,测试号开放的功能基本可以满足我们的学习需求。</p>
<p>默认的测试号登陆进去是这样子的</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1.jpg" alt="1557630532073"></p>
<h2>2 服务器准备</h2>
<blockquote>
<p>微信开发需要一台具有公网IP的服务器,通常可以使用各种云平台的服务器:如腾讯云,阿里云等,大多数都是收费的,如果仅仅是体验一下,可以使用免费的新浪云sae服务器</p>
</blockquote>
<h3>2.1 新浪sae服务器的申请和使用(仅支持PHP)</h3>
<hr>
<h4>2.1.1 创建应用</h4>
<p>打开官网https://www.sinacloud.com</p>
<p>注册或登录,点击控制台->云应用SAE,点击创建应用</p>
<p><img src="https://camo.githubusercontent.com/3c06c20227d1fbe51a198733601ee44f58948199/68747470733a2f2f696d672d626c6f672e6373646e696d672e636e2f32303139303331333133343131343337342e706e67" alt="在这里插入图片描述" data-canonical-src="https://img-blog.csdnimg.cn/20190313134114374.png"></p>
<p>选择空间(运行环境选择标准环境,其他的需要付费)</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557631423864.png" alt="1557631423864"></p>
<h4>2.1.2 代码管理</h4>
<p>在应用列表选择管理</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557631557419.png" alt="1557631557419"></p>
<p>选择运行环境管理,代码管理,创建新版本</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557631631251.png" alt="1557631631251"></p>
<p>新建完成后可以直接在线编辑代码上传代码包</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557631778171.png" alt="1557631778171"></p>
<h4>2.1.3 访问测试</h4>
<p>创建新版本时默认是没有代码的,故直接访问结果是404</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557631939657.png" alt="1557631939657"></p>
<p>这时可以通过在线编辑或者上传代码包的方式增加代码,比如我在线编辑一个index.html</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557632250769.png" alt="1557632250769"></p>
<p>保存之后再访问</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557632300259.png" alt="1557632300259"></p>
<p>由于还没实名认证,浏览器给出了风险提示,但是我们的代码已经生效了</p>
<p>实名认证可以到新浪云用户中心进行操作</p>
<h4>2.1.4 使用git进行代码控制</h4>
<p>在新浪云创建新运用后,新浪云默认为我们创建了一个代码仓库,地址:https://git.sinacloud.com/newapp,将newapp换成你的二级域名即可,我们可以将这个代码库克隆下来</p>
<p>示例:</p>
<div class="highlight highlight-source-shell">
<pre>git clone https://git.sinacloud.com/chzchat
<span class="pl-c1">cd chzchat</span></pre>
</div>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557633173992.png" alt="1557633173992"></p>
<p>这样我们就可以在这个目录下进行开发,开发完成后使用git命令就可以将代码推送到代码库,代码库是和服务器关联的,这个操作等同于上传代码包,但是更方便,关于git的使用可以参考廖雪峰老师的教程</p>
<h3>2.2 腾讯云15天免费云服务器</h3>
<h4>2.2.1 领取免费服务器</h4>
<p>领取地址,首先需要实名认证,这里我选择的操作系统是Ubuntu14</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557635187878.png" alt="1557635187878"></p>
<p>开通后会在控制台的通知那里收到一条信息,里面有操作系统的初始密码,我们可以选择重置密码来设置新密码</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557635439503.png" alt="1557635439503"></p>
<h4>2.2.2 登陆服务器</h4>
<ul>
<li>
<p>在浏览器端登陆服务器</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557635543670.png" alt="1557635543670"></p>
<p>选择登陆操作,需要微信授权,选择标准登陆模式</p>
<p>用户名默认为ubuntu,登陆密码为初始密码或重置后的密码,成功登陆</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557635696386.png" alt="1557635696386"></p>
</li>
<li>
<p>使用xshell登陆</p>
<p>新建连接</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557635914858.png" alt="1557635914858"></p>
<p>双击新建立的连接,按提示输入用户名和密码即可成功登陆</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557636061627.png" alt="1557636061627"></p>
</li>
<li>
<p>使用xftp登陆</p>
<p>使用xftp可以在两台计算机之间快速传输文件,连接方式选择sftp,其他操作和xshell基本一致</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557636163427.png" alt="1557636163427"></p>
<p>传输失败的原因可能是Linux的目录没有写入权限,这时我们可以使用xshell先设置好目录权限</p>
<div class="highlight highlight-source-shell">
<pre>chmod 777 目录名</pre>
</div>
</li>
</ul>
<h4>2.2.3 配置开发环境</h4>
<ul>
<li>
<p>配置apache2+php5+mysql</p>
<div class="highlight highlight-source-shell">
<pre>sudo apt-get update
sudo apt-get install apache2
sudo apt-get install php5
sudo apt-get install mysql-server mysql-client</pre>
</div>
<p>测试apache2是否安装成功</p>
<p>浏览器访问服务器公网IP</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557636853694.png" alt="1557636853694"></p>
<p>测试php是否安装成功</p>
<div class="highlight highlight-source-shell">
<pre>sudo vim /var/www/html/phpinfo.php</pre>
</div>
<p>phpinfo.php内容</p>
<div class="highlight highlight-text-html-php">
<pre><span class="pl-pse"><?php<span class="pl-s1">
<span class="pl-s1"><span class="pl-c1">phpinfo();</span></span></span></span></pre>
</div>
<p>保存退出编辑,访问phpinfo.php</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557636891090.png" alt="1557636891090"></p>
<p>测试mysql是否安装成功</p>
<div class="highlight highlight-source-shell">
<pre><span class="pl-c"><span class="pl-c">#连接数据库
mysql -uroot -p
<span class="pl-c"><span class="pl-c">#输入密码</span></span></span></span></pre>
</div>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557637001250.png" alt="1557637001250"></p>
</li>
<li>
<p>其他环境配置请自行百度</p>
</li>
</ul>
<h2>3 公众号与服务器关联</h2>
<h3>3.1 微信入口文件</h3>
<p>在开发目录下新建微信入口文件wx_entrance.php</p>
<div class="highlight highlight-text-html-php">
<pre><span class="pl-pse"><?php<span class="pl-s1">
<span class="pl-s1">
<span class="pl-s1"><span class="pl-c1">define(<span class="pl-s"><span class="pl-pds">'TOKEN<span class="pl-pds">',<span class="pl-s"><span class="pl-pds">'chz<span class="pl-pds">');
<span class="pl-s1"><span class="pl-smi">$signature<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'signature<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-smi">$timestamp<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'timestamp<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-smi">$nonce<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'nonce<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-smi">$echostr<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'echostr<span class="pl-pds">'];
<span class="pl-s1">
<span class="pl-s1"><span class="pl-smi">$tmpArr<span class="pl-k">=<span class="pl-c1">array(<span class="pl-c1">TOKEN,<span class="pl-smi">$timestamp,<span class="pl-smi">$nonce);
<span class="pl-s1"><span class="pl-c1">sort(<span class="pl-smi">$tmpArr,<span class="pl-c1">SORT_STRING);
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 拼接字符串 sha1加密
<span class="pl-s1"><span class="pl-smi">$tmpStr<span class="pl-k">=<span class="pl-c1">join(<span class="pl-smi">$tmpArr);
<span class="pl-s1"><span class="pl-smi">$tmpStr<span class="pl-k">=<span class="pl-c1">sha1(<span class="pl-smi">$tmpStr);
<span class="pl-s1">
<span class="pl-s1"><span class="pl-k">if (<span class="pl-smi">$tmpStr<span class="pl-k">==<span class="pl-smi">$signature) {
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-smi">$echostr;
<span class="pl-s1">}<span class="pl-k">else{
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-s"><span class="pl-pds">"error<span class="pl-pds">";
<span class="pl-s1"> <span class="pl-k">exit;
<span class="pl-s1">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</div>
<h3>3.2 接口配置信息</h3>
<p>上传代码到服务器,配置微信测试号接口配置信息</p>
<p><img src="https://img2018.cnblogs.com/blog/1385831/201905/1385831-20190512141657696-417226883.png" alt=""></p>
<p> </p>
<p>URL填:http://你的服务器公网IP(或域名)/微信入口文件名</p>
<p>Token填微信入口文件中定义的TOKEN,如果信息匹配且服务器器已经实名验证,则提交后提示配置成功</p>
<h2>4 微信开发小demo——微信消息的接入和消息回复</h2>
<p>修改微信入口文件的代码为</p>
<div class="highlight highlight-text-html-php">
<pre><span class="pl-pse"><?php<span class="pl-s1">
<span class="pl-s1">
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 加密签名
<span class="pl-s1"><span class="pl-smi">$signature<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'signature<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 时间戳
<span class="pl-s1"><span class="pl-smi">$timestamp<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'timestamp<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 随机出
<span class="pl-s1"><span class="pl-smi">$nonce<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'nonce<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 随机字符串
<span class="pl-s1"><span class="pl-smi">$echostr<span class="pl-k">=<span class="pl-smi">$_GET[<span class="pl-s"><span class="pl-pds">'echostr<span class="pl-pds">'];
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// TOKEN
<span class="pl-s1"><span class="pl-c1">define(<span class="pl-s"><span class="pl-pds">'TOKEN<span class="pl-pds">',<span class="pl-s"><span class="pl-pds">'chz<span class="pl-pds">');
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 字典序排序
<span class="pl-s1"><span class="pl-smi">$tmpArr<span class="pl-k">=<span class="pl-c1">array(<span class="pl-c1">TOKEN,<span class="pl-smi">$timestamp,<span class="pl-smi">$nonce);
<span class="pl-s1"><span class="pl-c1">sort(<span class="pl-smi">$tmpArr,<span class="pl-c1">SORT_STRING);
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 拼接字符串 sha1加密
<span class="pl-s1"><span class="pl-smi">$tmpStr<span class="pl-k">=<span class="pl-c1">join(<span class="pl-smi">$tmpArr);
<span class="pl-s1"><span class="pl-smi">$tmpStr<span class="pl-k">=<span class="pl-c1">sha1(<span class="pl-smi">$tmpStr);
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 加密签名的比较
<span class="pl-s1"><span class="pl-k">if (<span class="pl-smi">$tmpStr<span class="pl-k">==<span class="pl-smi">$signature) {
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-smi">$echostr;
<span class="pl-s1">}<span class="pl-k">else{
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-s"><span class="pl-pds">"error<span class="pl-pds">";
<span class="pl-s1"> <span class="pl-k">exit;
<span class="pl-s1">}
<span class="pl-s1">
<span class="pl-s1"><span class="pl-c"><span class="pl-c">// 接受xml数据
<span class="pl-s1"><span class="pl-smi">$postStr <span class="pl-k">= <span class="pl-smi">$GLOBALS[<span class="pl-s"><span class="pl-pds">"HTTP_RAW_POST_DATA<span class="pl-pds">"];
<span class="pl-s1">
<span class="pl-s1"><span class="pl-k">if (<span class="pl-k">!<span class="pl-smi">$postStr) {
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-s"><span class="pl-pds">"post data error<span class="pl-pds">";
<span class="pl-s1"> <span class="pl-k">exit;
<span class="pl-s1">}
<span class="pl-s1">
<span class="pl-s1"><span class="pl-smi">$postObj<span class="pl-k">=<span class="pl-c1">simplexml_load_string(<span class="pl-smi">$postStr,<span class="pl-s"><span class="pl-pds">'SimpleXMLElement<span class="pl-pds">', <span class="pl-c1">LIBXML_NOCDATA );
<span class="pl-s1"><span class="pl-smi">$MsgType<span class="pl-k">=<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">MsgType;
<span class="pl-s1">
<span class="pl-s1"><span class="pl-k">switch (<span class="pl-smi">$MsgType) {
<span class="pl-s1"> <span class="pl-k">case <span class="pl-s"><span class="pl-pds">'text<span class="pl-pds">':
<span class="pl-s1"> <span class="pl-smi">$Content<span class="pl-k">=<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">Content;
<span class="pl-s1"> <span class="pl-k">switch (<span class="pl-smi">$Content) {
<span class="pl-s1"> <span class="pl-k">case <span class="pl-s"><span class="pl-pds">'hello<span class="pl-pds">':
<span class="pl-s1"> <span class="pl-smi">$xml<span class="pl-k">=<span class="pl-s"><span class="pl-pds">'<xml>
<span class="pl-s1"><span class="pl-s"> <ToUserName><!]></ToUserName>
<span class="pl-s1"><span class="pl-s"> <FromUserName><!]></FromUserName>
<span class="pl-s1"><span class="pl-s"> <CreateTime>%d</CreateTime>
<span class="pl-s1"><span class="pl-s"> <MsgType><!]></MsgType>
<span class="pl-s1"><span class="pl-s"> <Content><!]></Content>
<span class="pl-s1"><span class="pl-s"> </xml><span class="pl-pds">';
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-c1">sprintf(<span class="pl-smi">$xml,<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">FromUserName,<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">ToUserName,<span class="pl-c1">time(),<span class="pl-s"><span class="pl-pds">'欢迎关注<span class="pl-pds">');
<span class="pl-s1">
<span class="pl-s1"> <span class="pl-k">break;
<span class="pl-s1">
<span class="pl-s1"> <span class="pl-k">default:
<span class="pl-s1"> <span class="pl-smi">$xml<span class="pl-k">=<span class="pl-s"><span class="pl-pds">'<xml>
<span class="pl-s1"><span class="pl-s"> <ToUserName><!]></ToUserName>
<span class="pl-s1"><span class="pl-s"> <FromUserName><!]></FromUserName>
<span class="pl-s1"><span class="pl-s"> <CreateTime>%d</CreateTime>
<span class="pl-s1"><span class="pl-s"> <MsgType><!]></MsgType>
<span class="pl-s1"><span class="pl-s"> <Content><!]></Content>
<span class="pl-s1"><span class="pl-s"> </xml><span class="pl-pds">';
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-c1">sprintf(<span class="pl-smi">$xml,<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">FromUserName,<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">ToUserName,<span class="pl-c1">time(),<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">Content);
<span class="pl-s1"> <span class="pl-k">break;
<span class="pl-s1"> }
<span class="pl-s1">
<span class="pl-s1"> <span class="pl-k">break;
<span class="pl-s1"> <span class="pl-k">case <span class="pl-s"><span class="pl-pds">'image<span class="pl-pds">':
<span class="pl-s1"> <span class="pl-smi">$xml<span class="pl-k">=<span class="pl-s"><span class="pl-pds">' <xml>
<span class="pl-s1"><span class="pl-s"> <ToUserName><!]></ToUserName>
<span class="pl-s1"><span class="pl-s"> <FromUserName><!]></FromUserName>
<span class="pl-s1"><span class="pl-s"> <CreateTime>%d</CreateTime>
<span class="pl-s1"><span class="pl-s"> <MsgType><!]></MsgType>
<span class="pl-s1"><span class="pl-s"> <Image>
<span class="pl-s1"><span class="pl-s"> <MediaId><!]></MediaId>
<span class="pl-s1"><span class="pl-s"> </Image>
<span class="pl-s1"><span class="pl-s"> </xml><span class="pl-pds">';
<span class="pl-s1"> <span class="pl-c1">echo <span class="pl-c1">sprintf(<span class="pl-smi">$xml,<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">FromUserName,<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">ToUserName,<span class="pl-c1">time(),<span class="pl-smi">$postObj<span class="pl-k">-><span class="pl-smi">MediaId);
<span class="pl-s1"> <span class="pl-k">break;
<span class="pl-s1"> <span class="pl-k">default:
<span class="pl-s1"> <span class="pl-c"><span class="pl-c"># code...
<span class="pl-s1"> <span class="pl-k">break;
<span class="pl-s1">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</div>
<p>这时我们可以到公众号中发送消息来验证代码</p>
<p>发送"hello"会回复"欢迎关注"</p>
<p>发送其他文字会原样返回</p>
<p><img src="https://github.com/chenhuazhan/wechat-dev/raw/master/readme.assets/1557640111713.png" alt="1557640111713" width="601" height="1069"></p><br><br>
来源:https://www.cnblogs.com/chuanzi/p/10852139.html
頁:
[1]