使用PHP进行微信公众平台开发的示例


Posted in PHP onAugust 21, 2015

1. SAE 数据库的连接。

需要主机名和端口,以后的使用是一样的。

@ $db = new mysqli(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS,'你的应用名');

2.XML 的处理。

微信发送的消息格式都是 XML 格式,你返回的消息也必须是 XML 格式。从 XML 里提取数据,用 SimpleXML,强大又容易使用。包装成 XML 消息呢?把消息模板保存为字符串,然后用 sprintf 进行格式化输出。

解析微信服务器 POST 的数据:

//---------- 接 收 数 据 ---------- // 
 
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取POST数据 
 
//用SimpleXML解析POST过来的XML数据 
$postObj = simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA); 
 
$fromUsername = $postObj->FromUserName; //获取发送方帐号(OpenID) 
$toUsername = $postObj->ToUserName; //获取接收方账号 
$msgType = $postObj->MsgType; //消息内容

返回文本消息:

function sendText($to, $from, $content, $time) 
{ 
  //返回消息模板 
  $textTpl = "<xml> 
  <ToUserName><![CDATA[%s]]></ToUserName> 
  <FromUserName><![CDATA[%s]]></FromUserName> 
  <CreateTime>%s</CreateTime> 
  <MsgType><![CDATA[%s]]></MsgType> 
  <Content><![CDATA[%s]]></Content> 
  <FuncFlag>0</FuncFlag> 
  </xml>"; 
 
  //格式化消息模板 
  $msgType = "text"; 
  $time = time(); 
  $resultStr = sprintf($textTpl,$to,$from, 
  $time,$msgType,$content); 
  echo $resultStr; 
}

3. API 接口的调用。

网上有很多 API 接口,如百度翻译,有道翻译,天气预报等,对接口的调用可以直接用 file_get_contents ,也可以用 curl 的方式进行抓取,然后根据返回数据的格式进行数据解析,一般都是 xml 格式或者 json 格式,处理时用 SimpleXML 和 json_decode 是很方便的。对于抓取 API 内容,用重新封装的函数:

function my_get_file_contents($url){ 
 
  if(function_exists('file_get_contents')){ 
 
    $file_contents = file_get_contents($url); 
 
  } 
  else 
  {     
    //初始化一个cURL对象 
    $ch = curl_init(); 
 
    $timeout = 5; 
 
    //设置需要抓取的URL 
    curl_setopt ($ch, CURLOPT_URL, $url); 
 
    //设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
 
    //在发起连接前等待的时间,如果设置为0,则无限等待 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
 
    //运行cURL,请求网页 
    $file_contents = curl_exec($ch); 
 
    //关闭URL请求 
    curl_close($ch); 
  } 
 
  return $file_contents; 
} 

百度翻译 API 的调用如下:
function baiduDic($word,$from="auto",$to="auto"){ 
     
  //首先对要翻译的文字进行 urlencode 处理 
  $word_code=urlencode($word); 
     
  //注册的API Key 
  $appid="yourAPIkey"; 
     
  //生成翻译API的URL GET地址 
  $baidu_url = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=".$appid."&q=".$word_code."&from=".$from."&to=".$to; 
     
  $text=json_decode(my_get_file_contents($baidu_url)); 
 
  $text = $text->trans_result; 
 
  return $text[0]->dst; 
}

4.对 “附近” 的经纬度的计算。

用如下模型,计算正方形的经纬度。采用 Haversin 公式。

使用PHP进行微信公众平台开发的示例

//$EARTH_RADIUS = 6371;//地球半径,平均半径为6371km 
 /** 
 *计算某个经纬度的周围某段距离的正方形的四个点 
 * 
 *@param lng float 经度 
 *@param lat float 纬度 
 *@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米 
 *@return array 正方形的四个点的经纬度坐标 
 */ 
function returnSquarePoint($lng, $lat,$distance = 0.5){ 
  
  $EARTH_RADIUS = 6371; 
  $dlng = 2 * asin(sin($distance / (2 * $EARTH_RADIUS)) / cos(deg2rad($lat))); 
  $dlng = rad2deg($dlng); 
    
  $dlat = $distance/$EARTH_RADIUS; 
  $dlat = rad2deg($dlat); 
    
  return array( 
        'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng), 
        'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng), 
        'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng), 
        'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng) 
        ); 
 } 

将查询结果按时间降序排列,message 为数据库中的一个表,location_X 为维度,location_Y 为经度:
//使用此函数计算得到结果后,带入sql查询。 
  $squares = returnSquarePoint($lng, $lat); 
  $query = "select * from message where location_X != 0 and  
      location_X > ".$squares['right-bottom']['lat']." and location_X< ".$squares['left-top']['lat']  
      ."and location_Y > ".$squares['left-top']['lng']." and location_Y< ".$squares['right-bottom']['lng']  
       ."order by time desc";

