Change Order Status after create invoice

本文介绍如何在Magento中通过监听特定事件来更新订单状态。当使用Paypal标准支付方式提交发票时,采用配置XML定义事件监听器,并在Model/Observer.php中实现订单状态变更的方法。

1.在模块的config.xml中定义触发事件:

 <events>
	  <sales_order_invoice_save_commit_after> <!-- identifier of the event we want to catch -->
        <observers>
          <sales_order_invoice_save_commit_after_handler> <!-- identifier of the event handler -->
            <type>model</type> <!-- class method call type; valid are model, object and singleton -->
            <class>mysales/observer</class> <!-- observers class alias -->
            <method>changeOrderStatus</method>  <!-- observer's method to be called -->
            <args></args> <!-- additional arguments passed to observer -->
          </sales_order_invoice_save_commit_after_handler>
        </observers>
      </sales_order_invoice_save_commit_after>
  </events>

 2.在Model/Observer.php中定义方法

<?php
class Bysoft_Mysales_Model_Observer
{

			public function changeOrderStatus(Varien_Event_Observer $observer)
			{
				$event = $observer->getEvent();
				$invoice = $observer->getEvent()->getInvoice();
				
				$order_update = $invoice->getOrder();
				$order = Mage::getModel('sales/order')->loadByIncrementId($order_update->getIncrementId());
				$state = 'processing';
				$status = 'paid';
				$comment = 'Changing state to Processing and status to paid Status';
				
				$isCustomerNotified = false;
				$order->setState($state, $status, $comment, $isCustomerNotified);
				$order->save();
			}
		
}

 用Paypal standand 支付方式的时候遇到提交一个发票不更改订单状态的问题。可以用以上方法解决。

 

<think>我们再次遇到 Druid 报告的 SQL 注入违规和语法错误。本次错误信息如下: - **错误类型**:`sql injection violation`(SQL注入违规)和 `syntax error`(语法错误) - **数据库类型**:MySQL - **Druid版本**:1.2.8 - **具体语法错误**:`expect EQ, actual IDENTIFIER`(期待等号,实际得到标识符) - **位置**:第6行,第22列(位置127),令牌为`order_status` - **SQL语句开头**:`update invoice_order` ### 错误分析 1. **语法错误原因**: - 错误信息指出在`update`语句中,Druid解析器在位置127(第6行第22列)处遇到了一个标识符(`order_status`),但它期望的是一个等号(`=`)。 - 这通常意味着在设置更新字段时,字段名和值之间缺少等号。例如: ```sql -- 错误示例(缺少等号) UPDATE invoice_order order_status = 'completed' -- 这里应该是 set order_status = 'completed' WHERE ...; ``` 或者 ```sql -- 错误示例(set子句后直接跟字段名,缺少等号) UPDATE invoice_order SET order_status -- 这里缺少等号,应该是 SET order_status = ... ``` 正确的写法必须有`SET`关键字,且每个赋值语句为`字段名=值`。 2. **SQL注入违规**: - 虽然语法错误可能是根本原因,但Druid同时报告了SQL注入违规。这可能是因为: - 语法错误导致Druid无法正确解析后续内容,将某些部分误认为注入。 - 使用了动态SQL(如MyBatis中`${}`拼接)且未过滤输入,触发了Druid的防护机制。 ### 解决方案 1. **检查UPDATE语句的语法**: - 确保语句中包含`SET`关键字,且每个更新项都是`字段名=值`的格式。 - 检查第6行第22列附近(即`order_status`周围)是否有遗漏的等号或逗号。 2. **检查动态SQL拼接**: - 如果使用了MyBatis,避免使用`${}`直接拼接变量(尤其是用户输入)。优先使用`#{}`进行参数化。 - 如果必须使用`${}`(如动态字段名),需在Java层进行严格的白名单校验。 3. **升级Druid版本**: - Druid 1.2.8版本较旧,可能存在误报。建议升级到最新稳定版(如1.2.16+): ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> </dependency> ``` 4. **查看完整SQL日志**: - 通过MyBatis日志或Druid监控台输出实际执行的SQL,定位具体错误位置: ```properties # 开启MyBatis日志 logging.level.org.mybatis=DEBUG ``` ### 示例修正 假设原更新语句(MyBatis XML)如下: ```xml <update id="updateOrder" parameterType="..."> UPDATE invoice_order <set> order_status #{orderStatus}, <!-- 错误:缺少等号 --> update_time = #{updateTime} </set> WHERE ... </update> ``` 修正后: ```xml <update id="updateOrder" parameterType="..."> UPDATE invoice_order <set> order_status = #{orderStatus}, <!-- 添加等号 --> update_time = #{updateTime} </set> WHERE ... </update> ``` §§相关问题§§ 1. 在MySQL的UPDATE语句中,SET子句的正确语法结构是什么? 2. 如何避免在动态SQL拼接时触发Druid的SQL注入告警? 3. MyBatis中`<set>`标签的作用是什么?使用时有哪些注意事项? 4. 除了升级Druid,还有哪些方法可以解决SQL注入误报问题? 5. 如何配置Druid以记录实际执行的SQL语句? </think>这个错误是 Druid (1.2.8 版本) 在 MySQL 环境下报告的 SQL 注入违规和语法错误组合。具体分析如下: ### 错误原因解析 1. **语法错误核心问题** - `expect EQ, actual IDENTIFIER`:表示 SQL 解析器期望看到等号(`=`),但实际遇到了标识符(这里是 `order_status`) - 位置:第6行第22列 (位置127),在 `update invoice_order` 语句中 - **典型场景**:在 UPDATE 语句中缺少必要的 `SET` 关键字或等号 ```sql -- 错误示例(缺少SET): UPDATE invoice_order order_status = 'paid' WHERE ... ❌ -- 正确写法: UPDATE invoice_order SET order_status = 'paid' WHERE ... ✅ ``` 2. **SQL 注入违规触发** - Druid 误将语法错误识别为注入尝试(常见于低版本) - 特别是当动态 SQL 中包含变量时(如 MyBatis 的 `${}` 或 `#{}`),旧版 Druid 可能错误触发防护 3. **位置分析** `pos 127, line 6, column 22` 暗示问题可能出现在: - UPDATE 后直接跟字段名(缺少 `SET`) - 字段赋值时缺少等号(如 `order_status 'paid'`) --- ### 解决方案 1. **修复 SQL 语法** ```sql -- 确保包含 SET 关键字和等号 UPDATE invoice_order SET order_status = #{value} -- MyBatis 参数写法 WHERE ... ``` 2. **检查 MyBatis 映射文件** ```xml <update id="updateOrder"> UPDATE invoice_order SET <!-- 检查每个字段赋值是否都有等号 --> order_status = #{status}, <!-- 正确 --> amount = #{amount} <!-- 正确 --> WHERE ... </update> ``` 3. **升级 Druid (关键修复)** ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.16</version> <!-- 修复误报问题 --> </dependency> ``` 4. **添加 Druid 白名单规则** 在 `application.properties` 中: ```properties # 允许 UPDATE 语句格式 spring.datasource.druid.filter.wall.update-allow=true # 禁用部分严格检查 spring.datasource.druid.filter.wall.config.multi-statement-allow=true ``` --- ### 预防措施 - 使用 MyBatis 时避免混用 `${}` 和 `#{}` - 启用 SQL 日志验证实际执行语句: ```properties logging.level.org.mybatis=DEBUG ``` - 对动态字段名使用白名单校验(而非直接拼接)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值