>  기사  >  백엔드 개발  >  PHP WeChat development_php 예제에서 매개변수와 함께 QR 코드 사용

PHP WeChat development_php 예제에서 매개변수와 함께 QR 코드 사용

WBOY
WBOY원래의
2016-08-17 13:02:331016검색

최근 WeChat PC 웹 페이지에 대한 WeChat 관련 기능을 개발하고 있습니다. 초보자의 관점에서 보면 WeChat 공개 계정의 문서는 여전히 이해하기 어렵습니다. 온라인에서 발견되는 게시물의 대부분은 기본적으로 WeChat 공개 플랫폼에서 복사된 것입니다. 문서, 매개변수를 사용하여 WeChat QR 코드를 개발하는 과정에서 여전히 많은 함정에 직면했습니다. 모든 사람에게 도움이 되기를 바라면서 여기에 개발 과정을 더 자세히 기록하겠습니다.

이 개발을 위해 인증 서비스 계정을 사용하고 있습니다.

1 접속
먼저 위챗 공식 계정에 들어가세요 -> 다음은 기본 구성 페이지입니다. URL에 서버 주소를 입력합니다. 이 주소는 ThinkPHP 프레임워크를 사용하여 프로그램을 개발했습니다. 모듈 중 하나입니다. (장식)(예: Call: WechatAction.class.php) 작업에서 새 공개 메소드를 생성합니다(예: URLRedirect() 호출). 그런 다음 이 URL을
http://[IP로 입력합니다. ]:[port]/ index.php/Decoration/Wechat/UrlRedirect 그런 다음 토큰을 입력하고 EncodingAESKey 여부에 관계없이 원하는 대로 토큰을 입력한 다음 확인을 클릭하면 WeChat에서 가져오기 요청을 보냅니다. 많은 매개변수가 포함된 이 URL에 대한 대부분의 요청은 WeChat 서버에서 이 방문을 요청하는지 확인하지 않았습니다. 그의 요청은 우리가 성공적으로 확인하면 get 요청에 있는 하나의 매개변수가 여기서 return은 return이 아니며, echo를 사용합니다. thinkPHP로 개발한 경우에는 echo I('echostr');을 직접 사용하세요. 그러면 인터페이스 확인이 성공한 것입니다.

2 매개변수가 있는 QR코드의 기능
WeChat에는 매개변수가 포함된 QR코드가 있는데, 하나는 임시 QR코드이고 다른 하나는 영구 QR코드입니다. 그러나 생성할 수 있는 영구 QR코드 수에는 제한이 있습니다. 이번에는 로그인 없이 홈페이지에서 상품을 이용할 수 있는 기능입니다. 예를 들어, 특정 상품에 대한 상세 견적을 받고 싶은데, 이때 견적을 저장하고 싶은 경우, 웹페이지에서는 QR 코드를 생성할 수 있으며, 사용자는 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은 호출 인터페이스 자격 증명이고,expire_in은 토큰 유효 시간입니다.

저는 개인적으로 access_token을 데이터베이스에 저장하고, 만료 시간을 저장한 다음, getWechatAccessToken()을 캡슐화합니다. 매번 access_token이 만료되었는지 확인하고, 그렇지 않으면 직접 사용할 수 있습니다. 데이터베이스에 저장된 access_token. 하루에 이 access_token을 얻을 수 있는 횟수에 제한이 있어야 한다는 내용을 어딘가에서 읽은 것을 잊어버렸습니다. 다음은 getWechatAccessToken()의 구체적인 구현입니다.


C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

封装好这个之后,我们每次就可以安心的使用了。

.2 创建临时二维码

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,不管分享到哪儿,用什么浏览器打开都是可以访问的,且展示的也是这个用户的头像和昵称信息,这也是我要实现的一个效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.