扫码带参数的二维码如何获取参数并触发之微擎开发小白问题
本帖最后由 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
你这用的永久二维码,最大数量10W个,用完就没了。
微信文档:
用户扫描带场景值二维码时,可能推送以下两种事件:
如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。
1. 用户未关注时,进行关注后的事件推送
推送XML数据包示例:
<xml>
<ToUserName><!]></ToUserName>
<FromUserName><!]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><!]></MsgType>
<Event><!]></Event>
<EventKey><!]></EventKey>
<Ticket><!]></Ticket>
</xml> 我记得二维码会加一个你自定义的URL的,你在url加你的参数,然后用$_GPC获取 whwh033 发表于 2021-5-28 15:42
你这用的永久二维码,最大数量10W个,用完就没了。
微信文档:
文档这个 我知道 scene_str 方法应该都是一样的。我也知道推送的示例是这个,我现在是 我不知道怎么去抓取这个返回的XML。 本帖最后由 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;
}
}
}
xiajin 发表于 2021-5-28 16:04
eventkey就是二维码写入的scene_str(场景值)。
eventkey就是二维码写入的scene_str(场景值)。
eventk ...
感谢回复,我现在最主要是问题是,我不知道在哪里去抓取这个参数,比如我是新建一个接口文件 在这里面新建framework/builtin/userapi/api 还是在根目录的api.php(公众号后台的服务器回调地址) han52036 发表于 2021-5-28 16:19
感谢回复,我现在最主要是问题是,我不知道在哪里去抓取这个参数,比如我是新建一个接口文件 在这里面新 ...
就是回调,你记录日志,扫码关注下就知道了
本帖最后由 xiajin 于 2021-5-28 17:41 编辑
han52036 发表于 2021-5-28 16:19
感谢回复,我现在最主要是问题是,我不知道在哪里去抓取这个参数,比如我是新建一个接口文件 在这里面新 ...
用户扫描二维码触发扫码事件,微信那边之后会向你的服务器回调地址发送数据,你再根据数据里的二维码参数处理逻辑,
responseMsg方法就接收微信推送数据的方法,也就是这里来抓取这个参数
这里的服务器地址写的地址就是你该写处理二维码参数逻辑的地方
页:
[1]