ecshop添加微信支付jsapi

一直没捣鼓过ecshop,也没捣鼓过微信支付,这次一起碰上了。

先说说官方提供的demo吧,lib/WxPay.Config.php里的curl代理设置要修改,否则第一步获取openid就要挂

const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";
	const CURL_PROXY_PORT = 0;//8080;

接着是微信公众号后台,要填上测试url和测试微信号,这两个位置还比较明显,一般都能看到,有个东西就不好找了,oather2.0的回调域名,默认就是注册绑定的域名吧,我测试是用test的二级域名,捣鼓半天都获取不到openid,要到开发者中心-》配置项,找网页授权获取用户基本信息,后面有个修改按钮,点开就可以改回调域名了。

再说一下这个openid,微信公众平台接口在获取这个openid的时候需要做一次url跳转

public function GetOpenid()
	{
		//通过code获得openid
		if (!isset($_GET['code'])){
			//触发微信返回code码
			$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
			$url = $this->__CreateOauthUrlForCode($baseUrl);

			Header("Location: $url");
			exit();
		} else {
			//获取code码,以获取openid
		    $code = $_GET['code'];
			$openid = $this->getOpenidFromMp($code);
			return $openid;
		}
	}

第一次GET[code]肯定是空的,要做一次跳转,得到code后再次回到获取openid页面,放在ecshop这就有问题了,你不能在支付时才去获取openid,那个时候做跳转,一个是购物车已经被清空二个说不定还要跳出两个订单也有可能,这是很衰的事情,所以最好在入口处就获取openid,判断一下是否在微信内,是否有获取到openid

if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false && !$_COOKIE["sopenid"]) {
	header("location:/getopenid.php");
}

因为ecshop不是单入口,所以最好放到init.php里,基本每个页面都会调用到,获取到openid后再跳转回去

最后就是支付和回调了,ecshop支付文件必须配置在include/modules/payment目录里,且要调用get_code方法,这样就不能直接用demo了,重新整理好丢payment目录,回调地址是在支付时就设定好的,参考其他支付的回调页面改写一下就可以了。

最后上线,记得把公众平台里的回调域名改成正式域名,开发配置里的支付授权目录也配置好,ecshop的支付是由根目录的flow.php发起的,一般配置到根目录就可以了,虽然内部是调用modules/payment

最后还要配置一下language目录的payment,参考其他支付的配置文件拷贝一个就可以了,这样就可以在管理员后台支付管理里,把微信支付开启起来,开始调试上线吧

静态nginx,动态apache配置

首先要把80端口配置给nginx,apache配置成其他端口,比如8080

nginx的配置:

server {
        listen       80;
        server_name xxx.com www.xxx.com;
        root /www/web/xxx;
        index  index.html index.php index.htm;
        error_page  400 /errpage/400.html;
        error_page  403 /errpage/403.html;
        error_page  404 /errpage/404.html;
        location ~ \.php$ {
                proxy_pass http://127.0.0.1:8080;
                include naproxy.conf;
        }
        location / {
                try_files $uri @apache;
        }
        location @apache {
                 proxy_pass http://127.0.0.1:8080;
                 include naproxy.conf;
        }
}

其中naproxy.conf配置如下:

proxy_connect_timeout 30s;
proxy_send_timeout   90;
proxy_read_timeout   90;
proxy_buffer_size    32k;
proxy_buffers     4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect     off;
proxy_hide_header  Vary;
proxy_set_header   Accept-Encoding '';
proxy_set_header   Host   $host;
proxy_set_header   Referer $http_referer;
proxy_set_header   Cookie $http_cookie;
proxy_set_header   X-Real-IP  $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

apache正常配置即可

几个android应用市场

公司开发了一个android应用,需要提交到各应用市场,国内几个大的或者说有些知名度的市场如下:

百度、安卓市场、91助手、中兴应用市场 http://app.baidu.com/apps/create
安智市场 http://dev.anzhi.com/
360 http://dev.360.cn/
豌豆荚 http://developer.wandoujia.com/
搜狗市场 http://app.sogou.com/developer/app
联想 http://open.lenovo.com/
魅族 http://developer.meizu.com/
木蚂蚁 http://dev.mumayi.com/index/register
腾讯应用宝 http://op.open.qq.com/
机锋 http://dev.gfan.com/ kudayuan
淘宝 http://app.taobao.com/devindex/dev_index.htm
N多 http://www.nduoa.com/developer
中国移动http://dev.10086.cn/
华为 http://developer.huawei.com/
小米 http://dev.mi.com/
飞流 http://dev.feiliu.com/
优亿 http://dev.eoemarket.com/index.php?s=/login/login
应用汇 http://dev.appchina.com/market/dev/index.action
google play https://play.google.com/apps/publish/signup 25美元

