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 Shopping Cart Price Rule 购物车促销规则

magento 有着强大的促销规则设置,能满足许多常规的促销手段。

(当然在现实问题中,我们在很多地方是需要定制开发的。)

这里主要解析下magento 的 Shoppping Cart Price Rule.

我们先假定实现一个购买sku为 VGN-TXN27N/B的商品1个就免费送1个。

1.首先在后台选择 promotions->Shoppping Cart Price Rules

2. 设定 rule information 选项卡(这里就不全面演示各种情况的设定了。)

coupon 选择 specific coupon即使用优惠券的方式

use Auto Generation 表明需要自己优惠券代码。

use per Coupon 表明一个优惠券可以用几次, 举例:如果设定为2用户 A 使用了这张优惠券后,用户 B 也是可以使用的,

而设定为1表示 A 使用了 B 就不能再使用了。

use per Customer 表明一个用户可以使用几次,举例: 如果设定为2 那么用户 A 使用这张优惠券购买完后,再次购买还是可以使用的,但是第三次就不可以了。

Priority 优先级(避免和其他的shopping cart price rule 冲突)

3.Actions 选项卡

先说actions 选项

apply 这个select 下有4个选项

1.Percent of product price discount 百分比折扣

2.Fixed amount discount 定额折扣

3.Fixed amount discount for whole cart 整个购物车定额折扣

4.Buy X get Y free (discount amount is Y) 买x免费获得y个

这里选择我之前一直没弄明白的buy x get y free (其实这个你只要一测试就发现怎么使用了,就是不能懒 。)

discount amount 代表y , Discount Qty Step(Buy x) 代表x 这里就是买一送一的意思。

Free Shipping 是否可以免运费

Stop Further Rules Processing 是否停止进一步处理规则

(Maximun Qty Discount is Applied To 和  Apply to Shipping Amount 作用没测试过,有谁测试过帮忙告诉下,拜谢!)

细看这个选项卡下面还有一栏内容

Apply the rule only to cart items matching the following conditions (leave blank for all items)

暂时先不管(下面会回头继续讲解,这个功能很重要的

4.Conditions 选项卡

设定(促销)规则生效的条件,注意:这里的条件针对的是购物车里的所有商品,或者说整个购物车。

假设我们设定 购买产品sku为 VGN-TXN27N/B 的

这里首先需要选择Product attribute combination 然后才会有sku(没有的话去属性那里 修改使用促销规则为是即可)

这里和actions 选项卡下面的条件构成了促销规则的强大的灵活性。你可以根据实际情况进行各种各样的设置。

最后就是生成优惠券了

5.Manage Coupon Codes 选项卡

1).Coupon Qty 优惠券数量

2).Code Length 优惠券代码长度

3).Code Format 优惠券代码的格式

4).Code Prefix 优惠券前缀

5).Code Suffix 优惠券后缀

6).Dash Every X Characters 每几个字符进行分割

设置好后点击生成即可。

这个时候保存就行了。(当然你也可以去Labels 选项卡设置前台显示的优惠券名称)

(购物车规则是没有应用规则按钮的,只要是active就会生效的,而 catalog Price Rule 不仅仅需要保存,还要点击Apply 才能生效。好吧又唠叨了。。。)

6. 前台效果

这时候我们选择sku 为 VGN-TXN27N/B 的商品,添加购物车,并使用生成的其中一个优惠券即可。

那么买1赠1这个规则是如何生效的呢?

原来你添加一个在购物车,使用优惠券后并没有任何变化,用户根本不知道你的赠送是怎么给的。

当你修改购物车数量为2个的时候就会发现价格减去了1个的单价。买1赠1就是这么实现效果的。

7. 分析

到这里并没有结束,因为你再次添加一个商品,修改数量为2 会发现这个商品也减少了一个单价,我们并不需要这个商品

也是买1赠1。 另一方面修改购物车中商品数量为4会发现减去了价格减去了两个单价,意味着每买1个都赠送1个。

假设我们希望只赠送一次。应该怎么办呢?

8.进一步完善

回到之前的 Conditions选项卡,前面强调过这个选项卡针对的是整个购物车,当添加了一个sku满足条件的商品时,规则就生效了

且针对的是每一个商品,即每个商品都可以买一赠一。

那么我们需要去掉这里的条件,将条件设置到actions 选项卡的下面设置条件的那栏内容里。这里此时只针对符合条件的商品。

其它的sku不是 VGN-TXN27N/B 的是不会买一赠一的,另一方面限制只赠送一次。这里面的设置就存在缺陷了,如图:

及设置数量为2才生效。但如果用户想要购买4件,即花三件的钱这样就不能实现了。(难道必须修改代码?)

(大家有其它好的方法麻烦告诉下。 再次拜谢!)

这个时候基本的要求就实现了。通过这里的设置,你完全可以设置类似

0元购买(不是添加一个0元的商品。。。),满减,打折等等优惠政策了。

