この記事の例では、WeChat パブリック アカウント用に開発された WeChat パブリック プラットフォームのメッセージ返信クラスについて説明します。参考のためにみんなで共有してください。詳細は以下の通りです
実際、インターネット上で WeChat のパブリック アカウント開発コードをたくさん見てきましたが、それらはすべて似ており、公式のデモ ファイルを参照して変更されています。
/**
* WeChatパブリックプラットフォームのメッセージ返信クラス
*
*
*/
クラスBBCweixin{
プライベート $APPID="******";
プライベート $APPSECRET="******";
/*
*文本メッセージ回复
*@param配列オブジェクト
*@param文字列の内容
*@戻り文字列
*/
パブリック関数 resText($object,$content,$flag=0){
$xmlText="
%s
<コンテンツ>コンテンツ>
%d
";
$resultStr=sprintf($xmlText,$object->FromUserName,$object->ToUserName,time(),$content,$flag);
echo $resultStr;exit();
}
/*
*画像メッセージ返信
*@param配列オブジェクト
*@param文字列URL
*@戻り文字列
*/
パブリック関数 resImage($object,$media_id){
$xmlImage="
";
$xmlImage.="";
$xmlImage.="";
$xmlImage.="%s";
$xmlImage.="";
$xmlImage.="";
$xmlImage.="";
$resultStr=sprintf($xmlImage,$object->FromUserName,$object->ToUserName,time(),$media_id);
echo $resultStr;exit();
}
/*
*图文メッセージ回复
*@param配列オブジェクト
*@param array newsData 二维数组 [タイトル][説明][PicUrl][Url]文字列が必ず含まれます
*@戻り文字列
*/
パブリック関数 resNews($object,$newsData=array()){
$CreateTime=time();
$FuncFlag=0;
$newTplHeader="
FromUserName}]]>
ToUserName}]]>
{$CreateTime}
<コンテンツ>コンテンツ>
%s";
$newTplItem="<アイテム>
<タイトル>タイトル>
<説明>説明>
アイテム>";
$newTplFoot="記事>
%s
";
$Content='';
$itemsCount=count($newsData);
$itemsCount=$itemsCount<10?$itemsCount:10;//WeChat パブリック プラットフォームは、一度に最大 10 件の写真とテキスト付きのメッセージに返信できます
If($itemsCount){
foreach($newsData as $key=>$item){
If($key
$Content.=sprintf($newTplItem,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
}
}
}
$header=sprintf($newTplHeader,0,$itemsCount);
$footer=sprintf($newTplFoot,$FuncFlag);
echo $header.$Content.$footer;exit();
}
/*
*音楽メッセージ返信
*@param配列オブジェクト
*@param array musicContent 2次元配列には[Title][Description][MusicUrl][HQMusicUrl]フィールドが含まれます
*@戻り文字列
*/
パブリック関数 resMusic($object,$musicContent=array()){
$xmlMusic="
&lt; tousername&gt;&lt;!
&lt; fromusername&gt;&lt;![cdata [%s]]&gt;&lt;
&lt; createtime&gt;%s&lt;/createtime&gt;
&lt; msgtype&gt;&lt;![cdata [music]]&gt;&lt;/msgtype&gt;
<タイトル>タイトル>
&lt;説明&gt;&lt;!
&lt; musicurl&gt;&lt;!
&lt; hqmusicurl&gt;&lt;![cdata [%s]]&gt;&lt;/hqmusicurl&gt;
if(empty($musicContent[0]['HQMusicUrl'])){
$musicContent[0]['HQMusicUrl']=$musicContent[0]['MusicUrl'];
}
$resultStr=sprintf($xmlMusic,$object->FromUserName,$object->ToUserName,time(),$musicContent[0]['Title'],$musicContent[0]['Description'],$musicContent [0]['MusicUrl'],$musicContent[0]['HQMusicUrl']);
echo $resultStr;exit();
}
/*
*マルチメディアファイルインターフェースをアップロード
*@param
*@param 配列 mediaArr ファイル名、ファイル長、コンテンツ タイプ
*@オブジェクトを返す
*/
パブリック関数 UploadMedia($accessToken,$type='image',$mediaArr){
$url="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=".$accessToken."&type=".$type;
$doPost=self::curlPost($mediaArr,$url);
$doPost を返します;
}
/*
*GPS、Google 座標を Baidu 座標に変換
*@param lnt
*@param lat
*@配列を返す
*/
パブリック関数mapApi($lng,$lat,$type){
$map=array();
if($type=='gps'){
$url="http://map.yanue.net/gpsApi.php?lat=".$lat."&lng=".$lng;
$res=json_decode(file_get_contents($url));
$map['lng']=$res->baidu->lng;
$map['lat']=$res->baidu->lat;
}
if($type=='google'){
$url="http://api.map.baidu.com/ag/coord/convert?from=2&to=4&mode=1&x=".$lng."&y=".$lat;
$res=json_decode(file_get_contents($url));
$map['lng']=base64_decode($res[0]->x);
$map['lat']=base64_decode($res[0]->y);
}
$map を返します;
}
/*************************************************** * **********
*
* 特定の関数を使用して配列内のすべての要素を処理します
* @param string &$array 処理対象の文字列
* @param string $function 実行する関数
* @return boolean $apply_to_keys_only キーにも適用されるかどうか
* @アクセス公開
*
************************************************* * ***********/
public function arrayRecursive(&$array, $function, $apply_to_keys_only = false)
{
静的 $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die('深い再帰攻撃の可能性あり');
}
foreach ($array as $key => $value) {
if (is_array($value)) {
self::arrayRecursive($array[$key], $function, $apply_to_keys_only);
} その他 {
$array[$key] = $function($value);
}
if ($apply_to_keys_only && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
/*************************************************** * **********
*
* 配列を JSON 文字列に変換します (中国語と互換性があります)
* @param array $array 変換する配列
* @return string 変換されたjson文字列
* @アクセス公開
*
************************************************* * ***********/
パブリック関数 JSON($array) {
self::arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
urldecode($json)を返す;
}
/*
*创建菜单
*
*/
パブリック関数 creatMenu($shop_id,$data){
$jsonArray=self::JSON($data);
$AccessToken=self::accessToken($weiXin[0]['key'],$weiXin[0]['secret']);
$MENU_URL="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$AccessToken;
return self::curlPost($jsonArray,$MENU_URL);
}
/*
*客服メッセージ回复
*@param array jsonArray Array {"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}
*@戻り文字列
*/
パブリック関数customService($jsonArray,$hash){
if(空($jsonArray)){
false を返します。
}
$db=M();
$sql="select * from bbc_wechats where hash='".$hash."'";
$weChast=$db->クエリ($sql);
$AccessToken=self::accessToken($weChast[0]['key'],$weChast[0]['secret']);
$TokenUrl="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$AccessToken;
$CustomRes=self::curlPost($jsonArray,$TokenUrl);
$CustomRes を返します;
}
/*
*获取access_token
*@return objectStr
*/
パブリック関数 accessToken($appid,$secret){
$access_token=BBCcache::getCache('accesstoken'.$appid);
if($access_token){
$AccessTokenRet=$access_token;
}その他{
$TookenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
$AccessTokenRes=@file_get_contents($TookenUrl);
$AccessToken=json_decode($AccessTokenRes);
$AccessTokenRet=$AccessToken->access_token;
BBCcache::setCache('accesstoken'.$appid,$AccessToken->access_token,3600);
}
$AccessTokenRet を返す;
}
/*
*向远程インターフェースPOSTデーターグラム
*@data 配列 {"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}
*@return objectArray
*/
パブリック関数curlPost($data,$url){
$ch =curl_init();
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_USERAGENT, 'Mozilla/5.0 (互換性; 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);
$info =curl_exec($ch);
if (curl_errno($ch)) {
echo 'Errno'.curl_error($ch);
}
curl_close($ch);
return json_decode($info);
}
// 精度に基づいて距離と方向を計算します
関数 getRadian($d){
$d * M_PI / 180;
を返します
}
関数 getDistance ($lat1, $lng1, $lat2, $lng2){
$EARTH_RADIUS=6378.137;//地球半径
$lat1 =getRadian($lat1);
$lat2 = getRadian($lat2);
$a = $lat1 - $lat2;
$b = getRadian($lng1) - getRadian($lng2);
$v = 2 * asin(sqrt(pow(sin($a/2),2) + cos($lat1) * cos($lat2) * pow(sin($b/2),2)));
$v = ラウンド($EARTH_RADIUS * $v * 10000) / 10000;
$v を返します;
}
}
?>