百度系的有很多,包括安卓市场、91助手甚至中兴应用市场都是百度系的,所以只用提交一个百度应用市场(百度手机助手)就可以了,会自动同步到其他几个。不过百度审核时间真长啊,足足等了两个星期,期间还咨询过数次,才通过。也有应用次日就通过的,要看应用类型。

有些二三线的应用市场,甚至不收录个人应用了,我注册企业开发账号,竟然也一直不审批,比如飞流,我看是要关门了吧。

一些手机品牌的市场,比如中华酷联+小米,还有些二线品牌的,也都可以提交。小米和华为审批比较严,其他基本当天都能过。

最难搞的是中国移动的应用市场,提交两个月都没通过,而且还要花50元测试费,最后放弃了。

googleplay要25美元,我们应用的客户主要在国内,就没提交,说是googleplay也要在国内推广了,我看没戏,不合中国人口味。

由两点经纬度计算距离之php实现

<?php
const EARTH_RADIUS = 6378.137;
function rad($d)
{
   return $d * M_PI / 180.0;
}

function GetDistance($lat1, $lng1, $lat2, $lng2)
{
   $radLat1 = rad($lat1);
   $radLat2 = rad($lat2);
   $a = $radLat1 - $radLat2;
   $b = rad($lng1) - rad($lng2);
   $s = 2 * asin( sqrt( pow( sin($a/2),2) +  cos($radLat1)* cos($radLat2)* pow( sin($b/2),2)));

   $s = $s * EARTH_RADIUS;
   $s = Round($s * 1000);
   return $s;
}
echo GetDistance(39.994103,116.365338,40.037428,116.332334);// m

据称以上代码是copy自googlemap,我把他翻译成php版本,并将原输出结果km改成m

centos搭建流媒体服务器

要做流媒体服务,普通的web服务肯定是不行的,把视频文件丢到web目录里,只能做下载用,不能用来播放的,这是基本的概念。

搜了一下,centos用Darwin Streaming Server做流媒体服务器是比较多的,一致建议用5.5版本,下载安装配置如下:

yum -y install gcc gcc-c++ perl ld-linux.so.2 libstdc++.so.6
wget http://dss.macosforge.org/downloads/DarwinStreamingSrvr5.5.5-Linux.tar.gz
tar -zxvf DarwinStreamingSrvr5.5.5-Linux.tar.gz
cd DarwinStreamingSrvrlinux-Linux
./Install

安装完成后在命令行端会提示设置管理员和密码,按照提示输入就可以了,记住设置的用户名和密码,打开http://服务器ip:1220/可以访问到web管理端,按需配置就可以了,有一个配置,是否用80端口,不要勾选,否则肯定和web服务有冲突。

默认视频文件目录放在/usr/local/movies,播放地址是:rtsp://服务器ip/视频文件

接下来才是重点,如果用自带的视频文件播放,你不会发现有什么问题,但是你用自己制作或者网上下来的视频文件,就不对了,客户端无法播放。

问题出在一个叫hint track的东西,一般视频缺这个,需要下载一个叫mp4creator.exe的软件,做些处理,linux端也有,不过安装配置太麻烦,懒得去搞了。

下载mp4creator后,用命令行打开,对视频文件执行以下两个操作:

mp4creator hint=1 视频文件
mp4creator hint=2 视频文件

忽略任何提示和警告,处理完的视频文件再上传到/usr/local/movies目录,再用客户端播放,就没问题了。

max_input_vars对表单post的影响

先看一下php.ini里max_input_vars这个配置项的解释:

How many GET/POST/COOKIE input variables may be accepted

用来控制get、post、cookie的输入变量最大个数,默认值是1000,一般来说是够用了,也有些特殊表单,会超过1000个input,那么按顺序排1000以上的input就会被丢弃。

修改表单或者配置值解决这个问题