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 使用手机号注册登录