setecho 2018-10-18 13:44:52 2253次浏览 0条评论 0 0 0
最近在做项目的过程中客户提出了一个需求:“扫描二维码使未关注的公众号的用户关注公众号,之后再进行注册的操作”,当时问了附近的大神得知到微信的“带参二维码”和“被动回复”。思路:
第一步:获取推荐人的id并将其放入带参二维码中,在用户扫描二维码时判断用户是否关注过公众号(微信带参二维码接口可以判断出来有没有关注,所以怎么判断出用户没有关注公众号并让用户点击关注不需要我们操心),关注过的直接进入公众号,未关注的点击关注进入公众号(在进入公众号的同时微信会将一些信息反馈到你之前在公众号配置的配置文件里面,配置文件是哪一个后面再讲)。
第二步:之后配置文件收到反馈信息,里面如果有你写的逻辑代码,它就会尽心相应的处理(这个文件里面的信息好像不能直接打印在页面上,我的话是写的日志,把想要的信息写入到文本文件)。
本文主要讲的是第二步配置文件的操作还有注意点。
首先我们去找到公众号后台的配置文件位置:微信公众号—》左菜单开发-》基本配置;
![QQ截图20181018132327.png](/uploads/images/201810/18132451646.png "QQ截图20181018132327.png")
服务器地址url就是配置文件的路径,在这里要注意一下,这个配置文件只有在服务器配置开启的时候才有用,停用的时候是根本不会访问它的。
接下来是我配置文件的内容:
<?php

namespace frontend\controllers;

use Yii;
use yii\web\Controller;
use common\extensions\Tools;
use common\extensions\Wechat;
use common\models\AppClient;
class WechatController extends Controller
{

public $wechat = '';
public $data = array();
public function init(){
    $this->enableCsrfValidation = false;
    $this->wechat = new Wechat(Yii::$app->params['wechat']);
    
}

public function actionIndex(){
    $ruelse=$this->actionMenu();//生成菜单
    $file = Yii::$app->runtimePath.'/logs/wecha0.log';
    file_put_contents($file,$ruelse);
    $xml = file_get_contents("php://input");//获取文档流
    $ob= simplexml_load_string($xml,'SimpleXMLElement', LIBXML_NOCDATA);//将字符串转化为变量
    $json = json_encode($ob);//将对象转化为JSON格式的字符串
    $configData = json_decode($json, true);//将JSON格式的字符串转化为数组
    $file = Yii::$app->runtimePath.'/logs/wechats6.log';//生成文件日志
    file_put_contents($file,$json.$xml);//生成文件日志
    if(!empty($configData['EventKey'])&&$configData['Event']!='SCAN'){
        $eventkey = substr($configData['EventKey'], 8,36);//推荐人id
    }

    if($configData['Event']=='SCAN'){//判断是否关注该公众号
        $url='要跳转页面的路径';//关注了的
    }else{
        $url='要跳转到页面的路径';//没关注的
    }
    $file = Yii::$app->runtimePath.'/logs/wechats4.log';
    file_put_contents($file,$url);

    //图文回复内容
    $record=array(
        'title' =>'',//标题
        'description' =>"",//详情
        'picUrl' => ' ',//图片路径
        'url' =>"$url"//跳转路径

//

    );

    $reuselts=$this->replayNews($configData,$record);//
    echo $reuselts;

//

}
//[封装]图文回复
private function replayNews($postObj,$newsContent){
    $newsTplHead = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[news]]></MsgType>
            <ArticleCount>1</ArticleCount>
            <Articles>";
    $newsTplBody = "<item>
            <Title><![CDATA[%s]]></Title> 
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
            </item>";
    $newsTplFoot = "</Articles>
            <FuncFlag>0</FuncFlag>
            </xml>";
    $header = sprintf($newsTplHead, $postObj['FromUserName'], $postObj['ToUserName'], time());
    $title = $newsContent['title'];
    $desc = $newsContent['description'];
    $picUrl = $newsContent['picUrl'];
    $url = $newsContent['url'];
    $body = sprintf($newsTplBody, $title, $desc, $picUrl, $url);
    $FuncFlag = 0;
    $footer = sprintf($newsTplFoot, $FuncFlag);
    $file = Yii::$app->runtimePath.'/logs/wechats9.log';
    file_put_contents($file,$header.$body.$footer);
    return $header.$body.$footer;
}
//[封装]文字回复
private function doText($postObj){
    $fromUsername = $postObj['FromUserName'];
    $toUsername = $postObj['ToUserName'];
    $keyword = 'PHP';
    $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";

    switch($keyword){
        case '初音科技':
            $contentStr = "提供一流的技术支持!!";
            break;
        case 'PHP':
            $contentStr = "最美的语言!!";
            break;

        default:
            $contentStr = "启军测试微信公众号响应!!";
            break;
    }

    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    $file = Yii::$app->runtimePath.'/logs/wechats8.log';
    file_put_contents($file,$resultStr);
    echo $resultStr;
}
/**
 * 生成菜单
 * @param  string $data 菜单的str
 * @return string  返回的结果;
 */
public function actionMenu($data = NULL){
    
    $menu = \Yii::$app->params['button'];
    $data='{ "button":[
          {
                "name":"洗车",
                "sub_button":[
                {
                   "type":"view",
                   "name":"周边站点",
                   "url":""
                },
                {
                   "type":"view",
                   "name":"充值",
                   "url":""
                },
                {
                   "type":"view",
                   "name":"帮助",
                   "url":""
                }]
          },
          {
              "name":"社区",
               "sub_button":[
                {
                   "type":"view",
                   "name":"加油",
                   "url":""
                },
                {
                   "type":"view",
                   "name":"保险",
                   "url":""
                },
                {
                   "type":"view",
                   "name":"购车",
                   "url":""
                },
                
                {
                   "type":"view",
                   "name":"最新动态",
                   "url":""
                }]
           },
          {
               "name":"我的",
               "sub_button":[
               {
                   "type":"view",
                   "name":"个人信息",
                   "url":""
               },
               {
                   "type":"view",
                   "name":"转赠省钱",
                   "url":""
               },
               {
                   "type":"view",
                   "name":"帮助",
                   "url":""
               }]
           }]
    }';
    $access_token=Wechat::getToken();
    $curl="https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";
    $resle=Tools::httpPost($curl, $data,'POST', array("Content-type: text/html; charset=utf-8"), true);
    $file = Yii::$app->runtimePath.'/logs/wechats0.log';
    file_put_contents($file,$resle);
	print_r($this->wechat->setMenu( $data));
}
Wechat::getToken()获取token方法;Tools::httpPost Curl方法;
另外在带参二维码生成的时候EventKey参数有的是字符串格式可以用这个(建议直接写成json格式):

$data ='{"action_name":"QR_LIMIT_STR_SCENE","action_info":{"scene":{"scene_str":"'.$id.'"}}}';

    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册