Magento 手机支付 (支付宝无线支付)

 现在magento 支付宝插件在网上还是很多的。但是支付宝无线支付貌似还不多。这里我只是根据官方文档和其它

支付方式编写出无线支付的雏形,可用但是不完善,先记录在这里。(当然文章是点到为止,只给我这种菜鸟看看,大神无视我吧。)

---------------------------------------------------我就是分割线怎么了---------------------------------------------------

首先肯定是要熟悉支付宝官方给出的文档

手机网页即时到账接口 和 手机网页支付接入与使用规则 以及 demo 代码

之后开始梳理流程:

(一下是在默认情况下,不要纠结个别变量的不同)

1. 在magento中我们点击结账,如果支付方式选择的是第三方支付方式会跳转到相应支付方式Paymentcontroller里的redirectAction

在模块的system.xml 中加入你自己的后台配置代码

2. 在这里magento最主要的是 记录$order以及createBlock 输出html

$this->getResponse()
            ->setBody($this->getLayout()
                ->createBlock('alipaymobile/redirect')
                ->setOrder($order)
                ->toHtml());

3. 在输出的页面 例如是支付宝或者快钱等支付方式通常是隐藏的form表单包含要提交的信息,以及自动提交的js

但是支付宝无线支付有些不同,从官方文档中得知 我们首先需要 获得授权即调用接口手机网页即时到账授权接口

然后才是 调用接口手机网页即时到账交易接口

那么我的解决思路是在 Block/Redirect.php 中先去掉用授权接口然后是代码自动调用即时到帐接口完成结账。

这时候看到的网页是要跳转两次的。

4. 首先调用授权接口 隐藏的form表单提交的 url地址应当是 里一个例如AlipayapiController

并且主要代码都是在这个controller中实现的

//建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestHttp($para_token);

 

//获取request_token
        $request_token = $para_html_text['request_token'];

 

//建立请求
        $alipaySubmit = new AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '确认');

注意:按这种方法其中出现的一个重要问题是会获取不到 notifyUrl 和 SuccessUrl, (除非你直接写的绝对路径,而不是从model中获取的)

是因为 在model中 getSuccessURL 和 getNotifyURL 都是使用protected声明的。 最简单的解决办法是改成public

以我之愚见好像没必要声明成protected

5. 处理success代码 和 notify代码即可。

 

 

 

 

这完成了结账流程没错,但是只是90%吧,因为还有重要的前端处理流程。

即PC端 是不需要显示这个支付方式的 一种解决办法是

在template/checkout/onpage/payment/methods.phtml 中找到代码

foreach ($methods as $_method):
        $_code = $_method->getCode();

在后面加上

if($_code == "alipaymobile_payment"){
            continue;
        }

即可,当然这里的 alipaymobile_payment  要自己根据实际情况来定了。

另一个需要修改的地方是我的订单包括历史订单页面(我这里实在之前开发了继续支付功能)

当你在手机选择了 支付宝无线支付 但是没有做付款操作,转而用电脑继续,那么此时在订单付款按钮处就

不应该选择支付宝无线支付了。可以使用

$paymentsAllMethods = Mage::getSingleton('payment/config')->getActiveMethods();

过滤出可用的支付方式即可。

至此 就基本完成了。大家凑合看吧,其实有了官方文档,加上对magento有些了解花点时间就可以写出来的

我只不过写下我自己的解决办法。 不喜勿喷!欢迎指正!

 

懒得开发的可以联系我

但我不会去帮你定制。(哎呀,我的服务竟然这么差!)

 

---------------------------------------------------我就是分割线怎么了---------------------------------------------------

这是发在CSDN的第一篇文章,所以必须是原创的!

最开始在新浪上写博客,后来到百度空间,我只想说百度空间让我几乎没有了写博客的欲望。

总之现在又想乱写点东西了,给自己看也好。

PS: 会陆续把我印象笔记里的东西拿过来。

 

 

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Magento 手机支付 (支付宝无线支付)

 

Magento 创建新的产品详情页面

当我们在为magento 开发手机模版的时候常常需要 将详细的图文消息放到另一页面,其中一个目的是

提高加载速度。 例如我们在productController.php 中创建一个新的Action叫做descAction

注:这里不会去提醒你 要重写模块而不是修改core 文件。

产品的信息获取详细看这里

http://blog.csdn.net/m0sh1/article/details/40299847

