手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

http post : Content-Type

今天在使用http post(curl)获取一个数据的时候发现了问题,死活拿不到数据。获取永远为空。

场景是这样的:我向微信发起一个请求,QQ请求我的服务器,由我请求接口服务器。返回结果
但问题是,如果由微信直接请求接口服务器。一切正常。反而因为我做了一次中间层后。取不到数据了。
 
一点一点排查:
1、接口服务器的TransferMode是chunked。OK。我CURL换成1.0请求,结果还是空
2、换file_get_contents。。。一样是空。
3、排查微信请求的头。在我的服务器上把$_SERVER变量打印出来。结果。。意外的发现:Content-Type: text/xml,居然是这个?那我换成这个请求接口服务器试一下呢?居然真的成功了
 
遇到问题,果然是要一个个的排查啊。对方是java的服务器。可能会httprawbody做了一个强验证。所以。。。不象我们PHP可以拿到数据。先simplexml_load_string,不行?再json_decode,还不行?再用其他处理。。。
 
 

[转]老王:如何安全的include文件

大多数人会将一个单独的php文件当成配置文件,早些年的配置文件大多类似这样:

PHP代码
  1. <?php  
  2. $config['a']=1;  
  3. $config['b']=2;  

这样include后。可以使用$config变量了,但慢慢的,却越来越发现这样不太好,于是就有了这种

PHP代码
  1. <?php  
  2. return array(  
  3. 'a'=>1,'b'=>2  
  4. );  

这时候只要写$config = include('config.php'),就相当于和上面一样了。然后老王讲的就是指第二种情况。

原文在:http://huoding.com/2014/02/25/329

他举的例子是:

PHP代码
  1. <?php  
  2.   
  3. $debug = false;  
  4. // ...  
  5. $config = include 'config.php';  
  6. // ...  
  7. if ($debug) {  
  8.     phpinfo();  
  9. }  

如果config.php里万一写了$debug=true;那么就会造成phpinfo()被输出了,与实际预料就有了偏差了。那么怎么安全的include呢?

老王说:

PHP代码
  1. $config = call_user_func(function() {  
  2.     return include 'config.php';  
  3. });  

这样就利用局部变量把里面的一些可能污染外部的变量控制在匿名函数的作用域里。

然后我自己也测试了一下,确实。即使用$GLOBALS,也没有影响,而单独的php文件,如果你不是function ,也不能直接global $debug;这样是语法错误的。

所以。。。。如果为了安全,你还是和老王学一下吧。。。

Tags: include

magento 后台为链接加上key

这年头,什么都不可靠。所幸,我还不需要用黄瓜。

在使用magento的时候,由于要使用ajax,但我又不想将这些链接加入到菜单里(加到菜单的链接会自动加入key参数),所以一直都是出现了自动跳转的问题。在这里面我要说一下。如果你使用原生的prototype.js,你用ajax的post功能时,即使不带key参数,也是可以正常处理的。如果是jquery..即使你带了key参数。也不能post,只能get。。。。苦逼
 
那么,如果在URL上加入key参数呢。大家都知道key参数是magento后台用来与前台分开的,里面带入了安全性的处理。可是怎么加上这个key呢?搜索了一下google居然没有一个文章是介绍这玩意的。当然也可能我的关键字不正确。
 
求人不如求已,打开代码,搜索key,很快就发现了Mage::getSingleton("adminhtml_url")这个玩意,里面有一个getUrl。。哇塞,可以直接生成带key的URL。看了一下。直接使用在程序里,确实生成了URL。并且可以通过浏览器访问。
 
记录一下

微信菜单的实现代码

 不多说,上代码。有几个要注意的(这段代码是我从我的系统里剥出来的。写了很久了,只是最近有人一直在问,我想,这也不是什么特别的代码,还是开源吧。)

1、请求微信菜单需要token,所以要事先生成。这个token其实可以用不少时间的,看官方接口(token调用生成,每天是有次数的,所以节约着用,能存本地就存本地吧,记录下过期时间即可)
2、子菜单的数组顺序就是微信的子菜单:从上至下的顺序 。这个不要搞错
3、子菜单是有数量限制的
4、主菜单是有字数限制的。不能超过4个中文字。
 
