최근 WeChat PC 웹 페이지에 대한 WeChat 관련 기능을 개발하고 있습니다. 초보자의 관점에서 보면 WeChat 공개 계정의 문서는 여전히 온라인에서 발견되는 대부분의 게시물이 기본적으로 WeChat의 복사본이므로 이해하기 어렵습니다. 공개 계정 플랫폼에 제공된 문서에 따르면 매개변수를 사용하여 WeChat QR 코드를 개발하는 과정에는 여전히 많은 함정이 있습니다. 여기에는 모든 사람에게 도움이 되기를 바라면서 개발 과정을 자세히 기록하겠습니다.
이번 개발에는 인증 서비스 계정을 사용하고 있습니다.
1 접속
먼저 위챗 공식 계정에 들어가세요-> 기본 구성
다음은 기본 구성 페이지입니다. URL에 서버 주소를 입력하세요. 이 주소는 thinkPHP 프레임워크를 사용하여 프로그램을 개발한 것입니다. 모듈(장식)의 새 클래스를 생성합니다(예: WechatAction.class.php). 그리고 Action에서 새 공용 메서드를 생성합니다(예: URLRedirect()). 채워진 URL은 http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect입니다. 그런 다음 토큰을 입력하고 원하는 대로 토큰을 입력합니다. EncodingAESKey 또는 그렇지 않은 경우 확인을 클릭하면 WeChat은 이 URL로 이동합니다. 많은 매개변수가 포함된 가져오기 요청을 보내면 대부분 WeChat 서버에서 액세스가 요청되는지 확인할 수 있습니다. 그의 요청은 다음과 같습니다. 확인에 성공하면 그대로 get 요청에 반환됩니다. 여기서 반환은 return이 아니며, thinkPHP로 개발하는 경우에는 echo를 사용하면 됩니다. I('echostr'); 직접적으로. 그러면 인터페이스 확인이 성공한 것입니다.
2 매개변수가 있는 QR코드의 기능
WeChat에는 매개변수가 포함된 QR코드가 있는데 하나는 임시 QR코드이고 다른 하나는 영구 QR코드입니다. 하지만 이번에 생성할 수 있는 영구 QR코드 수에는 제한이 있습니다. 구현된 기능은 사용자가 로그인 없이 웹사이트에서 제품을 사용할 수 있도록 하는 것입니다. 예를 들어 특정 제품에 대한 자세한 견적을 받고 싶지만 등록을 원하지 않지만 견적을 저장하고 싶을 때 웹페이지에서 할 수 있습니다. QR 코드를 생성하면 사용자는 WeChat을 사용하기만 하면 됩니다. 이 QR 코드를 스캔하면 공식 공개 계정에서 그래픽 메시지를 클릭한 후 하루 동안 사용자에게 그래픽 메시지가 전송됩니다. 방금 얻은 정보를 클릭하여 언제든지 확인하고 가격 비교를 위해 친구들과 공유할 수 있습니다. 따라서 임시 QR코드는 정상적으로 이용이 가능합니다.
위는 제가 사용하는 방법입니다. 전체 상호작용 과정을 소개합니다.
사용자가 이 QR 코드를 스캔하면, 사용자가 공식 계정을 팔로우한 후, 사용자는 공식 계정으로 대화 페이지에 직접 들어가게 됩니다. WeChat 서버는 이전 단계에서 설정한 서버 URL로 메시지를 푸시하며, 여기에는 사용자 정의 매개변수가 포함될 수 있습니다. 사용자가 공식 계정을 팔로우하지 않는 경우 먼저 공식 계정 팔로우 페이지로 이동합니다. 사용자가 팔로우를 클릭하면 공식 계정의 대화 페이지로 바로 들어가게 됩니다. 이때 WeChat 서버도 마찬가지입니다. 우리가 설정한 URL에 이벤트 메시지를 푸시하고 매개변수를 사용자 정의하면 이 매개변수와 이벤트 유형을 기반으로 다음 작업을 제어할 수 있습니다.
3 구체적인 개발 과정
3.1 access_token 획득
이 access_token은 WeChat 인터페이스를 호출하기 위한 프로그램의 인증서입니다. 현재 유효 기간은 7200초이므로 정기적으로 access_token을 업데이트해야 합니다.
획득 방법:
方法 : GET url :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은 호출 인터페이스 자격 증명이고 만료_in은 토큰 유효 시간입니다.
저는 개인적으로 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']; } } }rrree
이를 캡슐화한 후에는 매번 안심하고 사용할 수 있습니다.
3.2 임시 QR코드 생성
3.2.1 티켓 받기
C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
인터페이스 URL의 TOKEN은 3.1에서 얻은 access_token입니다. 게시물 데이터의 만료_초는 QR 코드의 유효 기간이며, action_name이 임시인 경우 최대 30일입니다. QR 코드는 QR_SCENE으로 고정되어 있으며 scene_id는 사용자 정의 매개변수이고 0이 아닌 32비트 정수입니다. 애플리케이션에서 주문 ID로 설정했습니다. WeChat 서버가 이벤트를 푸시하면 반환됩니다. 이 값을 우리가 설정한 인터페이스에 적용한 다음 이를 사용할 것입니다. 해당 주문 데이터를 가져와서 웹페이지에 표시하는 것은 나중에 다루겠습니다.
다음은 임시 QR 코드를 생성하는 캡슐화된 방법입니다.
请求方式: 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}}}
api_notice_increment() 메서드는 I입니다. 많은 POST 메소드를 시도했지만 WeChat 인터페이스가 POST 메소드와 매개변수에 대해 엄격한 제한을 두었기 때문에 시간이 많이 걸렸습니다. 마침내 온라인에서 사용할 수 있는 캡슐화된 POST 메소드를 찾았습니다. 먼저 직접 시도해 보세요. WeChat에서 오류가 반환되면 이것을 사용하세요. 적어도 WeChat 인터페이스를 테스트할 때 postman을 사용하여 모든 오류를 테스트하고 반환했는데 매우 엄격한 JSON 문자열이어야 합니다. . 끈. 다음 메소드는 다음과 같습니다.
//创建临时二维码 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']); }
getTemporaryQrcode() 구성 파일에는 모든 사람이 볼 수 있는 매개변수가 있는데, 이는 실제로 WeChat 인터페이스 링크입니다.
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; } }
이 인터페이스의 반환 값은 다음과 같습니다.
C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##
ticket은 다음 통화에 사용하는 바우처이고,expire_seconds는 QR 코드입니다. 유효기간, URL은 생성된 QR코드를 스캔한 후 열리는 링크입니다. 따라서 QR 코드를 생성하는 방법을 직접 구현하면 다음 호출을 수행할 필요가 없습니다. 이 단계에서 멈추고 url 값을 직접 반환한 다음 이 url 값을 사용하여 QR 코드를 생성합니다. 로컬에 저장할 수 있습니다. phpqrcode를 사용하면 PHP에서 QR 코드를 생성할 수 있는데, 이는 사용하기 매우 쉽습니다. 다음 단계도 간략하게 언급되어 있습니다.
3.2.2 QR 코드 주소 받기
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
이 인터페이스의 반환 값은 직접 표시하거나 다운로드할 수 있는 그림입니다. 자세히 사용해 봤기 때문에 표시 방법을 모르겠습니다.
3.3 사용자가 QR 코드를 스캔한 후 발생하는 상황
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中文网!