? ???? ?? 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 用戶掃描二維碼之后發(fā)生的事情 用戶關注與否微信服務器給我們推送的事件是差不多的,只是新關注用戶推送的事件中scene_id前面會加一個前綴。下面是微信公眾平臺文檔的說明: 用戶未關注時,進行關注后的事件推送 用戶已關注時的事件推送 3.3.2 我們要做些什么 我們需要在自己填寫的URL接口中接收這個事件,然后拿到我們需要的東西做我們想干的事兒。因為我要實現的功能比較簡單,只需要拿到scene_id即可,因為這是我要展示給用戶看的訂單數據。下面是我寫的接收和處理部分,比較簡單,主要看一下應該怎么接收微信推送的事件: 我沒有使用其他參數,只是根據不同的推送事件拿到我想要的訂單ID,然后這時候其實相當于你在這里用公眾號的客服在跟掃碼的這個用戶對話,上段代碼中調用的sendMessage()是使用客戶賬號給掃碼用戶發(fā)送一個圖文消息,因為我在拿scen_id的同時也拿到了用戶的openid,可以利用這個給用戶發(fā)送消息。 下面是sendMessage()方法: 其中 C('WECHAT_SEND_MESSAGE') = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=##TOKEN##' 至于下面的一大段str_replace,就是在組給用戶發(fā)送的文字而已,需要注意$dataStr的格式,這里面要求JSON字符串比較嚴格,必須所有的字符串都用雙引號括起來。微信接口對POST參數的限制真心嚴格。 下面是微信公眾平臺開發(fā)者文檔中要求發(fā)送圖文消息的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 ??? ???? ???? ? ?? ??? ??? ?????? ?????. ?? ?? ? ?? ???? ?? ?? ???? ???? ? ???? ?????. . //創(chuàng)建臨時二維碼
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 掃描后發(fā)生了什么
上面提到了,用戶掃描我們生成的臨時二維碼,如果用戶未關注公眾號,則首先會跳轉到公眾號的關注頁面,點擊關注后,會進入公眾號的會話頁面,同時會給我們設置的接口推送一個事件。如果用戶已經關注了,用戶微信會直接跳轉到公眾號會話頁面,然后微信服務器會給我們設置的接口推送一個事件。<xml><ToUserName><![CDATA[toUser]]></ToUserName> //開發(fā)者微信號
<FromUserName><![CDATA[FromUser]]></FromUserName> //發(fā)送者賬號(openid)
<CreateTime>123456789</CreateTime> //消息創(chuàng)建時間(整型)
<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> //開發(fā)者微信號
<FromUserName><![CDATA[FromUser]]></FromUserName> //發(fā)送者賬號(openid)
<CreateTime>123456789</CreateTime> //消息創(chuàng)建時間
<MsgType><![CDATA[event]]></MsgType> //消息類型event
<Event><![CDATA[SCAN]]></Event> //事件類型 event
<EventKey><![CDATA[SCENE_VALUE]]></EventKey> //事件key值,是一個32位無符號整數,即創(chuàng)建二維碼時的二維碼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]);
}
}
//給用戶發(fā)送圖文消息,點擊跳轉到報價頁面
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 ??? ????? ?? ?? ??? ?????!

? AI ??

Undress AI Tool
??? ???? ??

Undresser.AI Undress
???? ?? ??? ??? ?? AI ?? ?

AI Clothes Remover
???? ?? ???? ??? AI ?????.

Clothoff.io
AI ? ???

Video Face Swap
??? ??? AI ?? ?? ??? ???? ?? ???? ??? ?? ????!

?? ??

??? ??

???++7.3.1
???? ?? ?? ?? ???

SublimeText3 ??? ??
??? ??, ???? ?? ????.

???? 13.0.1 ???
??? PHP ?? ?? ??

???? CS6
??? ? ?? ??

SublimeText3 Mac ??
? ??? ?? ?? ?????(SublimeText3)