微信开发一

一、准备

准备:微信公众账号、一个备案域名、一个服务器,如果没有域名和服务器的话,也可使用内网穿透来实现域名+服务器的功能,通过内网穿透,实现本机开发

微信开发平台公众的选择?

1、如果想简单的发送消息,达到宣传效果,建议订阅号;
2、如果进行商品销售、售卖,建议服务号
3、如果用来管理内部企业员工、团队、对内使用,建议企业号

注意:

1、订阅号可通过微信认证资质审核通过后,有一次升级为服务号的人口,升级成功后类型不可再变
2、服务号不可变更为订阅号

https://kf.qq.com/faq/120911VrYVrA130805byM32u.html 官方具体说明

开发微信的准备:

1、开发微信的环境不能是本地的环境,必须是可以线上能直接访问的,因为微信平台会将客户发送的消息转发到你自己的服务器
2、可以有自己的服务器或者是主机,借助一些工具进行内网穿透例如花生壳、NATAPP等

1.1 natapp

natapp 是个内网穿透工具,可在线购买

购买一个付费隧道
微信开发一
配置成功后如下:
微信开发一

1.2 微信设置

公众号->开发-> 开发者工具-> 公众平台测试账号
微信开发一

1.3 本机设置

natapp客户端: natapp客户端下载natapp 客户端配置

启动方式:直接启动、配置文件启动。下例为直接启动:

#natapp添加执行权限
chmod a+x natapp
#natapp 查看帮助
./natapp -h
#本机开启natapp服务,authtoken即为natapp购买后的authtoken
./natapp -authtoken=xxxxx -log=stdout -loglevel=DEBUG

本机开启 127.0.0.1:80 的nginx服务,代码如下:

<?php
  
//define your token
define("TOKEN", "monkwang");//此次的tokan值同1.2微信测试账号里的token一致
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest{
	public function valid(){
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
          //输出,微信服务器验证该值,一致后才显示配置成功
					echo $echoStr;
        	exit;
        }
    }
	
  /*
  1)将token、timestamp、nonce三个参数进行字典序排序
  2)将三个参数字符串拼接成一个字符串进行sha1加密
  3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
  */
	private function checkSignature(){
        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);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
          return true;
        }else{
          return false;
        }
	}
}

注意:官方示例代码

1.4 测试公众号的使用

在1.2 微信设置成功后,需扫描测试管理账号->测试号二维码 来实现在线测试,此刻切不可用自己的公众号测试,因为用的是测试号,所以须用官方测试公众号来调试代码

验证:

#index.php
<?php

define('TOKEN','monkwang'); //跟微信平台上所填写的token必须一致
// echo valid();
response();
/**
 * [response 响应回复消息]
 * @return [type] [description]
 */
function response(){
    $data = file_get_contents('php://input');
    if(empty($data))exit;
    file_put_contents("text", $data);
  	//接收到的的数据转换成对象了
 $obj=simplexml_load_string($data,'SimpleXMLElement',LIBXML_NOCDATA); 
    $ToUserName=$obj->ToUserName;//开发者账号
    $FromUserName=$obj->FromUserName;//用户账号
    $content=$obj->Content; //内容

    $xml='<xml>
              <ToUserName><![CDATA[%s]]></ToUserName>
              <FromUserName><![CDATA[%s]]></FromUserName>
              <CreateTime>%s</CreateTime>
              <MsgType><![CDATA[text]]></MsgType>
              <Content><![CDATA[%s]]></Content>
              </xml>'; 
    //关注事件
    if(isset($obj->Event) && $obj->Event=='subscribe'){
      $s = '欢迎关注,输入monk可获得monk的签名照';
      $str=sprintf($xml,$FromUserName, $ToUserName,time(),$s);
    }
    if($content=='monk'){ //通过判断关键字,然后返回相应的内容
      $content='偶像';
      $str=sprintf($xml,$FromUserName, $ToUserName,time(),$content);
    }
    file_put_contents('test',$str);
}


//验证类
/**
 * [valid 验证接入的函数]
 * @return [type] [description]
 */
function valid(){
	  $signature=$_GET['signature']; //加密签名
    $timestamp=$_GET['timestamp'];//时间戳
    $nonce=$_GET['nonce'];//随机数
    $echostr=$_GET['echostr'];//随机字符串
    //对数组排序
    $arr=[$timestamp,$nonce,TOKEN];
    sort($arr,SORT_STRING);
    $str=sha1(implode($arr));
    //该请求是来源于微信
    if($signature==$str){
        return $echostr;
    }
}
上一篇:微信公众号接口服务器认证配置


下一篇:PHP开发api接口安全验证 -- 逻辑严谨性判断