上代码吧:
PHP代码
  1. <?php  
  2. /** 
  3.  * @category menu.php 
  4.  * @author   gouki <gouki.xiao@gmail.com> 
  5.  * @created  2013-10-16 15:14 
  6.  * @since 
  7.  */  
  8. $menudata = array(  
  9.     'button' => array(  
  10.         array(  
  11.             'name'       => '菜单一',  
  12.             'sub_button' => array(  
  13.                 array(  
  14.                     'type' => 'click',  
  15.                     'name' => '最上方子菜单1',  
  16.                     'key'  => 'R:4:1',  
  17.                 ),  
  18.                 array(  
  19.                     'type' => 'click',  
  20.                     'name' => '下方菜单',  
  21.                     'key'  => 'R:3:1',  
  22.                 ),  
  23.             )  
  24.         ),  
  25.         array(  
  26.             'name'       => '菜单2',  
  27.             'sub_button' => array(  
  28.                 array(  
  29.                     'type' => 'click',  
  30.                     'name' => '第一个',  
  31.                     'key'  => 'R:2:1',  
  32.                 ),  
  33.                 array(  
  34.                     'type' => 'click',  
  35.                     'name' => '第二个',  
  36.                     'key'  => 'R:8:1',  
  37.                 ),  
  38.                 array(  
  39.                     'type' => 'click',  
  40.                     'name' => '第三个',  
  41.                     'key'  => 'R:9:1',  
  42.                 ),  
  43.                 array(  
  44.                     'type' => 'click',  
  45.                     'name' => '第四个',  
  46.                     'key'  => 'R:10:1',  
  47.                 ),  
  48.             )  
  49.         ),  
  50.         array(  
  51.             'type' => 'click',  
  52.             'name' => '菜单3',  
  53.             'key'  => 'M:7',  
  54.         ),  
  55.     )  
  56. );  
  57. $menujson = json_encode($menudata, JSON_UNESCAPED_UNICODE);  
  58. define('APPKEY'''); //这里是APPKEY  
  59. define('SECRET'''); //SECRET ....  
  60. $getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";  
  61. $getTokenUrl = sprintf($getTokenUrl, APPKEY, SECRET);  
  62. $result = json_decode(file_get_contents($getTokenUrl), true);  
  63. $token = '';  
  64. if (isset($result['access_token'])) {  
  65.     $token = $result['access_token'];  
  66. }  
  67. if (!$token) {  
  68.     throw new Exception('token can not empty');  
  69. }  
  70.   
  71. $createMenuUrl = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' . $token;  
  72. $opts = array(  
  73.     'http' => array(  
  74.         'method'  => 'POST',  
  75.         'header'  => "Content-type: application/x-www-form-urlencodedContent-Length: " . strlen($menujson) . "" . "Connection: keep-alive" . "Keep-Alive: " . 300 . "",  
  76.         'content' => $menujson,  
  77.         'timeout' => 120,  
  78.     ),  
  79. );  
  80.   
  81. $context = stream_context_create($opts);  
  82. $response = json_decode(file_get_contents($createMenuUrl, false, $context),true);  
  83.   
  84. if(!$response['errcode'] ){  
  85.     echo "success";  
  86. }else{  
  87.     echo $response['errmsg'];  
  88. }  
  89.   
  90. echo "<pre>";  
  91. print_r($response);  
  92. echo "</pre>";  
记得。如果返回成功,你又看不到效果,可以将公众号先取消关注,再加为关注,立刻就能看到效果了。
否则,你要等24小时左右 才能看到效果。
 
顺便,我也可以承接微信开发(请不要咨询我微信开发怎么做,网上教程很多。。。)

ltc监控脚本

 最近BTC和LTC很火啊。。但我又没有时间关注它,所以就写了个脚本,利用macosx 的notification来提醒。其实有很多办法,比如chrome的桌面提醒等。windows的messmage,邮件都OK

 
我这个只是最简单的版本,花了5分钟写完。。用了一些技术:
1、php
2、crontab 
3、terminal-notifier (这个是ruby的,在mac下面安装也很简单,直接brew install terminal-notifier 就OK了)
 
上代码:
PHP代码
  1. if (count($argv) == 1) {  
  2.     echo "\nUse age:\n\n";  
  3.     echo "php okcoin.php --ltc=100 --btc=500 \n\n";  
  4.     echo "--ltc 代表参数,ltc和btc不分顺序\n\n";  
  5.     exit;  
  6. }  
  7. array_shift($argv);  
  8. $params = array();  
  9. foreach ($argv as $val) {  
  10.     if (strncasecmp($val"--", 2) === 0) {  
  11.         $p = explode("="substr($val, 2));  
  12.         if (!isset($p[1])) {  
  13.             continue;  
  14.         }  
  15.         $params[trim($p[0])] = trim($p[1]);  
  16.     }  
  17. }  
  18. if(!$params){  
  19.     exit("参数不正确");  
  20. }  
  21. $api = "https://www.okcoin.com/ticker.do?random=" . rand(1, 9);  
  22. $data = @json_decode(file_get_contents($api), true);  
  23.   
  24. $warning = array(  
  25.     'btc' => 5000,  
  26.     'ltc' => 150,  
  27. );  
  28.   
  29. if ($data) { //证明是正常数据  
  30.     $btcLast = $data['btcLast'];  
  31.     $ltcLast = $data['ltcLast'];  
  32.     if (isset($params['btc']) && $btcLast <= $params['btc']) {  
  33.         exec("terminal-notifier -message '关注一下BTC,价格在指定价位附近了' -title 'BTC 警告'");  
  34.     }  
  35.     if (isset($params['ltc']) && $ltcLast <= $params['ltc']) {  
  36.         exec("terminal-notifier -message '关注一下LTC,价格在指定价位附近了' -title 'LTC 警告'");  
  37.     }  
  38. }  
  39. exit;  
自用,只是够用就好

Tags: ltc