이 글은 주로 PHP WeChat 개발에서 매개변수가 포함된 QR 코드 사용에 대해 자세히 소개합니다. 관심 있는 친구들은 참고할 수 있습니다.
최근 저는 WeChat PC 웹 페이지에 대한 WeChat 관련 기능을 개발하고 있습니다. 관점에서 볼 때, WeChat 공개 계정의 문서는 여전히 이해하기 어렵습니다. 온라인에서 발견되는 대부분의 게시물은 기본적으로 WeChat 매개변수화된 QR 코드를 개발하는 과정에서 직면하게 되는 많은 함정이 있습니다. , 여기에 제 개발 과정을 더 자세히 기록하겠습니다. 모두에게 도움이 되기를 바랍니다.
이 개발에는 인증 서비스 계정을 사용하고 있습니다.
1 접속
우선 위챗 공식 계정에 들어가세요-> 기본 구성
다음은 제가 사용하는 위챗 푸시 이벤트를 받기 위한 서버 주소를 입력하는 페이지입니다. thinkPHP 프레임워크 개발된 프로그램의 경우 모듈(장식) 중 하나의 Action 디렉터리에 새 클래스를 만듭니다. 예: WechatAction.class.php, Action에서 새 공용 메서드를 만듭니다. 예: URLRedirect(), 그런 다음 URL을 입력하세요. 하나는 http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect입니다. 그런 다음 토큰을 입력하고 원하는 대로 토큰을 입력하세요. EncodingAESKey 또는 그렇지 않은 경우 확인을 클릭하면 WeChat은 많은 매개변수가 포함된 URL에 대한 요청 보내기로 이동합니다. 대부분의 경우 WeChat 서버에서 액세스를 요청하는지 확인할 수 있습니다. 성공적으로 확인하면 get 요청이 그대로 반환됩니다. echostr의 한 매개변수는 반환도 아니고 ajaxReturn도 아니지만 echo를 사용하여 개발하는 경우에는 echo I('echostr'을 사용하세요. ); 곧장. 그러면 인터페이스 확인이 성공한 것입니다.
2 매개변수가 있는 QR코드의 역할
WeChat에는 매개변수가 있는 QR코드가 두 종류 있는데, 하나는 임시 QR코드이고, 다른 하나는 영구 QR코드이지만 영구 QR코드에는 제한이 있습니다. 이번에 구현해보고 싶은 기능은 사용자가 로그인 없이도 홈페이지에서 상품을 이용할 수 있는 기능입니다. 이때 웹페이지는 QR 코드를 생성할 수 있습니다. 사용자가 WeChat으로 QR 코드를 스캔하면 공식 공개 계정은 그래픽 메시지가 하루 동안 사용자에게 전송됩니다. 클릭하시면 사용자가 방금 취득한 견적이 되며, 언제든지 클릭하시면 보실 수 있으며 친구들과 공유하여 가격비교도 가능합니다. 따라서 임시 QR코드는 정상적으로 이용이 가능합니다.
위는 제가 사용하는 방법입니다. 전체 상호 작용 과정을 소개합니다:
3 특정 개발 프로세스
3.1 access_token 획득
이 access_token은 WeChat 인터페이스를 호출하기 위한 프로그램의 인증서입니다. 현재 유효 기간은 7200초이므로 access_token을 정기적으로 업데이트해야 합니다. . 가져오기 방법:
방법: GETurl:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
APPID 및 APPSECRET 매개변수는 공개됩니다. 계정의 APPID 및 APPSECRET은 WeChat 공식 계정 -> 기본 구성에서 찾을 수 있습니다. 성공적인 호출은 다음 JSON 데이터를 반환합니다:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
개인적으로 access_token을 데이터베이스에 저장하고, 공개 함수 getWechatAccessToken()을 캡슐화합니다. 매번 access_token이 만료되었는지 확인하고, 만료되지 않으면 직접 다시 얻을 수 있습니다. 데이터베이스에 저장된 access_token을 사용하세요. 어디선가 이 access_token을 하루에 얻을 수 있는 횟수에 제한이 있다는 것을 읽었습니다. 다음은 getWechatAccessToken()의 구체적인 구현입니다.
//获取access_token function getWechatAccessToken(){ $wechatInfo = M('wechat_info')->select(); $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;')); $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value']; //前面不用管,是我数据库相应设置 if (time() < $expireTime){ //access_token未过期 return $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN']['conf_value']; }else{ //access_token过期,重新获取 $baseUrl = C('WECHAT_PUBLIC_GET_ACCESS_TOKEN'); $url = str_replace("##APPSECRET##", $wechatInfo['PUBLIC_WECHAT_APPSECRET']['conf_value'], str_replace("##APPID##", $wechatInfo['PUBLIC_WECHAT_APPID']['conf_value'], $baseUrl)); $result = file_get_contents($url); $result = json_decode($result, true); if (array_key_exists('errorcode', $result)){ //失败重试一次 return false; }else{ M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN'))->save(array('conf_value' => $result['access_token'])); M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES'))->save(array('conf_value' => time()+$result['expires_in']-200)); return $result['access_token']; } } }
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret= APPSECRET
.2 임시 QR 코드 만들기
3.2.1 获取ticket3
请求方式: POST
接口:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST数据: {"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
接口URL中的TOKEN即我们在3.1中获取的access_token,post数据中expire_seconds是二维码的有效时间,最多为30天,action_name临时二维码的话固定就是QR_SCENE,scene_id即我们自定义参数,是个32位非0整数,我在应用中把它设为订单的ID,微信服务器推送事件的时候会把这个值返回给我们设置的接口中,然后我会根据这个值去拿相应的订单数据展示在网页上,这是后话。
下面是封装的生成临时二维码的方法:
//创建临时二维码 function getTemporaryQrcode($orderId){ $accessToken = getWechatAccessToken(); $url = str_replace("##TOKEN##", $accessToken, C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET')); $qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$orderId.'}}}'; $result = api_notice_increment($url, $qrcode); $result = json_decode($result, true); return urldecode($result['url']); }
其中的方法 api_notice_increment() 是我封装的一个POST方法函数,我试过很多POST的方法,可能由于微信接口对POST方法和参数的限制比较严格,这个浪费了好久时间,最后在网上找到了一个可以使用的封装好的POST方法,建议大家先自己试试,如果微信返回错误吗,就用这个吧,起码我测试微信这个接口的时候用postman测试返回的都是错误,而且一定要用JSON字符串,一定要是非常严格的JSON字符串。下面是这个方法:
function api_notice_increment($url, $data){ $ch = curl_init(); $header = "Accept-Charset: utf-8"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { curl_close( $ch ); return $ch; }else{ curl_close( $ch ); return $tmpInfo; } }
getTemporaryQrcode() 中有一个在配置文件中的参数给大家看下,其实就是微信接口链接:
C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##
这个接口的返回值是:
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
其中ticket是让我们用来进行下一步调用的凭证,expire_seconds是二维码的有效期,url是我们生成的二维码扫描后打开的链接。所以如果我们自己实现了生成二维码的方法,就不用再进行下一步调用,我本人即在这一步就停止了,直接返回url的值,然后利用这个url的值生成二维码存在本地即可。PHP生成二维码可以使用phpqrcode,挺好用的。下一步也大致提一下:
3.2.2 获取二维码地址
请求方式: GET
接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
这个接口的返回值是一张图片,可以直接展示或者下载,我们有具体使用过,所以也不知道应该怎么展示。
3.3 用户扫描二维码之后发生的事情
3.3.1 扫描后发生了什么
上面提到了,用户扫描我们生成的临时二维码,如果用户未关注公众号,则首先会跳转到公众号的关注页面,点击关注后,会进入公众号的会话页面,同时会给我们设置的接口推送一个事件。如果用户已经关注了,用户微信会直接跳转到公众号会话页面,然后微信服务器会给我们设置的接口推送一个事件。
用户关注与否微信服务器给我们推送的事件是差不多的,只是新关注用户推送的事件中scene_id前面会加一个前缀。下面是微信公众平台文档的说明:
用户未关注时,进行关注后的事件推送
<xml><ToUserName><![CDATA[toUser]]></ToUserName> //开发者微信号 <FromUserName><![CDATA[FromUser]]></FromUserName> //发送者账号(openid) <CreateTime>123456789</CreateTime> //消息创建时间(整型) <MsgType><![CDATA[event]]></MsgType> //消息类型 event <Event><![CDATA[subscribe]]></Event> //事件类型(subscribe) <EventKey><![CDATA[qrscene_123123]]></EventKey> //事件KEY值,qrscene_为前缀,后面为二维码参数值 <Ticket><![CDATA[TICKET]]></Ticket> //二维码ticke值,可以用来换取二维码图片 </xml>
用户已关注时的事件推送
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> //开发者微信号 <FromUserName><![CDATA[FromUser]]></FromUserName> //发送者账号(openid) <CreateTime>123456789</CreateTime> //消息创建时间 <MsgType><![CDATA[event]]></MsgType> //消息类型event <Event><![CDATA[SCAN]]></Event> //事件类型 event <EventKey><![CDATA[SCENE_VALUE]]></EventKey> //事件key值,是一个32位无符号整数,即创建二维码时的二维码scene_id <Ticket><![CDATA[TICKET]]></Ticket> //二维码的ticke,可以用来换取二维码图片 </xml>
3.3.2 我们要做些什么
我们需要在自己填写的URL接口中接收这个事件,然后拿到我们需要的东西做我们想干的事儿。因为我要实现的功能比较简单,只需要拿到scene_id即可,因为这是我要展示给用户看的订单数据。下面是我写的接收和处理部分,比较简单,主要看一下应该怎么接收微信推送的事件:
public function urlRedirect(){ $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = (string)$postObj->FromUserName; $EventKey = trim((string)$postObj->EventKey); $keyArray = explode("_", $EventKey); if (count($keyArray) == 1){ //已关注者扫描 $this->sendMessage($fromUsername, $EventKey); }else{ //未关注者关注后推送事件 $this->sendMessage($fromUsername, $keyArray[1]); } }
我没有使用其他参数,只是根据不同的推送事件拿到我想要的订单ID,然后这时候其实相当于你在这里用公众号的客服在跟扫码的这个用户对话,上段代码中调用的sendMessage()是使用客户账号给扫码用户发送一个图文消息,因为我在拿scen_id的同时也拿到了用户的openid,可以利用这个给用户发送消息。
下面是sendMessage()方法:
//给用户发送图文消息,点击跳转到报价页面 public function sendMessage($openid,$orderId){ $url = str_replace('##TOKEN##', getWechatAccessToken(), C('WECHAT_SEND_MESSAGE')); $redirectUrl = str_replace("##ORDERID##", $orderId, str_replace("##OPENID##", $openid, C('WECHAT_REDIRECT_URL_PRE'))); $orderInfo = M('order')->where(array('orderid' => $orderId))->field(array('totalMoney', 'savedMoney', 'roomarea'))->find(); $description = str_replace("##ROOMAREA##", intval($orderInfo['roomarea'] * 1.25), C('WECHAT_MESSAGE_BRIEF')); $description = str_replace("##TOTALBUDGET##", $orderInfo['totalMoney'], $description); $description = str_replace("##MARKETBUDGET##", $orderInfo['totalMoney']+$orderInfo['savedMoney'], $description); $description = str_replace("##SAVEMONEY##", $orderInfo['savedMoney'], $description); $dataStr = '{"touser":"' . $openid . '","msgtype":"news","news":{"articles":[{"title":"' . C('WECHAT_MESSAGE_TITLE') . '","description":"' . $description . '","url":"' . $redirectUrl . '","picurl":"' . C('WECHAT_MESSAGE_PICURL') . '""}]}}'; api_notice_increment($url, $dataStr); }
其中 C('WECHAT_SEND_MESSAGE') = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=##TOKEN##' 至于下面的一大段str_replace,就是在组给用户发送的文字而已,需要注意$dataStr的格式,这里面要求JSON字符串比较严格,必须所有的字符串都用双引号括起来。微信接口对POST参数的限制真心严格。
下面是微信公众平台开发者文档中要求发送图文消息的POST data格式:
{ "touser":"OPENID", "msgtype":"news", "news":{ "articles": [ { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" }, { "title":"Happy Day", "description":"Is Really A Happy Day", "url":"URL", "picurl":"PIC_URL" } ] } }
其中url是用户点击这个消息之后打开的地址,这个时候我就组了一个自己网站的地址,是一个get请求地址,里面携带参数是用户的openid和订单id,这样用户点击开图文消息就可以看到自己刚才下单的内容了,因为需要在网页上展示用户的微信头像和昵称,所以我把openid也放到参数里,在页面加载前先拿到用户的个人信息和订单数据,再展示网页。这样流程:用户未登录下单 -> 生成微信二维码 -> 用户扫码关注公众号 -> 查看订单详细信息 就完成了。而且因为这个图文消息打开后的链接携带的参数是这个用户的额openid和其下单的订单ID,不管分享到哪儿,用什么浏览器打开都是可以访问的,且展示的也是这个用户的头像和昵称信息,这也是我要实现的一个效果。
总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。
相关推荐:
위 내용은 PHP 기반 WeChat 개발을 위한 매개변수와 함께 QR 코드 사용 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!