使用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 相关文章推荐
文件上传程序的全部源码
Oct 09 PHP
PHP开发中常用的字符串操作函数
Feb 08 PHP
防止本地用户用fsockopen DDOS攻击对策
Nov 02 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
Apr 24 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
php实现zip文件解压操作
Nov 03 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
php如何比较两个浮点数是否相等详解
Feb 12 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 PHP
laravel5.6实现数值转换
Oct 23 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
php设计模式 Builder(建造者模式)
2011/06/26 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
python中sets模块的用法实例
2014/09/30 Python
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
详解python字节码
2018/02/07 Python
python利用smtplib实现QQ邮箱发送邮件
2020/05/20 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
有模特经验的简历自我评价
2013/09/19 职场文书
教师党员自我评价2015
2015/03/04 职场文书
婚庆司仪开场白
2015/05/29 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
mysql查看表结构的三种方法总结
2022/07/07 MySQL