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正常配置即可