5. 对字符串的检查。

限定为 6-20个字母,符合则返回 true ,否则返回 false,采用正则表达式进行匹配:

function inputCheck($word) 
{ 
  if(preg_match("/^[0-9a-zA-Z]{6,20}$/",$word)) 
  { 
    return true; 
  } 
  return false; 
}

6.对含中文的字符串取子串时,用 mb_substr 进行截取 http://www.php.net/manual/zh/function.mb-substr.php

7.检测中英文混合的字符串长度

<?php  
  $str = "三知sunchis开发网";  
  echo strlen($str)."<br>";        //结果:22  
  echo mb_strlen($str,"UTF8")."<br>";   //结果:12  
  $strlen = (strlen($str)+mb_strlen($str,"UTF8"))/2;  
  echo $strlen;              //结果:17  
?>

8. 检测是否含有中文

<? 
$str = "测试中文"; 
echo $str; 
echo "<hr>"; 
//if (preg_match("/^[".chr(0xa1)."-".chr(0xff)."]+$/", $str)) { //只能在GB2312情况下使用 
//if (preg_match("/^[\x7f-\xff]+$/", $str)) { //兼容gb2312,utf-8 //判断字符串是否全是中文 
if (preg_match("/[\x7f-\xff]/", $str)) { //判断字符串中是否有中文 
echo "正确输入"; 
} else { 
echo "错误输入"; 
} 
?>

双字节字符编码范围
1. GBK (GB2312/GB18030)
\x00-\xff GBK双字节编码范围
\x20-\x7f   ASCII
\xa1-\xff    中文 gb2312
\x80-\xff    中文 gbk

2. UTF-8 (Unicode)
\u4e00-\u9fa5    中文
\x3130-\x318F    韩文
\xAC00-\xD7A3   韩文
\u0800-\u4e00   日文

9. Jquery Mobile 的使用
    官网:http://blog.jquerymobile.com/
    原来自己写手机网页,真是无比痛苦,CSS 调试各种烦,跨平台也很不好,后来发现了这个库,果然简单了好多,而且界面看起来漂亮多了。
    不过也引入了一些新的问题,比如页面内 CSS 和 Javascript 的加载,因为 Jquery Mobile 默认是使用 Ajax 加载页面的,并不会刷新整个 html ,而是请求一个 page 而已,所以对于多个 page 的页面不会完全加载,对于 head 里面的 CSS 和 Javascript 也不会加载,所以一个方法是在链接的属性里设置 ajax=false,指明不通过 Ajax 加载页面,另一个是把 CSS 和 Javascript 的加载放在 page 里面。在这里就不具体谈了。

使用PHP进行微信公众平台开发的示例

10. 移动 Web 调试
    一开始每次调试个页面都要手机连接 WIFI 去刷新,简直不能忍!后来终于学乖了...
    推荐这个网站:http://www.responsinator.com/?url=  把自己的网页 url 放在顶端的输入框里面然后“Go”,你就可以看到自己网页在各个平台下了显示效果,连 Kindle 都有..
    当然,开发者必备的谷歌也可以为我们代理成手机浏览器,按 F12 进入开发者模式然后点击右下角的 setting 的图标,可以在 Overrides 里面设置 User Agent 和 Device metrics,效果同样不错。

使用PHP进行微信公众平台开发的示例

PHP 相关文章推荐
建立动态的WML站点(三)
Oct 09 PHP
php error_log 函数的使用
Apr 13 PHP
PHP高手需要要掌握的知识点
Aug 21 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
php实现四舍五入的方法小结
Mar 03 PHP
ThinkPHP3.2.2的插件控制器功能
Mar 05 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
php正则修正符用法实例详解
Dec 29 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
Jun 09 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
PHP的Yii框架的基本使用示例
Aug 21 #PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 #PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 #PHP
php生成图片验证码-附五种验证码
Aug 19 #PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 #PHP
深入探究PHP的多进程编程方法
Aug 18 #PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
Aug 18 #PHP
You might like
MyEclipse常用配置图文教程
2014/09/11 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
Angularjs过滤器使用详解
2016/05/25 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
2018/10/02 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
vue项目部署到nginx/tomcat服务器的实现
2019/08/26 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
Python计算回文数的方法
2015/03/11 Python
Python读取图片为16进制表示简单代码
2018/01/19 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
网上商城创业计划书范文
2014/01/31 职场文书
法律进企业活动方案
2014/03/04 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
管理失职检讨书范文
2015/05/05 职场文书
海底两万里读书笔记
2015/06/26 职场文书