>  기사  >  위챗 애플릿  >  PHP 도킹 WeChat 공개 플랫폼 메시지 인터페이스 개발 프로세스에 대한 자세한 설명 및 예

PHP 도킹 WeChat 공개 플랫폼 메시지 인터페이스 개발 프로세스에 대한 자세한 설명 및 예

高洛峰
高洛峰원래의
2018-05-15 14:59:4021831검색

이 기사에서는 주로 PHP 도킹 WeChat 공개 플랫폼 메시지 인터페이스의 개발 과정과 PHP 버전 인터페이스를 사용하여 공개 플랫폼 메시지를 작동하는 방법을 소개합니다. 도움이 필요한 친구는 이를 참조할 수 있습니다.

1. 좋은 인터페이스 프로그램 작성

다음 내용이 포함된 인터페이스 프로그램 파일을 서버에 업로드하세요.

코드는 다음과 같습니다.

<?php
define("TOKEN", "weixin");//自己定义的token 就是个通信的私钥
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
//$wechatObj->responseMsg();
class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $textTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            <FuncFlag>0<FuncFlag>
            </xml>";
            if(!empty( $keyword ))
            {
                $msgType = "text";
                $contentStr = &#39;你好啊,屌丝&#39;;
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }else{
                echo &#39;咋不说哈呢&#39;;
            }
        }else {
            echo &#39;咋不说哈呢&#39;;
            exit;
        }
    }
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token =TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}
?>

2. WeChat 공개 플랫폼 답장 인터페이스 구성

