一、微信公众平台开发原理
如图:
1、用户通过网络访问的是微信公众平台的服务器,微信公众平台将用户请求信息转发给服务提供商的服务器(根据配置的URL)
2、服务提供商(或者叫服务提供方更准确一点)根据用户请求的信息,给出相应的回复,并将回复信息根据一定的格式返回给微信服务器,微信服务器再将服务提供商回复的信息,返回给用户
二、微信公众平台开发环境搭建
1、微信公众平台开发准备
- (1)申请注册一个微信公众号(个人只能申请订阅号)
申请地址:https://mp.weixin.qq.com - (2)注册一个微信账号(如果已经有微信不需要再注册)
- (3)一个可以在网络上访问的域名和可以存放代码的服务器。
如果只想在本地开发,可以到ngrok官网上注册一个账号,可以申请到一个免费的二级域名,并且可以通过这个域名来访问本地的代码,以实现本地开发的目的
ngrok官网:https://www.ngrok.cc/
2、开发环境搭建
根据自身的技术爱好选择不同的开发环境,如本人使用是的lnmp
- (1)启动本地web服务,可以通过http://127.0.0.1访问
- (2)在ngrok官网的用户后台中选择“隧道管理”菜单的子菜单“开通隧道”,选择相应的服务,输入相关信息并保存即可。
- (3)在ngrok官网的用户后台中”隧道管理”中显示已经创建的隧道列表,主要用到隧道id这个字段的信息
- (4)在ngrok官网下载客户端,下载后解压并启动客户端,要求你输入隧道id,输入回车即可。
- (5)在浏览中输入你在ngrok官网填写的二级域名,首次启动可能会比较慢,如果出现与访问127.0.0.1相同的页面表示配置成功
三、微信公众平台配置
1、登录微信公众平台进行相应的配置,主要是URL和token两个选项
如果没有申请到微信公众号,可以试用微信公众平台提供的测试账号。
测试账号登录地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
2、在接口配置信息选项中填写相关的配置
- URL为微信服务器转发信息的目的URL,可以使用我们之前在ngrok申请的二级域名
- token为一个校验是否来源于微信公众平台请求的一个类似密码的字符串,尽量输入较复杂的字符串
- 输入完成后,先不急着点提交,因为此时,我们的服务器还没有相应的响应代码
3、本地编写验证代码验证token
<?php
class WeApi
{
private $_config = array(
'timeout'=>30
);
public function __construct($config)
{
$this->_config = array_merge($this->_config, $config);
}
public function config($key, $value = null)
{
if ($value) {
$this->_config[$key] = $value;
} else {
return isset($this->_config[$key]) ? $this->_config[$key] : null;
}
}
public function response()
{
if (isset($_GET['echostr'])) {
if ($this->checkSignature()) {
exit($_GET['echostr']);
}
} else {
file_put_contents('error.log', 'not content');
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = $this->config['token'];
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
$error = array('get'=>$_GET, 'token'=>$token);
file_put_contents('error.log', json_encode($error));
return false;
}
}
}
$config = array('token'=>'填写配置和token');
$api = new WeApi($config);
$api->response();