本文不涉及代码,仅仅是设置操作。大牛勿喷,欢迎讨论,分享你实现的独特的促销手段。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: magento Shopping Cart Price Rule 购物车促销规则

svn 的使用(一)

一. 安装svn  服务器(操作系统centos)
yum install subversion
可以通过 subversion -v 命令查看是否安装成功
如果提示没有subversion 命令 是因为我们还需要创建svn 库
执行命令:
mkdir -p /svn/repos
svnadmin create /svn/repos
cd /svn/repos
ls
可以看到多出了许多文件和文件夹::conf  db  format  hooks  locks  README.txt
此时svn服务器的安装基本完成了。
二. svn配置
cd /svn/repos/conf
ls
可以看到文件:authz  passwd  svnserve.conf
1.首先配置passwd文件
vi passwd
添加类似账户
m0sh1 = admin
#格式为 用户名 = 密码
保存退出
2.配置authz文件
添加内容
[/]
m0sh1
#这两句表明 用户m0sh1 对整个目录都有访问的权限(你可以自己去设定更详细的目录权限)
3.配置 svnserve.conf
anon-access = none # 使非授权用户无法访问
auth-access = write # 使授权用户有写权限
password-db = password # 密码文件
authz-db = authz   # 访问控制文件
realm = m0sh1Svn
采用默认配置. 以上语句都必须顶格写, 左侧不能留空格, 否则会出错.
三. 开启服务进行测试
启动svn
svnseve -d -r /svn/repos
#如果已经运行了svn 还想再创建一个,可以通过设定不同端口来解决此问题
svnseve -d -r /svn/repos2 --listen-port 3313
启动成功后我们就可以通过本地的 TortoiseSVN 连接了(TortoiseSVN自行搜索下载即可)
svn 链接地址:
svn://server address (如果指定端口需要添加端口  :端口号)
四. 创建项目
1.你可以直接在这个svn server 所在的服务器上通过命令
svn improt project 导入项目
svn add file 添加文件(目录)
2.在windows 下使用 TortoiseSVN 工具 选中项目目录右键点击import 留下message 提交即可
3.在windows 下新建目录右键鼠标选择checkout,然后将项目文件复制到此目录,最后右键commit即可(留下message)
五. svn 版本管理
SVN 的结构一般是这样的:
svn:// your project
     +trunk/
         app/
         lib/ ...
     +branches/
         +braches_1.0/
     +tags
         +tag_release_1.0
当有开发需求的时候,从主干(trunk)上做分支(branch),当一个分支开发完毕,测试无误的情况下应该
合并到trunk上,如果在trunk上有问题可以在trunk做一些修改。当完成一个阶段,有一个可以发布的稳定项目
版本就可以打个tag了。
trunk中放置的始终都应该是一个稳定的版本, 在分支开发的开发人员应该经常和trunk同步(trunk merge  到branch
这不会改变trunk的代码),否则你会和trunk版本越来越远。分支合并到主干的时候要进过仔细测试后才能提交到commit
(但是commit 又应该尽快,防止别人也修改了trunk)
当然整体的流程应该依据实际情况设定。 svn的merge 可以单独搜索相关资料。^ _ ^
 
 下节会简单总结一下 svn hook的使用。
  例如上面的假设是一个web项目,trunk更新,同时web测试服务器也更新trunk代码。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: svn 的使用(一)

svn 的使用(二)

这篇主要介绍下 svn 钩子的使用,svn 的安装以及配置等可以查看 svn 的使用(一)

我们可以在svn创建的仓库文件夹下看到 hooks 文件夹。
这里面就存放这个各种svn操作同时会执行的脚本文件。
(你可以自己查看每个脚本文件,文件开始都有英文的介绍包括功能,参数以及返回值。
   我翻译的不好所以就采用网上其它资料的解释吧 - -! )
1.start-commit  开始提交的通知
输入参数:传递给你钩子程序的命令行参数,顺序如下:
    1. 版本库路径
    2. 已经认证过的提交的用户名
它在提交事务产生前已运行,通常用来判定一个用户是否有权提交。返回0表示认证通过。
2.pre-commit 在提交结束之前提醒
输入参数:传递给你钩子程序的命令行参数。顺序是:
     1. 版本库路径
     2. 提交事务的名称
在事务完成提交之前运行,通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个bug追踪的ticket号,或者是 要求日志信息不为空)而不允许的提交。无错误返回0。

 
3.post-commit  成功提交的通知
传递给你钩子程序的命令行参数,顺序为:
     1. 版本库路径
     2. 提交创建的修订版本号
它在事务完成后运行,创建一个新的修订版本。无错误程序正常退出。
 
