Magento使自定义属性'免运费'的产品自动添加到指定目录

Magento免运费

Magento产品添加了个自定义属性Free Shipping(免运费)。要实现当Free shipping属性的值为YES的时候,自动把产品指定到一个叫Free Shipping的目录。

P,前台还可以处理下,使有这属性值的产品添加标识条幅。如图,效果还是挺惹人喜的。

magento免运费属性的产品示例图

Magento产品自动添加到指定目录
我的处理办法是,重写“app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php”这个文件。

在_initProductSave方法里的

/**
* Initialize product categories
*/

这个步骤添加额外处理。

完整代码为:

// addEd at: 10:20 2011/7/30 by chen@sjolzy.cn
/*
    $productData['free_shipping']: 21 yes 20 no
    Free Shipping Specials category id: 31
*/
    $ifFreeShipping    = (int)$productData['free_shipping']===21?true:false;
    $freeShippingCategoryId    = 31;
    // addEd at: 10:20 2011/7/30 by chen@sjolzy.cn

if (null !== $categoryIds) {
    if (empty($categoryIds)) {
        $categoryIds = $ifFreeShipping?$freeShippingCategoryId:array();
    }else{
        $categoryIds = explode(',',$categoryIds);
        $categoryIds = $this->freeShippingCategoryIdProcess($freeShippingCategoryId,$ifFreeShipping,$categoryIds);
    }
    $product->setCategoryIds($categoryIds);
}else{    // addEd at: 10:20 2011/7/30 by chen@sjolzy.cn
    $categoryIds = Mage::getResourceSingleton('catalog/product')->getCategoryIds($product);
    if($categoryIds){
        $categoryIds    = is_array($categoryIds)?$categoryIds:array($categoryIds);
        $categoryIds    = $this->freeShippingCategoryIdProcess($freeShippingCategoryId,$ifFreeShipping,$categoryIds);
        $product->setCategoryIds($categoryIds);
    }
}    // addEd at: 10:20 2011/7/30 by chen@sjolzy.cn
 

另外添加的freeShippingCategoryIdProcess方法是

protected function freeShippingCategoryIdProcess($freeShippingCategoryId,$ifFreeShipping,$categoryIds){
    if(!$ifFreeShipping){
    $k = array_search($freeShippingCategoryId,$categoryIds);
    if(false!==$k){
        unset($categoryIds[$k]);
    }
    }else{
        $categoryIds[]    = $freeShippingCategoryId;
    }
    return implode(',',$categoryIds);
}

经过测试,达到预期效果,产品设置YES后自动添加到free shipping的目录,No了之后再取消。

电子商务系统使用paypal支付接口的程序流程及通信接口

 

magento使用paypal支付接口测试

关于paypal在线支付的信息可以直接访问http://www.paypal.com。

一般电子商务系统实现的流程
如下: 
客户在系统内下订单 -> 将订单的金额信息提交到paypal网站 -> 客户在paypal上付款 -> paypal将客户的付款完成信息发送给电子商务系统 -> 系统收到paypal信息后确定客户订单已经付款 -> 进行发货等后续流程。

 

从这个流程中可以看到系统与paypal的通信尤其关键,可以实现订单的自动付款确认。 

(1)如何调用paypal接口
?(将订单的金额信息提交到paypal网站) 

<form name="paypal" action
="https://www.paypal.com/cgi-bin/webscr
" method="post">

<input type="hidden" name="cmd
" value="_xclick">

<input type="hidden" name="business
" value="paypal@xxx.com"><!--这里填写你的paypal账户email-->

<input type="hidden" name="item_name
" value="order information"><!--这里填写客户订单的一些相关信息,当客户连到paypal网站付款的时候将看到这些信息-->

<input type="hidden" name="amount
" value="220.00"><!--订单的总金额信息-->

<input type="hidden" name="currency_code
" value="USD"><!--订单总金额对应的货币类型 ,客户可以用其他币种来付款,比如这里订单币种是美元USD,客户可以用欧元EUR来付款,由paypal根据当前汇率自动实现币种之间的换算-->  

<input type="hidden" name="on0" value="customerId"><!-- 自定义的参数1 -->

<input type="hidden" name="os0" value="stephen"><!-- 对应上面自定义参数1对应的值 -->

<input type="hidden" name="on1" value="address"><!-- 自定义的参数2 -->

<input type="hidden" name="os1" value="shanghai china"><!-- 对应上面自定义参数2对应的值 -->

<input type="hidden" name="notify_url
" value="http://www.xxx.com/notifyurl.jsp?order_id=23876412"><!--这里告诉paypal付款的通信url,即当客户付款后调用这个url通知系统-->

<input name="Paypal" type="button" value="Go to Paypal" onclick="javaScript:this.form.submit();"></td>

</form>

在生成上面的paypal表单时,其中的[cmd],[action],[business],[amount],[currency_code],[notify_url]
参数设置绝对不能出错,[cmd]和[action]指定paypaly接口类型,[business]出错,你将收不到客户的付款,[amount]与[currency_code]关系到订单的金额,[notify_url]是系统与paypal的付款通知接口url。  


当客户下单后看到上面的页面后,就可以通过设置的按钮[Go to Paypal]连接到paypal.com网站,然后登录并进行付款。 (但一般我们会通过js触发表单的自动提交)

 

 

(2)paypay
将付款信息返回给系统 

当客户付款后,paypal就会自动调用上面表单提供的[notify_url]

//系统接收成功返回200 OK 否则返回fail

 

如果确认收到paypal发来的客户付款信息,则返回"200 OK",这样子paypal就知道系统已经收到信息了;否则返回"fail",这样paypal会过一段时间后再次发来。其实,只有当paypal收到"200 OK"的返回信息后才会停止发送付款信息,否则会自动的每隔一段时间就调用上面 

的[notify_url]通信接口。 

 

 

(3)系统处理paypal
发来的付款信息

程序流程
为:

//判断paypal付款账户是否正确

//判断订单号  

//循环收取paypal发来的所有参数信息  

//这里添加对收到信息的处理:一般是将这些信息存入数据库,然后对客户的订单进行处理.   

 

这样系统可以自动对客户订单的付款情况进行跟踪,更快捷的进行订单处理。 

 

 

Ps,

paypay允许的币种 
AUD Australian Dollar 
CAD Canadian Dollar 
CHF Swiss Franc 
CZK Czech Koruna 
DKK Danish Krone 
EUR Euro 
GBP Pound Sterling 
HKD Hong Kong Dollar 
HUF Hungarian Forint 
JPY Japanese Yen 
NOK Norwegian Krone 
NZD New Zealand Dollar 
PLN Polish Zloty 
SEK Swedish Krona 
SGD Singapore Dollar 
USD U.S. Dollar 

 

paypal返回参数

mc_gross交易收入
address_status地址信息状态
paypal_address_idPaypal地址信息ID
payer_id付款人的Paypal ID
tax税收
address_street通信地址
payment_date交易时间
payment_status交易状态
charset语言编码
address_zip邮编
first_name付款人姓氏
address_country_code国别
address_name收件人姓名
custom自定义值
payer_status付款人账户状态
business收款人Paypal账户
address_country通信地址国家
address_city通信地址城市
quantity货物数量
payer_email付款人email
txn_id交易ID
payment_type交易类型
last_name付款人名
address_state通信地址省份
receiver_email收款人email
address_owner尚未公布/正式启用
receiver_id收款人ID
ebay_address_id易趣用户地址ID
txn_type交易通告方式
item_name货品名称
mc_currency货币种类
item_number货品编号
payment_gross交易总额[只适用于美元情况]
shipping运送费