微信开发日记——生成带参数二维码

接下来一个非常重要的就是生成带参数的二维码了,当用户还没关注公众账号时,用户会自动发送关注事件给公众账号。如果用户已经关注公众账号,则自动进入会话。创建二维码主要是两个关键的步骤,创建二维码ticket和换取二维码。创建二维码ticket是post请求,有临时二维码和永久二维码两种情况,临时url:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN,永久url:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN而且post过去的是JSON数据,正确的JSON返回ticket,凭借这个“ticket”票去换取二维码图片。换取的url为GET请求,正确返回一张图片,包含图片的大小、类型、创建时间等。这图片在网页端可以直接显示。但如果返回给用户的话,直接返回是不正确的。因为这是图片,需要转换成图片的格式与用户交流。因为图片不是本地的,直接发送获取不到,这就需要先上传到服务器,上传图片包含类型以及media,上传多媒体文件也有大小限制,但一张二维码还是没有问题的。创建二维码函数如下

1
2
3
4
5
6
7
8
9
10
private function createQRcode()
{
$ACCESS_TOKEN = $this->getACCESS_TOKEN();
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$ACCESS_TOKEN;
$postStr = ’{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}’;
$responseArray = $this->postRequest($url, $postStr);
$ticket = $responseArray[’ticket’];
$url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".$ticket;
return $url;
}

整合一下,当用户发送一个消息给公众账号时,responseMsg()函数判断消息的类型$RX_TYPE = trim($postObj->MsgType);从而进入不同的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
switch ($RX_TYPE)
{
case "text":
$resultStr = $this->receiveText($postObj);
break;
case "event":
$resultStr = $this->receiveEvent($postObj);
break;
case "image":
$resultStr = $this->receiveImage($postObj);
break;
case "location":
$resultStr = $this->receiveLocation($postObj);
break;
case "voice":
$resultStr = $this->receiveVoice($postObj);
break;
case "video":
$resultStr = $this->receiveVideo($postObj);
break;
case "link":
$resultStr = $this->receiveLink($postObj);
break;
default:
$resultStr = "unknow msg type: ".$RX_TYPE;
break;
}
echo $resultStr;

当接受文本时根据不同的关键字再执行不同的功能,

1
2
3
4
5
6
7
8
9
private function receiveText($object)
{
$keyword = trim($object->Content);
if($keyword == "菜单" || $keyword == "0" || $keyword == 0)
{
$contentStr = $this->responseMenu($object);
}
...
}

事件类型同样的,通过一个个函数进去,从而实现想要的结果。

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>