han52036 发表于 2021-5-28 15:04

扫码带参数的二维码如何获取参数并触发之微擎开发小白问题

本帖最后由 han52036 于 2021-5-28 15:07 编辑

扫码带参数的二维码如何获取参数并触发之微擎开发小白问题


小白第一次玩微擎,估计后续会有很多小白问题请教,所以大佬勿喷!


今天想实现一个小功能,用户可以点击自定义菜单来生成自己的一个推广分享海报的功能。


整理开发流程思路:
1 生成好带参数的二维码,然后生成好海报;

2 存入到数据库中;
3 根据自定义回复接口,返回对应用户的海报;

4 用户扫码关注后,获取参数判断二维码的归属父级账户,然后绑定邀请。


目前我实现的有:生成好了带参数的二维码,目前在测试的时候 无法获取到二维码中的参数,并且对应输出判断。


第一阶段:求如何获取到二维码参数,并分别进行回调!

//根据access_token请求链接获取ticket
$url="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$token";
$code='{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 3306}}}';
$ch1=curl_init();
curl_setopt($ch1, CURLOPT_URL,$url);
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch1, CURLOPT_POST,1);
curl_setopt($ch1, CURLOPT_POSTFIELDS,$code);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER,1);//禁止调用时就输出获取到的数据
$result=curl_exec($ch1);
curl_close($ch1);
$result=json_decode($result);


"scene_id": 3306

whwh033 发表于 2021-5-28 15:04

你这用的永久二维码,最大数量10W个,用完就没了。

微信文档:
用户扫描带场景值二维码时,可能推送以下两种事件:

如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。
1. 用户未关注时,进行关注后的事件推送

推送XML数据包示例:

<xml>
<ToUserName><!]></ToUserName>
<FromUserName><!]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><!]></MsgType>
<Event><!]></Event>
<EventKey><!]></EventKey>
<Ticket><!]></Ticket>
</xml>

825578598 发表于 2021-5-28 15:53

我记得二维码会加一个你自定义的URL的,你在url加你的参数,然后用$_GPC获取

han52036 发表于 2021-5-28 15:54

whwh033 发表于 2021-5-28 15:42
你这用的永久二维码,最大数量10W个,用完就没了。

微信文档:


文档这个 我知道 scene_str 方法应该都是一样的。我也知道推送的示例是这个,我现在是 我不知道怎么去抓取这个返回的XML。

xiajin 发表于 2021-5-28 16:04

本帖最后由 xiajin 于 2021-5-28 16:14 编辑

eventkey就是二维码写入的scene_str(场景值)。
eventkey就是二维码写入的scene_str(场景值)。
eventkey就是二维码写入的scene_str(场景值)。

代码主要看responseMsg方法后续根据场景值写自己的逻辑代码

class Weixin extends Controller
{
    public function valid()
    {
      //定义一个常量,存储token的
      //获取微信服务器GET请求的4个参数
      $signature = $_GET['signature'];
      $timestamp = $_GET['timestamp'];
      $nonce = $_GET['nonce'];
      $echostr = $_GET['echostr'];
      //定义一个数组,存储其中3个参数,分别是timestamp,nonce和token
      $tempArr = array($nonce,$timestamp,TOKEN);
      //进行排序
      sort($tempArr,SORT_STRING);
      //将数组转换成字符串
      $tmpStr = implode($tempArr);
      //进行sha1加密算法
      $tmpStr = sha1($tmpStr);
      //判断请求是否来自微信服务器,对比$tmpStr和$signature
      if ($tmpStr == $signature) {
            return true;
      } else {
            return false;
      }
    }

    public function index()
    {
      if (!isset($_GET['echostr'])) {
            //调用wecat对象中的方法响应用户消息
            $this->responseMsg();
      } else {
            //调用valid()方法,进行token验证
            $echoStr = $_GET["echostr"];
            //valid signature , option
            if ($this->valid()) {
                echo $echoStr;
                exit;
            }
      }
    }
   
    //重要的代码再这里
    //响应消息处理
    public function responseMsg()
    {
      $postStr = file_get_contents("php://input");
      //接收微新传过来的xml消息数据
      //如果接收到了就处理并回复
      if (!empty($postStr)) {
            //将接收的消息处理返回一个对象
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            //从消息对象中获取消息的类型 textimage location voice vodeo link
            $RX_TYPE = trim($postObj->MsgType);//消息类型
            $eventKey = trim($postObj->EventKey);// 这里就是你写入二维码的参数了,
            //@todoing 在扫码事件里根据二维码参数,写你的逻辑
            $result = '';
            switch ($RX_TYPE) {
                case "event":
                  $result = $this->receiveEvent($postObj);
                  break;
                case "text":
                  $result = $this->receiveText($postObj);   //接收文本消息
                  break;
                default:
                   $result = "unknown msg type: ".$RX_TYPE;   //未知的消息类型
                   break;
            }
            //输出消息给微信
            echo $result;
      } else {
            //如果没有消息则输出空,并退出
            echo "";
            exit;
      }
    }
}

han52036 发表于 2021-5-28 16:19

xiajin 发表于 2021-5-28 16:04
eventkey就是二维码写入的scene_str(场景值)。
eventkey就是二维码写入的scene_str(场景值)。
eventk ...

感谢回复,我现在最主要是问题是,我不知道在哪里去抓取这个参数,比如我是新建一个接口文件 在这里面新建framework/builtin/userapi/api   还是在根目录的api.php(公众号后台的服务器回调地址)

whwh033 发表于 2021-5-28 16:55

han52036 发表于 2021-5-28 16:19
感谢回复,我现在最主要是问题是,我不知道在哪里去抓取这个参数,比如我是新建一个接口文件 在这里面新 ...

就是回调,你记录日志,扫码关注下就知道了

xiajin 发表于 2021-5-28 17:33

本帖最后由 xiajin 于 2021-5-28 17:41 编辑

han52036 发表于 2021-5-28 16:19
感谢回复,我现在最主要是问题是,我不知道在哪里去抓取这个参数,比如我是新建一个接口文件 在这里面新 ...
用户扫描二维码触发扫码事件,微信那边之后会向你的服务器回调地址发送数据,你再根据数据里的二维码参数处理逻辑,


responseMsg方法就接收微信推送数据的方法,也就是这里来抓取这个参数

这里的服务器地址写的地址就是你该写处理二维码参数逻辑的地方


页: [1]
查看完整版本: 扫码带参数的二维码如何获取参数并触发之微擎开发小白问题