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 购物车促销规则

使用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

Magento 微信支付

Magento 微信支付

根据前面几节介绍的微信支付分析这里大致介绍一下magento中微信支付功能的编写思路,用户可以选择微信支付(JsApi)也可以选择微信扫码支付(Native).
首先在magento 的app/code/local 下创建模块 并在 module设置active 为true
大致目录结构如图
这里写图片描述
转载请注明出处:http://blog.csdn.net/m0sh1/article/details/45449679
编写 etc/system.xml 为后台配置模块
可以将微信支付所需要的 appid appsecret mchid 和 key等信息配置到这里。这样在后台启用这个模块就会在前台支付过程中显示这个支付方式了。
当我们点击确认支付的时候 其实是调用了相关支付方式Model中的
getOrderPlaceRedirectUrl() 函数。我们可以在这个函数中设定下一步要走的流程。
例如:

public function getOrderPlaceRedirectUrl()
    {
        return Mage::getUrl('wxpay/wxselect');
    }

即调用 WxselectController.php 中的indexAction()方法,一般其它支付是直接跳转到相应的PaymentController.php 中的redirectAction() 方法,这里这么做的目的是展示给用户一个选择支付方式的页面。因为如果用户在PC端打开或者在移动浏览器中打开是不能使用微信JsApi支付的,(即使在微信中还可能存在跨号支付的问题)所以同时展示出来微信扫码支付的支付方式,当然你可以在代码上通过判断智能的实现支付方式的选择。
在选择页面用户选择了支付方式后,跳转到 PaymentController.php中的indexAction() 方法中。
核心代码如下:

$order = $this->getOrder();
if (!$order->getId())
{
    $this->norouteAction();
    return;
}

$order->addStatusToHistory(
    $order->getStatus(),
    Mage::helper('customer')->__('微信支付')
);

$order->save();

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

程序实例化 Block 展示微信支付页面。在Block 中获取order

$order = $this->getOrder();

JsApi 所需要的参数 通过Model 获取

$jsApiParameters = $model->createPackageInfo($order,$currentUrl);

如果是Native 方式则代码为:

$urlParam = $model->createPackageInfoNative($order);

因为微信支付需要设定支付发起的目录(具体可参见前面的微信支付相关文章)并且只有在这个目录下支付才能生效。
而magento(很多mvc 框架都是)是通过router形式运行的。我大致测试了一下设定支付目录就是 controller下的一个方法,支付没有成功,也可能我编写的有不对的地方,总之没有继续深究,而是干脆把支付放到了magento 根目录下的自定义目录下,例如是wxp目录。
这时候要做的操作就是微信支付所需要的参数 以get形式传递给相应的支付发起文件就可以了。(get形式就可以了,看了应该下没有什么需要保密的内容,有建议欢迎指出。)
例如 jsapi方式那么直接创建文件 jsapi.php
部分代码:

<?php
$jsApiParameters=$_GET['jsApiParameters']
?>

然后将参数传给 js 就可以了
同理 native.php
最后就是 编写 notify 函数,我设定的notify都是通知给 PaymentController.php中的notifyAction()方法
部分代码:

