微信公众号扫码事件推送功能如何制作?

目前正在开发一个扫码订餐的功能,而且目前也已经有这样的订餐系统出现了。自己是在公司中帮忙开发这套系统,但是自己刚接触微信开发,所以不知道怎么弄这个事件推送。
目前微信公众号已经有了扫码功能,点击扫码即可弹出相机扫码框。然后二维码也已经生成了,就是扫码之后推送事件没有实现。

希望可以遇到大神帮忙告诉下怎么通过代码实现扫码之后推送事件。

**公众号:太囧酸菜鱼。 我生成的永久桌号二维码:
图片描述**

问题:就是扫了这个码,然后可以直接推送一个事件,该事件写着桌号,还有店里wifi等信息。用户点信息就打开网站进行网页点餐。

目前卡住在没有办法推送事件。

总是提示公众号异常。。 请求的接口调试了很久都没有办法。希望可以得到解决办法,先说声谢谢了。

阅读 7.1k
2 个回答

我关注了公众号,发现你开发者模式没有配置对,导致提示该公众号提供的服务出现故障,请稍后再试。要不然就绑定的地址在处理程序的时候,某个地方报错,中断了。
楼主的需完全可以实现。

<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function __construct(){
        define('TOKEN', '');
        define('APPID', '');
        define('APPSECRET', '');
    

    }
    /**
     * 开发者模式绑定url地址
     * 只要所有在微信上面触发的事件,都会被推送到你绑定的这个服务器地址
     * 关键字回复、首次关注、菜单点击事件、扫描事件等等
     * @return [type] [description]
     */
    public function index(){
       
        
        $this->logger(I('get.'));

        $echoStr = $_GET["echostr"];
        if (isset($_GET['echostr'])) {
             //开发者模式绑定的时候,腾讯服务器会发起绑定的验证
               $this->valid();
        }else{
            //平时的消息推送处理
            
            $this->responseMsg();
        }
    }



    /**
     * 应答绑定
     * @return [type] [description]
     */
     public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    /**
     * 验证绑定签名
     * @return [type] [description]
     */
    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;
        }
    }

    /**
     * 回复请求
     * @return [type] [description]
     */
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

        if (!empty($postStr)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
           
            $this->replay_text($fromUsername,$toUsername);
        }else{
            echo "";
            exit;
        }
    }

    /**
     * 推送文本
     * @param  [type] $fromUsername [description]
     * @param  [type] $toUsername   [description]
     * @return [type]               [description]
     */
    public function replay_text($fromUsername,$toUsername)
    {
        $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>";
        $msgType = "text";
        $contentStr = date("Y-m-d H:i:s",time());
        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
        echo $resultStr;
        exit;
       
    }

   

    /**
     * 获取access_token
     */
    function getAccessToken() {

         $access_token = S('access_token');
        if (!empty($access_token)&&$access_token<>'') {
            return $access_token;
        } else {
            $appid = APPID;
            $appsecret = APPSECRET;
            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $appid . '&secret=' . $appsecret;
           
            $result = file_get_contents($url);
            $result = json_decode($result, true);
            //当成功抓取access_token保存到缓存中,有效期-120秒
            if($result&&$result['access_token']<>''){
                 S('access_token', $result['access_token'], $result['expires_in'] - 120);
                return $result['access_token'];
            }else{
                return false;
            }

        }
    }


    /**
     * 以post提交数据
     */
    function post_data($url, $param, $is_file = false, $return_array = true) {
        if (!$is_file && is_array($param)) {
            $param = JSON($param);
        }
        if ($is_file) {
            $header [] = "content-type: multipart/form-data; charset=UTF-8";
        } else {
            $header [] = "content-type: application/json; charset=UTF-8";
        }

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $res = curl_exec($ch);
        curl_close($ch);
        $return_array && $res = json_decode($res, true);
        return $res;
    }

     /**
     * 写日志
     * @param  [type] $log_content [description]
     * @return [type]              [description]
     */
    function logger($log_content)
    {
            $fg_str="\n============================================================\n";
            $max_size = 500000;
            $log_filename = "log.xml";
            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){
                unlink($log_filename);
            }
            if(is_array($log_content)){
                 file_put_contents($log_filename, date('Y-m-d H:i:s')."\n".json_encode($log_content).$fg_str, FILE_APPEND);
        

            }else{
                 file_put_contents($log_filename, date('Y-m-d H:i:s')."\n".$log_content.$fg_str, FILE_APPEND);
        

            }
            
           
    }




}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题