先直接看代码:

 public function descAction(){
        $productId  = (int) $this->getRequest()->getParam('id');
        $_product = $_product=Mage::getModel('catalog/product')->load($productId);
        $_productUrl = $_product->getProductUrl();

        $curPackage = Mage::getSingleton('core/design_package')->getPackageName();
        $curTheme = Mage::getSingleton('core/design_package')->getTheme('frontend');
        if($curPackage === "mobile" && $curTheme === "mobile"){
            $this->loadLayout();
            $this->renderLayout();
        }else{
            $this->_redirectUrl($_productUrl);
        }
    }

这里之所以做一个if判断 是因为不希望在电脑版的模板中额外分割出来一个产品描述页面。

但是不排除用户从手机访问了描述页面然后复制链接用电脑打开。

通过函数

 Mage::getSingleton('core/design_package')->getPackageName();

 Mage::getSingleton('core/design_package')->getTheme('frontend');

判断当前的package和theme  判断条件中的mobile要根据实际情况自己修改。

创建Block

<?php
class Mobile_Block_Catalog_Product_Desc extends Mage_Catalog_Block_Product_Abstract{

}

之后我们在对应模板下的layout中找到catalog.xml 加入代码:

    <catalog_product_desc>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
        <reference name="head">
            <action method="addJs"><script>varien/product.js</script></action>
            <action method="addCss"><script>css/media.css</script></action>
        </reference>
        <reference name="content">
            <block type="mobile/catalog_product_desc" name="product.desc" template="catalog/product/desc.phtml">
                <block type="catalog/product_view_description" name="product.description" as="description" template="catalog/product/view/description.phtml">
                </block>
            </block>
        </reference>
    </catalog_product_desc>

同时创建 desc.phtml 用来前端显示:

<?php
    $id = (int) $this->getRequest()->getParam('id');
    $_product=Mage::getModel('catalog/product')->load($id);

?>
<?php echo "Product Info"?>
<div class="product-specs">
    <?php $_description = $_product->getDescription(); ?> // 不考虑带有mobile description
    <?php echo $this->helper('catalog/output')->productAttribute($_product, $_description, 'description') ?>
</div>

至此再加上一些自己实际处理情况的代码就可以了。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Magento 创建新的产品详情页面

magento 根据产品id,获取产品信息

假设产品的id 存在变量$id中

那么

$_product = Mage::getModel('catalog/product')->load($id);

打印数据信息:

var_dump($_product->getData());
// 也可以记录在log中
Mage::log($_porduct->getData());

这时你就可以相应的key获取 信息 例如 id

$id = $_product->getData('entity_id');  也可以使用 $_product->getId() 获取到
// 产品的Url
$url = $_product->getProductUrl();

附带一下 magento 获取当前包 和 theme name的方法

$curPackage = Mage::getSingleton('core/design_package')->getPackageName();
$curTheme = Mage::getSingleton('core/design_package')->getTheme('frontend');

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento 根据产品id,获取产品信息

magento根据运送城市设置支付方式

例如,有的时候我们的商城并不是支持所有地区都可以货到付款的。

那么这个时候就会根据不同城市 选择性的显示货到付款支付方式。

但首先我们要在后台做一些可控的配置

例如:

当然还要有那些城市是可以货到付款的。这里就不显示出来了。(因为我自己是在另一个 选项卡了配置这个信息的。)

(后台开发可以去网上搜索教程。)

之后在文件

appdesignfrontendbasedefaulttemplatecheckoutonepagepaymentmethods.phtml中

代码

 $methods = $this->getMethods();
    $oneMethod = count($methods) <= 1;

下添加代码:

$showCashOnDeliever = Mage::getStoreConfig('payment/cashondelivery/accordingCityActive'); // 根据自己编写情况找到实际位置
    if($showCashOnDeliever){
        $checkout = Mage::getSingleton('checkout/session')->getQuote();
        $shipping = $checkout->getShippingAddress(); // 获取当前运送的城市
        $CityStr = Mage::getStoreConfig('payment/cashondelivery/city');
        $CityArr = explode(' ',$CityStr); // 获取货到付款的城市
    }

然后找到代码

 foreach ($methods as $_method):
        $_code = $_method->getCode();

下面添加 代码:

if($showCashOnDeliever){
            if($_code == "cashondelivery"){
                $destCity = $shipping->getCity();
                if(!in_array($destCity,$CityArr )){
                    continue;
                }
            }
        }

这时候你就可以结账试试了。 ^_^

--------------------------------------------------唠叨两句----------------------------------------

这只是通过判断的方式使得前台不显示货到付款的支付方式了。同样的你可以去掉任何你需要的支付方式。

当然,有人说我截取post数据修改支付方式为货到付款,那么订单支付方式当然还会是货到付款了。你若真要

