承接上文的WeChatCallBack
在WeChatCallBack類的成員變量中定義了各種消息都會有的字段,這些字段在init函數中賦值。同時也把解析到的XML對象作為這個類的成員變量$_postObject並在init中賦值,目的是在實現具體公眾賬號的業務邏輯時,具體的各類消息的特殊字段可以通過它來獲取。
process函數時實現具體公眾賬號的業務邏輯時需要重載的函數,默認的實現是返回一個“未實現”的錯誤提示。
本文的重點是接入腳本,接入腳本是項目根目錄的interface.php,其代碼清單如下文所示:
<?php
require_once dirname(__FILE__) . '/common/GlobalFunctions.php';
function checkSingnature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = WEIXIN_TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = shal( $tmpStr );
if( $tmpStr == $signature ) {
return true;
} else {
return false;
}
}
if(checkSignature()) {
if($_GET["echostr"]) {
echo $_GET["echostr"];
exit(0);
}
} else {
// 惡意請求: 獲取來源IP, 並寫入日志
$ip = getIp();
interface_log(ERROR, EC_OTHER, 'malicious: ' . $ip);
exit(0);
}
function getWeChatObj($toUserName) {
if($toUserName == USERNAME_FINDFACE) {
require_once dirname(__FILE__) . '/class/
WeChatCallBackMeiri10futu.php' ;
return new WeChatCallBackMeir10futu();
}
if($toUserName == USERNAME_MR) {
require_once dirname(__FILE__) . '/class/
WeChatCallBackMeir10futu.php' ;
return new WeChatCallBackMeir10futu();
}
if($toUserName == USERNAME_ES) {
require_once dirname(__FILE__) . '/class/
WeChatCallBackEchoServer.php' ;
return new WeChatCallBackEchoServer();
}
require_once dirname(__FILE__) . '/class/WeChatCallBcak.php' ;
return new WeChatCallBack();
}
function exitErrorInput() {
echo 'error input!' ;
interface_log(INFO, EC_OK, "***** interface request end ******") ;
interface_log(INFO, EC_OK, "********************** ******") ;
interface_log(INFO, EC_OK, "") ;
exit( 0 );
}
$postStr = file_get_contents ( "php://input" );
interface_log(INFO, EC_OK, "");
interface_log(INFO, EC_OK, "*****************************");
interface_log(INFO, EC_OK, "***** interface request start *****");
interface_log(INFO, EC_OK, 'request: ' . var_export($_GET, ture)) ;
if (empty ( $postStr )) {
interface_log ( ERROR, EC_OK, "error input!" );
exitErrorInput();
}
// 獲取參數
$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement',
LIBXML_NOCDATA ) ;
$toUserName = ( string ) trim ( $postObj->ToUserName ) ;
if (! $toUserName) {
interface_log ( ERROR, EC_OK, "error input!" ) ;
exitErrorInput() ;
} else {
$wechatObj = getWeChatObj ( $ toUserName ) ;
}
retStr = $ wechatObj->process ();
interface_log(INFO, EC_OK, "***** interface request end *****") ;
interface_log(INFO, EC_OK, "****************************") ;
interface_log(INFO, EC_OK, "");
?>
Interface.php邏輯描述:
1.使用checkSignature函數驗證請求是否合法,在不合法的情況下,記錄惡意的來源IP。
2.獲取POST數據,解析XML數據,根據ToUserName來決定是發往哪一個公眾賬號的消息,然後加載對應的文件,獲得對應的對象(getWeChatObj函數)。
3.調用對象的init函數初始化對象。
4.調用對象的process函數處理公眾賬號邏輯,得到返回消息字符串。
5.返回消息。
獲取來源IP函數:
function getIp ()
{
if (isset($_SERVER)) {
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"] ;
} else if (isser($_SERVER["HTTP_CLIENT_IP"])) {
$realip = $_SERVER["HTTP_CLIENT_IP"] ;
} else {
$realip = $SERVER["REMOTE_ADDR"];
}
} else {
if (getenv(""HTTP_X_FORWARDED_FOR")) {
$realip = getenv("HTTP_X_FORWARDED_FOR") ;
} else if (getenv("HTTP_CLIENT_IP")) {
$realip = getenv("HTTP_CLIENT_IP") ;
} else {
$realip = getenv("REMOVE_ADDR") ;
}
}
return $realip;
}
___________over____________
是第二類增值電信業務中的移動網信息服務業務的短消息接入代碼,分為全網和地網兩類,其中全網sp接入代碼為1066開頭的全網經營性sp接入代碼,和1069開頭的全網非經營性sp接入代碼;地網sp接入代碼分為1062開頭經營性和1063開頭非經營性。全網sp接入代碼的申請機構是工業和信息化部,地網接入代碼的申請機構是地方的通信管理局,那麼申請sp接入代碼需要提交哪些資料呢? sp接入代碼申請材料1、短消息類服務接入代碼申請報告(號碼位長、適用范圍、聯系人聯系電話);2、短消息類服務接入代碼(省內使用)申請表;3、短消息類服務接入代碼使用承諾書;4、增值電信業務經營許可證(業務類別:短信息服務)原件及復印件;5、營業執照副本原件及復印件;6、技術方案、業務規劃等。
每個地區的接入代碼是不同的
你只能撥打10086轉人工服務了
或者你告訴我電話號碼歸屬地才能幫你查詢!