4.pre-revprop-change 版本属性修改
因为Subversion的修订版本属性不是版本化的,对这类属性的修改(例如提交日志属性svn:log)将会永久覆盖以前的属性值。因为数据在此可能 丢失,所以Subversion提供了这种钩子(及与之对应的post-revprop-change),因此版本库管理员可用一些外部方法记录变化。作 为对丢失未版本化属性数据的防范,Subversion客户端不能远程修改修订版本属性,除非为你的版本库实现这个钩子。
5.post-revprop-change 版本属性修改
这个钩子与pre-revprop-change对应。事实上,因为多疑的原因,只有存在pre-revprop-change时这个脚本才会执行。当这 两个钩子都存在时,post-revprop-change在修订版本属性被改变之后运行,通常用来发送包含新属性的email。版本库传递四个参数给该 钩子:到版本库的路径,属性存在的修订版本,经过校验的产生变化的用户名,和属性自身的名字。

使用这些钩子最简单的方法就是
拷贝某个脚本,去掉.tmpl扩展名,然后自定义钩子的内容,确定脚本是可运行的。
PS:一定要确保钩子脚本是可执行的。而且名称就是去掉.tmpl后的名字。
另外要注意要使用SVN的钩子一定要开设权限,而且是要用运行SVN的账号进行执行这些钩子
(如果不是可以运行的会提示错误,错误代码为255,其他错误可以自行尝试。。)
我想要做的就是 用户commit 后服务器(测试环境的)自动同步 即做update操作
这里我的web服务器和svn服务器 在一台。(如果是远程的web服务器可以在
先使用ssh命令登入

那么我们需要使用的钩子是post-commit
我们可以使用命令
cp post-commit.tmpl post-commit.tmpl.bak
mv post-commit.tmpl post-commit
(别忘了 chmod 设置为可执行的)
chmod 755 post-commit
vi post-commit
这里我们可以先做一个测试
即在文件最后加上一行
/bin/echo "commit" >> /tmp/commit.out
然后执行commit 操作 看一下 commit.out 是不是多了 commit这个单词
那么编写我们的脚本在post-commit 文件最后添加命令
/usr/bin/svn update /www/project --username m0sh1 --password m0sh1
PS:这里要 加上绝对路径 , update 后面的是checkout 下来的项目路径
如果提示错误 svn: Can't convert string from native encoding to 'UTF-8'
则需要添加一行命令
export lang = en_US.UTF-8
此时去工作目录看下是不是更新了。。

再举个例子,有很多开发人员为了快,往往忽略掉提交日志信息(也可能无意为之),那么我们可以在pre-commit脚本
中做出必须提交日志信息的限制:
REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" |
   grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit 0
(上面内容直接就是pre-commit脚本中的内容,那么只需要给pre-commit可执行的权限就可以了。)
之后我们就可以以此,类推出其它想要实现的功能了。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: svn 的使用(二)

使用customer.update 方法 ,magento 1.7.0.2 soap api bug

使用 magento(1.7.0.2) 的soap api 更新用户信息的时候发现不能够更新用户的密码。

我们首先看一下 如何调用api 更新用户信息(参考自:magentocommerce

<?php

$api_url_v1 = "http://192.168.1.162/trunk/index.php/api/soap/?wsdl";
$username = 'moshi';
$password = 'moshiPass';


//连接 SOAP
$client = new SoapClient($api_url_v1);
//获取登入后的 Session ID
$session_id = $client->login($username, $password);
//调用 API 中的方法

$result = $client->call(
          $session_id, 'customer.update', array(
          'customerId' => '70', 'customerData' => array('firstname' => 'mo', 
          'lastname' => 'shi', 'email' => 'moshi@moshi.com', 
          'group_id' => '10', 'password' => '123456')));

var_dump ($result);

?>

但是仅仅这么做更新不了用户的密码。

网上的做法:

找到文件
appcodecoreMageCustomerModelCustomerApi.php
修改 update 方法 在 代码
$customer->save(); 上面添加代码:

if(isset($customerData['password'])){
    $customer->setPassword($customerData['password']);
}

当然最好重写这个模块。

我采用的方法是:
修改 调用api 的 call 函数

把其中的 password 修改为 password_hash 数据即可(当然是加密后的)
我们 可以在 api 调用magento 的update 方法中 找到代码:

foreach ($this->getAllowedAttributes($customer) as $attributeCode=>$attribute) {
            if (isset($customerData[$attributeCode])) {
                $customer->setData($attributeCode, $customerData[$attributeCode]);
            }
        }

这里其实就是根据 被允许的属性来决定哪些属性的值是可以被修改的。
打印 $attributeCode 发现 并没有password 所以直接传送 password 数据这么做是不可行的。
但是我们可以看到 我们是可以修改 pasword_hash 这个值的

当然修改这个值,你首先需要知道 你的magento 系统 加密方式是怎样的。
假设没有更改过,默认的加密方式是 md5(key+password)

所以 你只要在 调用 $client->call() 之前得出 password_hash 值即可。

此文章通过 python 爬虫创建,原文是自己的csdn 地址: 使用customer.update 方法 ,magento 1.7.0.2 soap api bug