微信公众平台开发系列笔记之一:微信公众平台开发介绍及本地开发环境搭建

一、微信公众平台开发原理

如图:

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
  1. <?php
  2. class WeApi
  3. {
  4. private $_config = array(
  5. 'timeout'=>30
  6. );
  7. public function __construct($config)
  8. {
  9. $this->_config = array_merge($this->_config, $config);
  10. }
  11. public function config($key, $value = null)
  12. {
  13. if ($value) {
  14. $this->_config[$key] = $value;
  15. } else {
  16. return isset($this->_config[$key]) ? $this->_config[$key] : null;
  17. }
  18. }
  19. public function response()
  20. {
  21. if (isset($_GET['echostr'])) {
  22. if ($this->checkSignature()) {
  23. exit($_GET['echostr']);
  24. }
  25. } else {
  26. file_put_contents('error.log', 'not content');
  27. }
  28. }
  29. private function checkSignature()
  30. {
  31. $signature = $_GET["signature"];
  32. $timestamp = $_GET["timestamp"];
  33. $nonce = $_GET["nonce"];
  34. $token = $this->config['token'];
  35. $tmpArr = array($token, $timestamp, $nonce);
  36. sort($tmpArr, SORT_STRING);
  37. $tmpStr = implode( $tmpArr );
  38. $tmpStr = sha1( $tmpStr );
  39. if( $tmpStr == $signature ){
  40. return true;
  41. }else{
  42. $error = array('get'=>$_GET, 'token'=>$token);
  43. file_put_contents('error.log', json_encode($error));
  44. return false;
  45. }
  46. }
  47. }
  48. $config = array('token'=>'填写配置和token');
  49. $api = new WeApi($config);
  50. $api->response();