细致考虑,那你就在确认订单的时候再去判断合法性。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento根据运送城市设置支付方式

php 错误Cannot modify header information – headers already sent by

PHP 的输出缓存

先明确一下PHP的输出顺序
1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display
2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display

另外浏览器的输出缓存:IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上

buffer
buffer是 一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的 区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每输入一个字符,操作系统并 不会立即把这个字符直接写入到磁盘,而是先写入到buffer,当写满了一个buffer的时候,才会把buffer中的数据写入磁盘,当然当调用内核函 数flush()的时候,强制要求把buffer中的脏数据写回磁盘。

同样的道理,当执行echo,print的时候,输出并没有立即通过server传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在server buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由server传给浏览器显示。所以,数据会依次写到这几个地方:echo/print -> php buffer -> server buffer -> browser

php output_buffering
默 认情况下,php buffer是开启的,而且该buffer默认值是4096,即4kb。你可以通过在php.ini配置文件中找到output_buffering配 置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过server传送给浏览器显示。你也可以通过 ob_start()手动激活php output_buffering机制,使得即便输出超过了4kb数据,也不真的把数据交给server传给浏览器,因为ob_start()将php
buffer空间设置到了足够大。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。
我们将php.ini 中的 output_buffering 设置成为On就表明设置了无限大的buffer空间。

假设我们设置的output_buffering 为Off 那么php代码:

echo "php";
header("content-type:text/html;charset='utf-8'");
echo 'ok';

是会出错的提示:Cannot modify header information - headers already sent by

根据以上内容分析原因:

php在echo ‘php'时已经向浏览器发送一个头信息,当再出现header("content-type:text/html;charset='utf-8'");
又看到一个头信息,这时已经打回了上面的头信息,无法更改便出错了。

解决上述问题可以通过以下方法解决:
1. 检查是否有在header 输出之前输出的内容
2. 使用
<?php ob_start(); ?>
... HTML codes ...
<?php
... PHP codes ...
header ("Location: ....");
ob_end_flush();
?>方法解决
3. error_reporting(E_ERROR | E_PARSE); 这里不要显示E_WARNING即可
不显示错误(但是错误还在)
4. 有权限编辑php.ini 则
设置 output_buffering =为on或者具体大小。
5. 将该文件转为UTF-8 without BOM编码的文件

今天修改magento代码 提交到服务器上的时候在log文件中发现错误:
 HEADERS ALREADY SENT...
检查发现错误记录在文件
appcodecoreMageCoreControllerResponseHttp.php

if (!$this->canSendHeaders()) {
            Mage::log('HEADERS ALREADY SENT: '.mageDebugBacktrace(true, true, true));
            return $this;
        }

追踪函数canSendHeaders
在libZendControllerResponseAbstract.php中

 public function canSendHeaders($throw = false)
    {
        $ok = headers_sent($file, $line);
        if ($ok && $throw && $this->headersSentThrowsException) {
            #require_once 'Zend/Controller/Response/Exception.php';
            throw new Zend_Controller_Response_Exception('Cannot send headers; headers already sent in ' . $file . ', line ' . $line);
        }

        return !$ok;
    }

可以看到使用了 headers_sent函数。 我们也可以通过这个函数配合get_include_files 找出错误出现在那里
其实这个错误和php 提示错误Cannot modify header information - headers already sent by
应该是一个问题
我找到php.ini 修改
output_buffering =4096 为On 错误解决了,
但是这里的问题是我的 output_buffering 是打开的但是还发生这种错误?难道大小不够
我索性尝试给了1024000即1M 结果错误也没有。
那么我的猜测是:(知道的麻烦帮下忙告诉下,具体原因。拜谢!)
输出的内容比较大,php 缓冲区大小是4kb 那么写满了以后要输出到browser, 但是在这4kb后面
还有头部信息的修改例如header() 函数但是头信息已经发送了,于是报错。而如果修改buffer大小
为On 表示无限大则错误消失。

-----------------------------------------------------------------是这样吗?---------------------------------------------------------------------

---------------------------------------------------------------- 更新-----------------------------------------------------------------------------

正解在这里 ("▔□▔)/

http://blog.csdn.net/m0sh1/article/details/46124089

参考资料:

http://blog.csdn.net/besily/article/details/5396268
http://www.jb51.net/article/38363.htm
http://www.jb51.net/article/39774.htm
http://www.jb51.net/article/38365.htm
http://stackoverflow.com/questions/4670031/magento-debug-headers-already-sent-error

此文章通过 python 爬虫创建,原文是自己的csdn 地址: php 错误Cannot modify header information - headers already sent by