이 글에서는 주로 PHP WeChat을 사용하여 매개변수가 포함된 QR 코드를 개발하는 방법을 자세히 설명합니다. 관심 있는 친구들은
을 참조하세요. 최근 저는 WeChat PC 웹페이지에서 WeChat 관련 기능을 개발하고 있습니다. 초보자의 관점에서 볼 때, 위챗 공개 계정의 문서는 여전히 이해하기 어렵습니다. 온라인에서 발견되는 대부분의 게시물은 기본적으로 위챗 공개 플랫폼에서 제공되는 문서의 복사본입니다. 많은 함정에 직면했기 때문에 모든 사람에게 도움이 되기를 바라며 여기에 개발 과정을 더 자세히 기록하겠습니다.
본 개발에는 인증 서비스 계정을 사용하고 있습니다.
1 접속
먼저 위챗 공식 계정을 입력하세요-> 기본 구성
다음은 기본 구성 페이지입니다. URL에 서버 주소를 입력하세요 , 이 주소는 위챗 푸시이벤트를 받아들이는 인터페이스입니다. PHP 프레임워크를 사용하여 프로그램을 개발했습니다. > (장식) Action 디렉터리에 새 클래스를 만듭니다(예: WechatAction.class.php). Action에 새 공용 메서드를 만듭니다(예: URLRedirect () , 이 URL을 http://[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect로 입력한 다음 토큰을 입력하세요. 원하는 대로 입력하세요. EncodingAESKey가 OK인지 아닌지 확인을 클릭하세요. 그런 다음 확인을 클릭하면 WeChat이 이 URL로 가져오기 요청을 보낼 것입니다. 여기에는 대부분 허용되는 많은 매개변수가 포함되어 있습니다. 이 방문이 올바른지 확인하기 위해 WeChat 서버에서 요청했습니다. 직접 확인하지 않았습니다. 그의 요구 사항은 성공적으로 확인하면 get 요청의 echostr 매개변수가 다음과 같이 반환된다는 것입니다. 여기서 return은 return이 아니며, ajaxReturn 대신 echo를 사용합니다. thinkPHP로 개발하는 경우 echo I('echostr');을 직접 사용하세요. 그러면 인터페이스 확인이 성공한 것입니다.
2 매개변수가 있는 QR 코드의 기능
WeChat에는 매개변수가 있는 QR 코드가 두 가지 유형이 있는데 하나는 임시 QR 코드 QR입니다. 코드 중 하나는 영구 QR코드인데 생성되는 영구 QR코드 개수에 제한이 있습니다. 이번에 구현해보고 싶은 기능은 사용자가 로그인 없이 홈페이지에서 상품을 받는 등의 상품을 이용할 수 있는 기능입니다. 견적을 등록하고 싶지 않지만 견적을 저장하고 싶습니다. 이때 웹페이지에서 QR 코드를 생성할 수 있습니다. 사용자는 WeChat으로 QR 코드를 스캔하기만 하면 공식 공개 계정에서 그래픽 메시지가 전송됩니다. , 그래픽 메시지를 클릭하면 사용자가 방금 얻은 견적을 볼 수 있으며 언제든지 클릭하여 가격 비교를 위해 친구들과 공유할 수 있습니다. 따라서 임시 QR코드는 정상적으로 이용이 가능합니다. 위는 제가 사용하는 방법입니다. 전체 대화형
프로세스에 대한 소개는 다음과 같습니다.
사용자가 이 QR 코드를 스캔하면 공식 계정, 사용자 공식 계정과의 대화 페이지에 직접 들어가고 WeChat 서버는 이전 단계에서 설정한 서버 URL로 메시지를 푸시하며 사용자 정의 매개변수를 전달할 수 있습니다. 사용자가 공식 계정을 팔로우하지 않는 경우 먼저 공식 계정 팔로우 페이지로 이동합니다. 사용자가 팔로우를 클릭하면 공식 계정의 대화 페이지로 바로 들어가게 됩니다. 이때 WeChat 서버도 마찬가지입니다. 우리가 설정한 URL에 이벤트 메시지를 푸시하고 매개변수를 사용자 정의하면 이 매개변수와 이벤트 유형을 기반으로 다음 작업을 제어할 수 있습니다.
3 구체적인 개발 프로세스
3.1 access_token 얻기 여기서 access_token은 호출 인터페이스입니다. 자격 증명의 경우 만료_in은 토큰 유효 시간입니다. C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') = https://api.weixin.qq. com/ cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 이것을 캡슐화하면 매번 안심하고 사용할 수 있습니다. .2 임시 QR 코드 생성 3.2.1 티켓 받기3 요청 방법: POST 다음은 임시 QR코드를 생성하는 캡슐화된 방법입니다: api_notice_increment() 메소드는 제가 캡슐화했습니다. POST 메소드 기능. WeChat 인터페이스에는 POST 메소드와 매개변수에 대한 엄격한 제한이 있기 때문에 많은 시간이 소요되었습니다. 마침내 온라인에서 사용할 수 있는 캡슐화된 POST 메소드를 찾았습니다. 먼저 직접 시도해 보세요. WeChat에서 오류가 반환되면 이 오류를 사용하세요. 적어도 WeChat 인터페이스를 테스트할 때 postman을 사용하여 모든 오류를 테스트했으며 반드시 JSONString을 사용해야 합니다. 매우 엄격한 JSON 문자열이어야 합니다. 다음 메소드는 다음과 같습니다. getTemporaryQrcode() 모든 사람이 볼 수 있도록 구성 파일에 실제로 WeChat인 매개변수가 있습니다. 인터페이스 링크: 이 인터페이스의 반환 값은 다음과 같습니다. 여기서 ticket은 다음 전화를 걸 때 사용하는 바우처이고,expire_seconds는 QR 코드의 유효 기간이고, url은 우리가 생성한 QR 코드를 스캔한 후 연 링크입니다. 따라서 QR 코드를 생성하는 방법을 직접 구현하면 다음 호출을 수행할 필요가 없습니다. 이 단계에서 멈추고 url 값을 직접 반환한 다음 이 url 값을 사용하여 QR 코드를 생성합니다. 로컬에 저장할 수 있습니다. phpqrcode를 사용하면 PHP에서 QR 코드를 생성할 수 있는데, 이는 사용하기 매우 쉽습니다. 다음 단계를 간단히 언급해 보겠습니다. 3.2.2 获取二维码地址 3.3 用户扫描二维码之后发生的事情 用户关注与否微信服务器给我们推送的事件是差不多的,只是新关注用户推送的事件中scene_id前面会加一个前缀。下面是微信公众平台文档的说明: 用户未关注时,进行关注后的事件推送 用户已关注时的事件推送 3.3.2 我们要做些什么 我们需要在自己填写的URL接口中接收这个事件,然后拿到我们需要的东西做我们想干的事儿。因为我要实现的功能比较简单,只需要拿到scene_id即可,因为这是我要展示给用户看的订单数据。下面是我写的接收和处理部分,比较简单,主要看一下应该怎么接收微信推送的事件: 我没有使用其他参数,只是根据不同的推送事件拿到我想要的订单ID,然后这时候其实相当于你在这里用公众号的客服在跟扫码的这个用户对话,上段代码中调用的sendMessage()是使用客户账号给扫码用户发送一个图文消息,因为我在拿scen_id的同时也拿到了用户的openid,可以利用这个给用户发送消息。 下面是sendMessage()方法: 其中 C('WECHAT_SEND_MESSAGE') = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=##TOKEN##' 至于下面的一大段str_replace,就是在组给用户发送的文字而已,需要注意$dataStr的格式,这里面要求JSON字符串比较严格,必须所有的字符串都用双引号括起来。微信接口对POST参数的限制真心严格。 下面是微信公众平台开发者文档中要求发送图文消息的POST data格式: 其中url是用户点击这个消息之后打开的地址,这个时候我就组了一个自己网站的地址,是一个get请求地址,里面携带参数是用户的openid和订单id,这样用户点击开图文消息就可以看到自己刚才下单的内容了,因为需要在网页上展示用户的微信头像和昵称,所以我把openid也放到参数里,在页面加载前先拿到用户的个人信息和订单数据,再展示网页。这样流程:用户未登录下单 -> 生成微信二维码 -> 用户扫码关注公众号 -> 查看订单详细信息 就完成了。而且因为这个图文消息打开后的链接携带的参数是这个用户的额openid和其下单的订单ID,不管分享到哪儿,用什么浏览器打开都是可以访问的,且展示的也是这个用户的头像和昵称信息,这也是我要实现的一个效果。
이 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을 데이터베이스에 저장하고 만료 시간을 저장한 다음 공개 함수 getWechatAccessToken()을 캡슐화합니다. 매번 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/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이고 게시물 데이터의 만료_초는 The QR 코드는 최대 30일 동안 유효합니다. 임시 QR 코드의 action_name은 우리의 사용자 정의 매개변수인 0이 아닌 정수 로 설정했습니다. 주문 ID. WeChat 서버가 이벤트를 푸시하면 이 값을 우리가 설정한 인터페이스에 반환합니다. 그런 다음 이 값을 사용하여 해당 주문 데이터를 가져와서 웹 페이지에 표시합니다. . //创建临时二维码
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']);
}
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":"gQH47joAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60, "url":"http://weixin.qq.com/q/ kZgfwMTm72WWPkovabbI "}
请求方式: GET
接口:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
这个接口的返回值是一张图片,可以直接展示或者下载,我们有具体使用过,所以也不知道应该怎么展示。
3.3.1 扫描后发生了什么
上面提到了,用户扫描我们生成的临时二维码,如果用户未关注公众号,则首先会跳转到公众号的关注页面,点击关注后,会进入公众号的会话页面,同时会给我们设置的接口推送一个事件。如果用户已经关注了,用户微信会直接跳转到公众号会话页面,然后微信服务器会给我们设置的接口推送一个事件。<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>
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]);
}
}
//给用户发送图文消息,点击跳转到报价页面
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);
}
{
"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"
}
]
}
}
위 내용은 매개변수가 포함된 QR 코드를 개발하기 위해 PHP WeChat을 사용하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!