답장 인터페이스 설정, URL 및 토큰 입력(URL은 위의 http://www.yourdomain.com/weixin.php에 입력됨) , 토큰은 위 프로그램에 정의된 토큰과 일치해야 합니다.)

PHP 도킹 WeChat 공개 플랫폼 메시지 인터페이스 개발 프로세스에 대한 자세한 설명 및 예
3. 확인 인터페이스

팔로우하려면 개인 WeChat을 사용하세요. 공개 계정에서 이 계정으로 메시지를 보내고 원본 메시지를 받습니다. 메시지가 반환되어 확인이 성공했음을 나타냅니다.

4. 답글 사용자 정의 시작

$wechatObj->valid(); 줄을 주석 처리하고 //$wechatObj->responseMsg() ; 이 줄에 대한 설명입니다.
사용자의 메시지 유형('텍스트', '이미지', '위치') 및 메시지 내용에 따라 다양한 내용으로 사용자에게 회신하도록 responseMsg 함수의 코드를 수정할 수 있습니다.
메시지 인터페이스를 사용할 준비가 되었습니다. 메시지를 보내볼까요?

1. weixin.class.php를 캡슐화

WeChat 공개 플랫폼에서의 커뮤니케이션은 특정 형식의 XML 데이터를 사용하므로 수락할 때마다 수행해야 합니다. 그리고 많은 데이터 처리.
weixin.class.php를 기반으로 캡슐화하는 것을 고려해 보겠습니다. 코드는 다음과 같습니다.

코드는 다음과 같습니다.

<?php
class Weixin
{
    public $token = &#39;&#39;;//token
    public $debug =  false;//是否debug的状态标示,方便我们在调试的时候记录一些中间数据
    public $setFlag = false;
    public $msgtype = &#39;text&#39;;   //(&#39;text&#39;,&#39;image&#39;,&#39;location&#39;)
    public $msg = array();
    public function __construct($token,$debug)
    {
        $this->token = $token;
        $this->debug = $debug;
    }
    //获得用户发过来的消息(消息内容和消息类型  )
    public function getMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if ($this->debug) {
                        $this->write_log($postStr);
        }
        if (!empty($postStr)) {
            $this->msg = (array)simplexml_load_string($postStr, &#39;SimpleXMLElement&#39;, LIBXML_NOCDATA);
            $this->msgtype = strtolower($this->msg[&#39;MsgType&#39;]);
        }
    }
  //回复文本消息
    public function makeText($text=&#39;&#39;)
    {
        $CreateTime = time();
        $FuncFlag = $this->setFlag ? 1 : 0;
        $textTpl = "<xml>
            <ToUserName><![CDATA[{$this->msg[&#39;FromUserName&#39;]}]]></ToUserName>
            <FromUserName><![CDATA[{$this->msg[&#39;ToUserName&#39;]}]]></FromUserName>
            <CreateTime>{$CreateTime}</CreateTime>
            <MsgType><![CDATA
            1  
            ]></MsgType>
            <Content><![CDATA[%s]]></Content>
            <FuncFlag>%s</FuncFlag>
            </xml>";
        return sprintf($textTpl,$text,$FuncFlag);
    }
    //根据数组参数回复图文消息
    public function makeNews($newsData=array())
    {
        $CreateTime = time();
        $FuncFlag = $this->setFlag ? 1 : 0;
        $newTplHeader = "<xml>
            <ToUserName><![CDATA[{$this->msg[&#39;FromUserName&#39;]}]]></ToUserName>
            <FromUserName><![CDATA[{$this->msg[&#39;ToUserName&#39;]}]]></FromUserName>
            <CreateTime>{$CreateTime}</CreateTime>
            <MsgType><![CDATA[news]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            <ArticleCount>%s</ArticleCount><Articles>";
        $newTplItem = "<item>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
            </item>";
        $newTplFoot = "</Articles>
            <FuncFlag>%s</FuncFlag>
            </xml>";
        $Content = &#39;&#39;;
        $itemsCount = count($newsData[&#39;items&#39;]);
        $itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公众平台图文回复的消息一次最多10条
        if ($itemsCount) {
            foreach ($newsData[&#39;items&#39;] as $key => $item) {
                if ($key<=9) {
                    $Content .= sprintf($newTplItem,$item[&#39;title&#39;],$item[&#39;description&#39;],$item[&#39;picurl&#39;],$item[&#39;url&#39;]);
                }
            }
        }
        $header = sprintf($newTplHeader,$newsData[&#39;content&#39;],$itemsCount);
        $footer = sprintf($newTplFoot,$FuncFlag);
        return $header . $Content . $footer;
    }
    public function reply($data)
    {
        if ($this->debug) {
                    $this->write_log($data);
        }
        echo $data;
    }
    public function valid()
    {
        if ($this->checkSignature()) {
            if( $_SERVER[&#39;REQUEST_METHOD&#39;]==&#39;GET&#39; )
            {
                echo $_GET[&#39;echostr&#39;];
                exit;
            }
        }else{
            write_log(&#39;认证失败&#39;);
            exit;
        }
    }
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $tmpArr = array($this->token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
    private function write_log($log){
        //这里是你记录调试信息的地方  请自行完善   以便中间调试
    }
}
?>

2. weixin.php

WeChat 공개 플랫폼 기본 인터페이스 파일을 넣고 코드를 다음과 같이 수정합니다.

코드는 다음과 같습니다.

<?php
include_once(&#39;weixin.class.php&#39;);//引用刚定义的微信消息处理类
define("TOKEN", "mmhelper");
define(&#39;DEBUG&#39;, true);
$weixin = new Weixin(TOKEN,DEBUG);//实例化
$weixin->getMsg();
$type = $weixin->msgtype;//消息类型
$username = $weixin->msg[&#39;FromUserName&#39;];//哪个用户给你发的消息,这个$username是微信加密之后的,但是每个用户都是一一对应的
if ($type===&#39;text&#39;) {
    if ($weixin->msg[&#39;Content&#39;]==&#39;Hello2BizUser&#39;) {//微信用户第一次关注你的账号的时候,你的公众账号就会受到一条内容为&#39;Hello2BizUser&#39;的消息
        $reply = $weixin->makeText(&#39;欢迎你关注哦,屌丝&#39;);
    }else{//这里就是用户输入了文本信息
        $keyword = $weixin->msg[&#39;Content&#39;];   //用户的文本消息内容
                include_once("chaxun.php");//文本消息 调用查询程序 
                $chaxun= new chaxun(DEBUG,$keyword,$username);
                $results[&#39;items&#39;] =$chaxun->search();//查询的代码
                $reply = $weixin->makeNews($results);
    }
}elseif ($type===&#39;location&#39;) {
      //用户发送的是位置信息  稍后的文章中会处理                 
}elseif ($type===&#39;image&#39;) {
      //用户发送的是图片 稍后的文章中会处理
}elseif ($type===&#39;voice&#39;) {    
      //用户发送的是声音 稍后的文章中会处理
}
$weixin->reply($reply);
?>

3 .쿼리 코드

또한 데이터베이스의 쿼리 결과를 특정 형식으로 형식화해야 합니다

코드는 다음과 같습니다.

아아아아

위 내용은 PHP 도킹 WeChat 공개 플랫폼 메시지 인터페이스 개발 프로세스에 대한 자세한 설명 및 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.