$notify = new PayNotifyCallBack();
$resCheck = $notify->Handle(false);
if($resCheck){
// 验证签名等成功
$xmlBackData = $GLOBALS['HTTP_RAW_POST_DATA'];
$array_data = json_decode(json_encode(simplexml_load_string($xmlBackData, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
$out_trade_no = $array_data['out_trade_no'];
$model = Mage::getModel('wxpay/payment');
$order = Mage::getModel('sales/order')->loadByIncrementId($out_trade_no);
// 获取到了order 那么此时就可以对这个order 做状态更改了

大致思路就是这样,这是第一次使用CSDN 的MarkDown 编辑器编写的使用起来还不错 ╭(′▽`)╯
转载请注明出处:http://blog.csdn.net/m0sh1/article/details/45449679

 

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Magento 微信支付

 

Magento 使用手机号注册登录

Magento 默认使用邮箱注册登录,国内目前许多用户并没有使用邮箱的习惯,所以需要使用手机号来实现注册。
使用手机号注册,需要关联的地方比较多而杂,这里只说个大概以及思路。
手机注册涉及到的修改包括:
1.添加手机号字段
2.注册流程
3.登录流程
4.忘记密码,通过手机号重置密码
5.后台用户表(grid表)显示手机号信息
6.未登录用户在结账页面的注册和登录流程
7.用户信息修改页面
8.许多自己添加的功能和用户手机号相关联的,这就需要自己修改了


1.添加手机号字段
可以自行搜索为用户添加一个新的属性的方法,也可以安装管理用户属性的插件,后台直接添加,这里就不多说了。

2.注册流程
注册页面可以添加个 tab 切换使用邮箱注册还是使用手机号注册,也可以新添加一个链接跳转到的是使用手机号注册。这里使用后者举例:
默认注册页面的 handle 是
customer_account_create 在 customer.xml 中定义了它的layout等
我们可以根据它修改自己的handle例如是
customer_account_createmobile
重写Customer的controller 并创建action

    public function createmobileAction()
    {
        if ($this->_getSession()->isLoggedIn()) {
            $this->_redirect('*/*');
            return;
        }

        $this->loadLayout();
        $this->_initLayoutMessages('customer/session');
        $this->renderLayout();
    }

新建自己的 register_mobile.phtml
注意这里的 form action 可以写一个新的 action url
在这个 phtml 中重要的地方就是 发送短信 按钮设置 onclick事件。
使用 ajax 实现发送短信,记录session等操作。(注意设置发送短信按钮,点击的时间间隔)
发送ajax请求,系统生成随机的验证码存入session, 我这里同时存入了手机号
还有一点,就是magento邮箱字段不可为空(否则修改的太多,没尝试过 - -!),所以这里还需要隐藏一个input用来存放假的 email (系统自动生成)
又来一点:
注意检测手机号是否已经注册过了。

$session = $this->_getSession();
// 我是写在了customer的 accountController类中
// 获取session你也可以写为
// $session = Mage::getSingleton('customer/session');
$session->setMobile($mobile);
$session->setMobileCode($mobile_code);

存入手机号,是为了用户点击注册按钮时,检测提交的手机号是否还是用来获取验证码那个手机号,防止用户篡改手机号。
注意存入session等操作应等到调用 短信接口返回 成功时候执行。
这个时候用户注册例如post数据到 createmobilePostAction()
我们就可以在这里做数据有效性检验,包括手机号格式,手机号是否被修改,验证码是否正确等操作。都正确 保存手机号即可。

3.登录流程
前端直接去掉对于输入的是否是邮箱的检验,修改 placeholder属性提示手机号也可以即可。
数据post到 方法 loginPostAction()
这里大致核心代码为:

 $userName = trim($login['username']);
 if(!strstr($userName,'@') && strlen($userName) == 11){
 // 不是邮箱 长度为11 则为手机号 粗略的检测,可自行修改
 $mobileNu = Mage::getModel('customer/customer')->getCollection()
            ->addAttributeToFilter('mobile', $userName)
            ->getFirstItem();
 if($mobileNu->getData('email')){
    $login['username'] = $mobileNu->getData('email');
  }
 }

思路其实就是根据手机号先找到邮箱,再使用邮箱登陆。

4.忘记密码,通过手机号重置密码
忘记密码页面也是可以让用户选择是通过邮箱重置密码或者 通过手机号重置密码。
通过手机号重置密码流程是:
输入手机号 -> 获取验证码 -> 输入验证码提交数据 -> 判断验证码是否正确,是否存在使用这个手机号注册的用户 -> 一切正常,自动跳转到重置密码页面 -> 重置密码 -> 结束

重置密码前端页面需要注意的地方可以参考注册流程前端页面,根据需要修改即可。 例如post 数据到 forgotPasswordMobilePostAction()
在这个方法中,需要检测数据有效性等,一切正常生成token,然后跳转即可
核心代码:

if ($customerId) {
    try {
        $newResetPasswordLinkToken = Mage::helper('customer')->generateResetPasswordLinkToken();
        $customer->changeResetPasswordLinkToken($newResetPasswordLinkToken);
        $url = Mage::getUrl('').'customer/account/resetpassword?id='.$customerId.'&token='.$newResetPasswordLinkToken;
        Mage::app()->getFrontController()->getResponse()->setRedirect($url);
        return;
    } catch (Exception $exception) {
        Mage::log('catch');
        $this->_getSession()->addError($exception->getMessage());
        $this->_redirect('*/*/forgotpassword');
        return;
    }
}

5.后台用户表(grid表)显示手机号信息
为后台显示用户信息的表添加手机号显示字段
重写MageAdminhtmlBlockCustomerGrid.php
修改方法 _prepareCollection()
在 $collection后面添加

->addAttributeToSelect('mobile')

修改方法 _prepareColumns()
在合适位置添加代码:

$this->addColumn('mobile', array(
            'header'    => Mage::helper('customer')->__('手机号'),
            'index'     => 'mobile',
            'width'     => '10'
        ));

6.未登录用户在结账页面的注册和登录流程
修改 templatepersistentcustomerformlogin.phtml即可
参考用户登录页面前端修改。

7.用户信息修改页面
修改 templatecustomerformedit.phtml
为用户添加修改手机号的输入框即可,也需要获取短信验证码。
在controller 中修改editPostAction() 方法即可
注意检测手机号是否已经注册过了。

8.许多自己添加的功能和用户手机号相关联的,这就需要自己修改了
无能为力了,自己考虑修改吧。

 

此文章通过 python 爬虫创建,原文是自己的csdn 地址: Magento 使用手机号注册登录