一、創建第三方平台
點擊創建第三方平台后開始填寫資料,這里主要注意的有以下幾點
1.平台類型
2.權限集
分別有公眾號 和 小程序的權限 當然兩邊都可以同時選擇,只要選擇你需要的權限就可以了,我這里介紹的是小程序
3.開發資料
①授權發起也域名(即用戶打開我們自己的授權頁域名 例如www.abc.com)
②授權事件接收URL(我們接收所有授權小程序或公眾號取消授權通知、授權成功通知、授權更新通知事件的url地址 , 包括接收微信平台推送的ticket)
③消息與事件接收URL (我們接收所有授權小程序或公眾號的消息和事件推送,例如客服消息 微信就會推送到這個地址上)
這里要注意一點:該參數按規則填寫(需包含/$APPID$,如www.abc.com/$APPID$/callback) 填寫的地址需要包含/$APPID$ 我們后續可以用nginx 重寫地址 把訪問指向同一個地址就可以了
例如:我填寫的地址是 www.abc.com/msg/$APPID$/msgEventPath.php nginx重寫地址: rewrite ^/msg/(.*)/(.*)\.php /msgEventPath.php last;
④其它按照提示填寫就可以了,記得天上白名單ip
然后提交審核就可以了
二、開發部分
1.保存component_verify_ticket, 微信端會定時推送消息到配置好的 授權事件接收URL 上,我們需要保存這個component_verify_ticket和 不斷更新,component_verify_ticket必須保持是微信端推送的最新一個
<?php //加載微信sdk require_once "../lib/encode/wxBizMsgCrypt.php"; //獲取請求數據 $encryptMsg = file_get_contents('php://input'); $pc = new WXBizMsgCrypt(OPEN_MSG_VERIFY_TOKEN, OPEN_ENCRYPT_KEY, OPEN_APPID); $xml_tree = new DOMDocument(); $xml_tree->loadXML($encryptMsg); $array_e = $xml_tree->getElementsByTagName('Encrypt'); $array_s = $xml_tree->getElementsByTagName('MsgSignature'); $encrypt = $array_e->item(0)->nodeValue; $format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>"; $from_xml = sprintf($format, $encrypt); //解密數據 $msg = ''; $timeStamp = empty ($_GET ['timestamp']) ? '' : trim($_GET ['timestamp']); $nonce = empty ($_GET ['nonce']) ? '' : trim($_GET ['nonce']); $msg_sign = empty ($_GET ['msg_signature']) ? "" : trim($_GET ['msg_signature']); $errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg); if ($errCode == 0) { $msg_data = CommonUtil::xmlToArray($msg); //保存ComponentVerifyTicket if (!empty($msg_data['ComponentVerifyTicket'])) { //保存/更新到數據庫code } }
2.用component_verify_ticket去換取第三方平台的token(第三方平台指的就是我們自己在開發的平台)
token是有有效期的,所以我們要保存它的過期時間,並將token做緩存,當token沒過期時就不用再去換取,反之我們要利用最新的component_verify_ticket去重新獲取token
/** * 獲取開放平台調用token * @param $appid * @param $appsecret * @param $ticket * @param string $token_save_path * @return bool */ public static function getToken($appid , $appsecret ,$ticket){ if(empty($appid) || empty($appsecret)){ return FormatUtil::formatReturn(-1 , 'fail' , false); } $url = 'https://api.weixin.qq.com/cgi-bin/component/api_component_token'; $data = array( 'component_appid' => $appid, 'component_appsecret' => $appsecret, 'component_verify_ticket' => $ticket, ); $token_info = CommonUtil::curl_post(json_encode($data) , $url); $token_info = json_decode($token_info , true); if(!$token_info || empty($token_info['component_access_token'])){ return FormatUtil::formatReturn(-2 , 'fail' , false); } return FormatUtil::formatReturn($token_info['errcode'] , $token_info['errmsg'] , $token_info); }
3.換取預授權碼pre_auth_code
pre_auth_code是用來換取微信端的授權二維碼的
/** * 獲取預授權碼 * @param $appid * @param $token * @return multitype */ public static function getPreAuthCode($appid , $token){ $url = 'https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token='; $url .= $token; $data = array( 'component_appid' => $appid, ); $pre_auth_code_info = CommonUtil::curl_post(json_encode($data) , $url); $pre_auth_code_info = json_decode($pre_auth_code_info , true); if(!$pre_auth_code_info || empty($pre_auth_code_info['pre_auth_code'])){ return FormatUtil::formatReturn(-1 , 'fail' , false); } return FormatUtil::formatReturn($pre_auth_code_info['errcode'] , $pre_auth_code_info['errmsg'] , $pre_auth_code_info); }
4.跳轉到授權頁面
用戶授權的時候會先打開我們自己的一個頁面 (例如 http://www.abc.com/authorization.php ),這個頁面里需要做一個按鈕或者用js去跳轉到微信的授權頁面
注意:必須要用js去跳轉,用php是不行的
$pre_auth_code = pre_auth_code; $redirect_uri = 'http://www.abc.com/redirect.php'; //回調地址 必須和授權地址同一個域名 $redirect_uri = urlencode($redirect_uri); //微信授權二維碼地址 $url = 'https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid='.OPEN_APPID.'&pre_auth_code='.$pre_auth_code.'&redirect_uri='.$redirect_uri.'&auth_type=2'; //頁面自動跳轉 echo "<script>window.location.href='".$url."';</script>"; exit;
跳轉后得到授權碼,注意這個頁面只能用網頁訪問,小程序訪問不了,因為不能將微信域名配置為業務域名
用戶掃碼后 就可以授權給第三方平台了
5.授權回調 獲取授權二維碼時需要提供 預授權碼和回調地址;用戶點擊授權后 頁面會直接跳轉到回調地址
我們可以通過 $_GET['auth_code'] 去獲取授權用戶的小程序或二維碼 調用接口的access_token(有效期兩小時) 並將其保存/更新
然后我們就可以獲取授權用戶小程序或公眾號的信息
/** * 獲取授權用戶信息 * @param $authorizer_appid * @return multitype */ public static function getAuthorizerInfo($appid , $component_access_token , $authorizer_appid){ $url = 'https://api.weixin.qq.com/cgi-bin/component/api_get_authorizer_info?component_access_token='.$component_access_token; $data = array( "component_appid" => $appid, "authorizer_appid" => $authorizer_appid, ); $authorization_info = CommonUtil::curl_post(json_encode($data) , $url); $authorization_info = json_decode($authorization_info , true); if(!$authorization_info || !is_array($authorization_info)){ return FormatUtil::formatReturn(-1 , 'fail' , false); } return FormatUtil::formatReturn(0 , 'success' , $authorization_info); }
6.客服消息等
當授權小程序或公眾號 收到客服消息或其它一些信息時,微信端會同時把信息推送到我們配置好的 消息與事件接收URL 中;我們需要對數據進行解密並進行后續操作
require_once "./encode/wxBizMsgCrypt.php"; $encryptMsg = file_get_contents ( 'php://input' );$ret = array (); // 第三方發送消息給公眾平台 $time_stamp = empty ( $_GET ['timestamp'] ) ? '' : trim ( $_GET ['timestamp'] ); $nonce = empty ( $_GET ['nonce'] ) ? '' : trim ( $_GET ['nonce'] ); $msg_sign = empty ( $_GET ['msg_signature'] ) ? "" : trim ( $_GET ['msg_signature'] ); $encryptMsg = file_get_contents ( 'php://input' ); $pc = new WXBizMsgCrypt ( OPEN_MSG_VERIFY_TOKEN, OPEN_ENCRYPT_KEY, OPEN_APPID ); $postArr = CommonUtil::xmlToArray ( $encryptMsg ); // xml對象解析 $format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>"; $from_xml = sprintf ( $format, $postArr ['Encrypt'] ); // 第三方收到公眾號平台發送的消息 $msg = ''; $errCode = $pc->decryptMsg ( $msg_sign, $time_stamp, $nonce, $from_xml, $msg ); // 解密
if ($errCode == 0) {
//后續操作
}
7.全網發布
當你開發好所有業務流程后,需要在 微信開放平台后台 點擊 全網發布,這樣用戶才能使用,不然只能白名單的小程序或公眾號使用
全網發布需要注意的有幾點:
①自動檢測,微信會進行自動檢測程序,我們需要把說明看清楚
②暫時沒有測試資源,這種情況是因為自動檢測的人數過多,微信端沒有資源,這個我們需要等待一下遲點再發布就行
③消息推送檢測
自動化測試的專用測試公眾號的信息如下:
(1)appid: wx570bc396a51b8ff8
(2)Username: gh_3c884a361561
自動化測試的專用測試小程序的信息如下:
(1)appid:wxd101a85aa106f53e
(2)Username: gh_8dad206e9538
以上是微信自動檢測的兩個測試號,我們需要在 消息與事件接收URL 做判斷是否測試號訪問,如果是我們需要馬上做出回應(客服消息推送)
回應代碼晚點貼出來。。。
/** * 發送客服消息 * @param $authorizer_access_token * @param $touser * @param $content * @param string $msgtype */ public static function sendCustomerMessage($authorizer_access_token , $touser , $content , $msgtype = 'text' ){ $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$authorizer_access_token; $data = array( "access_token" => $authorizer_access_token, "touser" => $touser, "msgtype" => $msgtype, ); switch ($msgtype){ case "text": $data["text"] = ["content" => $content]; break; } $send_data = CommonUtil::curl_post(json_encode($data) , $url); error_log('【'.date('Y-m-d H:i:s').'】$send_data:'.var_export($send_data , true)."\n" , 3 , '/web/php/tmp/kenTest.log'); $send_data = json_decode($send_data , true); if(!$send_data || !is_array($send_data)){ return FormatUtil::formatReturn(-1 , 'fail' , false); } return FormatUtil::formatReturn(0 , 'success' , $send_data); }
以上微信第三方平台開發流程適用於公眾號和小程序,但我是以小程序舉例,部分接口可能與公眾號不同,需要查看官方文檔
后續再優化更新細節,有不懂的可以留言