OpenCart用了很久了,渐渐发现它越来越不适合自己的需要。想要达到国人的使用习惯,必须进行大的改动。包括核心框架的改动。例如各种插件模块的文件放置位置,太分散,想写个模块要在目录里来回倒腾好几次,有时候时间一长就根本不记得文件在哪个目录里。当然,这些都得等有时间了才能去弄。 这回要给OpenCart加个支付宝的插件,本来官网上有免费的支付宝插件可以下的,不知什么时候开始,OpenCart的铜臭味越来越重了,只要是附加的东西都想赚点零花用用。只好自己来写。 文件放置的位置前面已经说过了,比较分散,支付模块的文件都在catalog/controller/payment/下,新建个alipay的子目录,和alipay.php的文件。 模块怎么写就不重复讲解了,写这个下来也就是为了给自己一个提醒。主要说下疑难问题。 支付宝模块需要三个文件, alipay.php 给OpenCart用的,当用户确认订单后,用来生成支付宝支付链接用的。这个文件只要能获得生成的订单号,并将订单数据,按照支付宝的要求,拼接成URL链接,让用户能跳转到支付页面就行了。本来是件挺简单的事,而且支付宝的接口说明也有例子,照抄都行。 这里有几点要注意,因为我没有照抄接口的例子,而是自己重头写的,在对URL进行签名时出了问题,签名本身并不复杂,只要对拼接的URL进行MD5运算就行。我在写的时候忽略了例子中的一个操作,即对要提交的数据进行排序。问题就出在这里,我估计是支付宝收到数据后,也是先将变量们进行排序后,再验证签名的,所以这里必须做一步排序的工作 。这个问题影响了进度。这里特别注明一下,以免以后忘了。 alipay_notify.php, 这个文件是用在支付宝完成付款后的异步通知,支付宝在完成支付后会做两个通知,一个是异步的,用户看不到,在后台通知网站,支付成功了,另外,还会将完成后的页面重定向回网站指定的页面。这两次通知都会带有返回数据,供网站使用。 那么为什么会做两次通知呢?主要是因为跳转通知(即alipay_return.php要做的工作),在执行时,跳转页面会被用户给关掉,这样网站就不能通过这个方式来获知付款是否成功,异步通知不会因为用户的操作而终止,所以两种方式起码能保证有一种途径能正常通知网站。 alipay_return.php 这个文件是在支付完成 后从支付宝跳转 回来的页面。 上面两个问题明白了,那么程序就不难写了。 另外一点接口里的return_url和notify_url这两个URL里不能有?flag=abc&open=true这样的东西。虽然不知道支付宝是怎么想的,既然这是规定就必须遵守,不然网站付不了钱就不好玩了。 所以,OpenCart里如果去掉url里的“route=”就必须写成“http://www.xxoo.com/catalog/controller/payment/alipay_callback.php” 最后吐个槽,支付宝这么大的公司,这么大的支付量,现金流量,有这么大的用户群,竟然不支持沙箱测试。非得搞个1分钱的东西去测试,妈的,1分钱也是钱啊,测试10次就是1块钱了。全进支付宝口袋了。
Tag Archives: OpenCart
OpenCart开发支付宝插件
11-一-12OpenCart购物车无商品的问题
30-九-11一直用桌面客户端来更新OpenCart的信息,最近发现购买商品后无法出现在购物车里。百思不得其解。 今天研究一上午总算明白怎么回事。 原来是客户端同步商品信息的时候,有两个字段: weigth_class_id length_class_id 的值被赋成了0。而数据库里记录都是从1开始的,根本没0这个值。况且,weight_class表里的数据跟product里的weight_class_id不对应的话同样也是查不到数据。 正类为查不到数据,所以购物车才会以为你没买东西,自然也就不会显示商品了。 问题找到,把程序改改。好了。 =================================================== 想问一下,有人知道Amazon 美国区的affiliate如何搞不?中国区的那些个广告能不能放在多个网站上的? 这些问题挺麻烦的。
opencart 商品的breadcrumb问题
23-九-11opencart 1.4.9.6版本商品从不同的路径进入,面包屑显示的也不同,例如,从首页进入,breadcrumb只会显示 首页->XX商品,若从分类进入,则又会显示 首页->分类一->分类二->XX商品,对于这种做法有点不爽,于是,自己动手改改。 在/catalog/model/category.php文件中加入以下代码: public function getCategories1($parent_id) { $category_data = $this->cache->get(‘category.path.’ . $this->config->get(‘config_language_id’) . ‘.’ . $parent_id); if (!$category_data) { $category_data = array(); $query = $this->db->query(“SELECT *,c.category_id as `path` FROM ” . DB_PREFIX . “category c LEFT JOIN ” . DB_PREFIX . “category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = ‘” . (int)$parent_id [...]