目录
一、生成带参数的二维码
用户扫描带场景值二维码时,可能推送以下两种事件:
- 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
- 如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。
【场景值:keyword】
获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。
1、使用2种方式实现创建二维码ticket;
(1)官方在线接口创建ticket,要求实现临时二维码和永久二维码ticket
获取链接:https://mp.weixin.qq.com/debug/
可见临时和永久二维码的返回值相差一个expire_seconds
获得二维码其所拼接的url为:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
即为返回数据的url+tick的拼接。
(2)编码方式创建ticket,要求实现临时二维码和永久二维码ticket
1.截图
若要得到永久二维码 将json数据$QRdata_temp换成
$QRdata_permanent=’{
“action_name”: “QR_LIMIT_SCENE”,
“action_info”: {
“scene”: {
“scene_str”: 123
}
} }’;
即可。复制访问链接即可获取二维码
2.实现代码
先获取access_token,再创建二维码ticket,然后凭借ticket到指定URL访问换取二维码
【get_ticket.php】
<?php
//error_reporting(0);
require "../FUN.php";
$access_token=get_TOKEN();
echo "测试号access_token的值为:".$access_token."</br>";
//2.组织带场景值二维码的$data
//temp:临时 permanent:永久
//60*60*24=86400 604800是7天
//900=60*15
$QRdata_temp='{
"expire_seconds": 900,
"action_name": "QR_SCENE",
"action_info": {
"scene": {
"scene_id": 123
}
}
}';
$QRdata_permanent='{
"action_name": "QR_LIMIT_SCENE",
"action_info": {
"scene": {
"scene_str": 123
}
}
}';
$ticket=getTicket($QRdata_temp);//下面函数
echo "ticket的值为:".$ticket;
$url2="https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
echo "<br>"."通过ticket换取二维码的访问链接为:".$url2;
function getTicket($data){
$token=get_TOKEN();
$url="https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$token;
$output=https_request($url,$data);
$result=(array)json_decode($output);
$ticket=$result['ticket'];
return $ticket;
// print_r($result);
}
2、通过ticket换取二维码并进行下载保存。
(1)代码实现
【download_QR.php】
<?php
require "get_ticket.php";
//60*60*24=86400 604800是7天
$QRdata_temp = '{
"expire_seconds": 900,
"action_name": "QR_SCENE",
"action_info": {
"scene": {
"scene_id": 123
}
}
}';
//$QRdata_permanent='{
// "action_name": "QR_LIMIT_SCENE",
// "action_info": {
// "scene": {
// "scene_str": 123
// }
// }
//}';
$ticket = getTicket($QRdata_temp);//获取创建的二维码ticket
$url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" . $ticket;
$imageInfo = downloadQR($url);//函数下面
$filename = 'QR2.jpg';//文件名
$local_file = fopen($filename, 'w');//fopen打开文件
/**
* 如果打开文件成功,则再文件名为$filename中写入$imageInfo["body"]
* 写入文件不是失败则关闭文件
*/
if (false !== $local_file) {
if (false !== fwrite($local_file, $imageInfo["body"])) {
// if (false !== fwrite($local_file, $imageInfo)) {
echo "打开文件成功";
fclose($local_file);
} else {
echo "写入文件失败!";
}
} else {
echo "打开文件失败!";
}
function downloadQR($url)
{
$curl = curl_init($url);//初始化cURL 会话
//非零为真,零为假
//启用时会将头文件的信息作为数据流输出,,假,参数为1表示输出信息头,为0表示不输出
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_NOBODY, 0);//不输出 BODY 部分,,假
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//信任任何证书
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);//查证书中是否设置域名
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);设置是否将响应结果存入变量,1是存入,0是直接echo出
$package = curl_exec($curl);//curl_exec执行 cURL 会话
$httpinfo = curl_getinfo($curl);//curl_getinfo获取一个cURL连接资源句柄的信息
curl_close($curl);//关闭 cURL 会话
//return array_merge(array('body' => $package), array('header' => $httpinfo));//array_merge合并一个或多个数组
return array('body' => $package);
}
(2)思路
二、扫描带参数二维码事件案例实现
接收到未关注用户扫描带场景值二维码后回复用户欢迎关注信息及场景值;
接收已关注用户扫描二维码返回场景值;
1.截图
2.代码实现
<?php
/**
* 接收到未关注用户扫描带场景值二维码后回复用户欢迎关注信息及场景值;
* 接收已关注用户扫描二维码返回场景值;
*/
error_reporting(0);
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
} else {
$wechatObj->valid();
}
class wechatCallbackapiTest
{
//验证接口的函数,用于申请成为开发者时向微信发送验证信息
public function valid()
{
$echoStr = $_GET["echostr"];
if ($this->checkSignature()) {
echo $echoStr;
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;
}
}
//响应消息函数
public function responseMsg()
{
//$postStr为用户在微信公众平台发的信息
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);//判断平台接受的消息类型
//用户发送的消息类型判断
switch ($RX_TYPE) {
case "event": //事件消息
$resultStr = $this->receiveEvent($postObj);
break;
default:
$resultStr = "unknow msg type: " . $RX_TYPE;
break;
}
echo $resultStr;
} else {
echo "???";
exit;
}
}
/**
* 用户扫码后,微信服务器转发事件数据包;
* 分析数据包,判断消息类型(依次判断:MsgType类型、Event类型、EventKey)
* 依据业务需求,组装被动回复用户数据或进一步实现其他的业务;
* 更新接口文件上传至服务器;
* 个人微信端进行测试分析。
*/
private function receiveEvent($object)
{
$Event = $object->Event;
if ($Event == "subscribe") {
$keyword = $object->EventKey;
if (isset($keyword)) {
$qrscene_Str = substr(trim($keyword), 0, 7);
if ($qrscene_Str == qrscene) {
$contentStr = "欢迎关注" . "\n你是来自扫描二维码关注的,你的场景值为:" . $object->EventKey;
} else {
$contentStr = "欢迎关注" . "\n" . "你不是来自扫描二维码关注的";
}
} else {
$contentStr = "欢迎关注";
}
} elseif ($Event = "SCAN") {
$keyword = $object->EventKey;
switch ($keyword) {
case "123":
$contentStr = "你的场景值为:" . $keyword;
break;
default:
break;
}
} else {
$contentStr = "你点击了菜单";
}
$resultStr = $this->transmitText($object, $contentStr);
return $resultStr;
}
//回复文本消息
private function transmitText($object, $content)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
}
?>
3.思路
把sceneid改一下,在事件处理处理一下就可以实现二维码事件
三、补充
1.PHP CURL curl_setopt 参数:
学习链接:https://www.php.net/manual/zh/function.curl-setopt.php
https://www.cnblogs.com/txw1958/archive/2013/01/19/2867584.html?_t_t_t=0.7668585337232798
2.扫描带参数的二维码事件的xml数据
3.附加FUN.php
<?php
//获取测试号的token值
function get_TOKEN(){
$appid = "你自己的测试号APPID";
$appsecret = "你自己的测试号APPSECRET";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$output = https_request($url);
$result = (array)json_decode($output);
$access_token=$result['access_token'];
return $access_token;
}
//定义服务请求函数,get/post——参考链接为:https://segmentfault.com/a/1190000006220620
function https_request($url, $data = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT,60);
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
?>
2020-06-13