package com.jeecms.cms.action.front;
import static com.jeecms.core.manager.AuthenticationMng.AUTH_KEY;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;
import org.dom4j.DocumentException;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import sun.misc.BASE64Decoder;
import beartool.MD5;
import com.alipay.config.AlipayConfig;
import com.alipay.util.AlipayCore;
import com.alipay.util.AlipayNotify;
import com.alipay.util.AlipaySubmit;
import com.jeecms.cms.entity.main.AgentSet;
import com.jeecms.cms.entity.main.CmsSite;
import com.jeecms.cms.entity.main.CmsUser;
import com.jeecms.cms.entity.main.JcOrg;
import com.jeecms.cms.entity.main.Order;
import com.jeecms.cms.entity.main.OrderExt;
import com.jeecms.cms.entity.main.Product;
import com.jeecms.cms.entity.main.ProductCategory;
import com.jeecms.cms.manager.main.AgentSetMng;
import com.jeecms.cms.manager.main.CmsLogMng;
import com.jeecms.cms.manager.main.CmsUserMng;
import com.jeecms.cms.manager.main.JcOrgMng;
import com.jeecms.cms.manager.main.OrderExtMng;
import com.jeecms.cms.manager.main.OrderMng;
import com.jeecms.cms.manager.main.ProductCategoryMng;
import com.jeecms.cms.manager.main.ProductMng;
import com.jeecms.cms.web.CmsUtils;
import com.jeecms.cms.web.FrontUtils;
import com.jeecms.cms.web.WebErrors;
import com.jeecms.common.util.AplipayInfoRW;
import com.jeecms.common.util.MD5Utils;
import com.jeecms.common.util.RandomUtil;
import com.jeecms.common.util.ReadMessagerUtils;
import com.jeecms.common.util.RequestUtil;
import com.jeecms.common.util.SetMailInfoUtils;
import com.jeecms.common.util.ipspay.IpsSubmit;
import com.jeecms.common.web.RequestUtils;
import com.jeecms.common.web.ResponseUtils;
import com.jeecms.common.web.session.SessionProvider;
import com.jeecms.core.entity.Authentication;
import com.jeecms.core.entity.UnifiedUser;
import com.jeecms.core.manager.AuthenticationMng;
import com.jeecms.core.manager.UnifiedUserMng;
import com.jeecms.mail.MailSenderInfo;
import com.jeecms.mail.SimpleMailSender;
import com.octo.captcha.service.CaptchaServiceException;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.yeepay.Configuration;
import com.yeepay.PaymentForOnlineService;
@Controller
public class OrderAct {
private static final Logger log = LoggerFactory.getLogger(OrderAct.class);
public static final String PLACE_ORDER = "tpl.placeOrder";
public static final String ORDER_INFO = "tpl.orderInfo";
public static final String SEARCH_ORDER = "tpl.searchOrder";
public static final String CONFIRM_ORDER = "tpl.confirmOrder";
public static final String DOSELF_ORDER = "tpl.doself";
public static final String DOSELF_RESULT = "tpl.doselfResult";
public static final String ALIPAY_SUBMIT = "tpl.alipaySubmit";
public static final String YEEPAY_SUBMIT = "tpl.yeepaySubmit";
public static final String CHINA_SUBMIT = "tpl.chinaBankSubmit";
public static final String TRANSACTION_RESULT = "tpl.paySucessReturn";
public static final String SAVECLOUD_SUBMIT = "tpl.alipaySaveCloudSubmit";
//edit by bin 2015.2.27
public static String orderCodeTemp="5fd";
/**
* 下单(进入产品详情)
*
* @param id
* @param request
* @param model
* @return
*/
@RequestMapping("/order/v_place.jspx")
public String getProduct(Integer id, HttpServletRequest request,
ModelMap model) {
StringBuffer p = request.getRequestURL();
int endp = p.length() - "order/v_place.jspx".length();
String path = p.toString().substring(0, endp);
// System.out.println(new Date() + "--当前请求域名为:" + path);
List<JcOrg> jcOrgs = orgMng.getJcOrgList();
if (null != jcOrgs && jcOrgs.size() > 0) {
for (int i = 0; i < jcOrgs.size(); i++) {
if (path.equals(jcOrgs.get(i).getOrg())) {
if (null != jcOrgs.get(i).getIsDisplay()
&& jcOrgs.get(i).getIsDisplay() == 1) {
String msg = "爱卡商城提醒您:我们不刷信誉不招兼职 请勿将卡密交给其他人 谨防被骗";
model.addAttribute("msg", msg);
}
}
}
}
Product product = productMng.findById(id);
if (null != product && null != product.getCategoryCode()) {
ProductCategory category = categoryMng
.getProductCategoryBycategoryCode(product.getCategoryCode());
model.addAttribute("category", category);
}
model.addAttribute("product", product);
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
PLACE_ORDER);
}
/**
* 订单查询
*
* @param captcha
* @param orderCode
* @param state
* @param request
* @param model
* @return
*/
@RequestMapping("/order/v_search.jspx")
public String getOrder(String captcha, String orderCode, String state,
HttpServletRequest request, ModelMap model) {
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
PLACE_ORDER);
}
/**
* 订单查询输入
*
* @param id
* @param request
* @param model
* @return
*/
@RequestMapping("/order/v_searchinput.jspx")
public String getOrderInput(Integer id, HttpServletRequest request,
ModelMap model) {
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
//
// StringBuffer p = request.getRequestURL();
// int endp = p.length()-"order/v_searchinput.jspx".length();
// String p2 = p.toString().substring(1, endp);
// System.out.println(p2);
// System.out.println(p);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
SEARCH_ORDER);
}
/**
* 自助服务输入
*
* @param id
* @param request
* @param model
* @return
*/
@RequestMapping("/order/v_doselfinput.jspx")
public String doSelfInput(Integer id, HttpServletRequest request,
ModelMap model) {
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
DOSELF_ORDER);
}
/**
* 自助服务结果
*
* @param id
* @param request
* @param model
* @return
*/
@RequestMapping("/order/v_doselfresult.jspx")
public String doSelfResult(Integer id, HttpServletRequest request,
ModelMap model) {
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
DOSELF_RESULT);
}
/**
* 下单
*
* @param productId
* @param orderCodeOld
* @param productCode
* @param productCount
* @param flag
* @param captcha
* @param response
* @param request
* @param model
* @return
*/
@SuppressWarnings("unused")
@RequestMapping(value = "/order/v_order.jspx", method = RequestMethod.POST)
public String addOrder(Integer productId, String orderCodeOld,
String productCode, Integer productCount, String flag,
String captcha, HttpServletResponse response,
HttpServletRequest request, ModelMap model) {
if (null != flag) {
WebErrors errors1 = validateCaptcha1(captcha, request, response);
if (errors1.hasErrors()) {
return FrontUtils.showError(request, response, model, errors1);
}
}
StringBuffer p = request.getRequestURL();
int endp = p.length() - "order/v_order.jspx".length();
String path = p.toString().substring(0, endp);
// System.out.println(new Date() + "--当前请求域名为:" + path);
List<JcOrg> jcOrgs = orgMng.getJcOrgList();
if (null != jcOrgs && jcOrgs.size() > 0) {
for (int i = 0; i < jcOrgs.size(); i++) {
if (path.equals(jcOrgs.get(i).getOrg())) {
if (null != jcOrgs.get(i).getIsDisplay()
&& jcOrgs.get(i).getIsDisplay() == 1) {
String msg = "爱卡商城提醒您:我们不刷信誉不招兼职 请勿将卡密交给其他人 谨防被骗";
model.addAttribute("msg", msg);
}
}
}
}
String receiverEmail = RequestUtils.getQueryParam(request,
"receiverEmail");
// if(null!=receiverEmail&&!"".equals(receiverEmail))
String receiverNickName = RequestUtils.getQueryParam(request,
"receiverNickName");
String ip = RequestUtils.getIpAddr(request);
Product product = null;
if (null == orderCodeOld) {// 是否下过单(用于继续交易和重新下单的区别)
product = productMng.findById(productId);
String searchKey = RequestUtils.getQueryParam(request, "searchKey");
String authId = (String) session.getAttribute(request, AUTH_KEY);
WebErrors errors = validateSubmit(receiverEmail, searchKey,
request, response);
if (errors.hasErrors()) {
return FrontUtils.showError(request, response, model, errors);
}
// SimpleDateFormat dateFormat = new
// SimpleDateFormat("yyyyMMddhhmmss");
// dateFormat.format(new java.util.Date());
// 下单日期
// java.sql.Timestamp date=new java.sql.Timestamp(new
// java.util.Date().getTime());
java.sql.Date date = new java.sql.Date(
new java.util.Date().getTime());
// 订单号生成
// int r1 = (int) (Math.random() * (10));// 产生3个0-9的随机数
// int r2 = (int) (Math.random() * (10));
// int r3 = (int) (Math.random() * (10));
String r1 = RandomUtil.getCharAndNumr(4);// 随机产生四个数
// long now = System.currentTimeMillis();// 一个13位的时间戳
String r2 = RandomUtil.getCharAndNumr(4);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");// 十四位时间
String now = dateFormat.format(new java.util.Date());
String orderCode = String.valueOf(r1) + String.valueOf(now)
+ String.valueOf(r2);// 订单号
Order order = new Order();
OrderExt ext = new OrderExt();
// 支付方式的值
String bank = request.getParameter("bank");
order.setChargeKey(bank);
if (authId != null) {// 是否是注册用户
// 存在认证ID
Authentication auth = authMng.retrieve(authId);
CmsUser user = cmsUserMng.findById(auth.getUid());
// 存在认证信息,且未过期
if (auth != null) {
order.setUserId(user.getId());
order.setUserName(user.getUsername());
ext.setPrice(product.getVipPrice());
} else {
order.setUserId(-1);
order.setUserName("普通客户");
ext.setPrice(product.getSalePrice());
}
} else {
order.setUserId(-1);
order.setUserName("普通客户");
ext.setPrice(product.getSalePrice());
}
order.setSum(ext.getPrice() * productCount);
if (ext.getPrice() < product.getPurchasePrice()) {// 保证不亏损
ext.setPrice(product.getPurchasePrice());
order.setSum(product.getPurchasePrice() * productCount);
log.info("提交订单时的单价大于进价,以进价为主", 0);
} else if (order.getSum() < product.getPurchasePrice()
* productCount) {
order.setSum(product.getPurchasePrice() * productCount);
}
order.setIp(ip);
order.setOrderCode(orderCode);
order.setOrdeDate(date);
order.setReceiverEmail(receiverEmail);
order.setReceiverNickName(receiverNickName);
if (null == order.getReceiverNickName()) {
order.setReceiverNickName(order.getOrderCode());
}
order.setSearchKey(searchKey);
order.setSendState(0);
order.setChargeType(0);
order.setStatus(0);
Order temp = orderMng.save(order);
ext.setOrderCode(orderCode);
ext.setCategoryCode(product.getCategoryCode());
ext.setProductCount(productCount);
ext.setProductName(product.getProductName());
ext.setOrderId(order.getOrderId());
ext.setProductCode(product.getProductCode());
if (null != temp) {// 是否下单成功并保存日志
ext.setOrderId(temp.getOrderId());
OrderExt ext2 = extMng.save(ext);
temp.setExt(ext2);
log.info("save Order id={}", temp.getOrderId());
if (null != ext2) {
log.info("save OrderExt id={}", ext2.getId());
} else {
Order temp2 = orderMng.deleteById(temp.getOrderId());
log.info("delete Order id={}", temp2.getOrderId());
}
cmsLogMng.orderLogSave(request, temp.getOrderCode(),
"order.log", "下订单成功:orderCode=" + temp.getOrderCode());
} else {
cmsLogMng.orderLogSave(request, null, "order.log",
"下订单失败,产品编号=" + productCode);
}
model.addAttribute("order", temp);
// if(isDelegate){
// String result = "orderCodeOld="+temp.getOrderCode();
// JSONObject json=new JSONObject();
// json.put("result", result);
// ResponseUtils.renderJson(response, json.toString());
// }
} else {
product = productMng.findByProductCode(productCode);
Order orderExit = orderMng.getOrderByCode(orderCodeOld);
if (null != orderExit) {
OrderExt ext = extMng.getOrderExtListByOrderId(
orderExit.getOrderId()).get(0);
orderExit.setExt(ext);
model.addAttribute("order", orderExit);
// if(isDelegate){
// String result = "orderCodeOld="+orderCodeOld;
// JSONObject json=new JSONObject();
// json.put("result", result);
// ResponseUtils.renderJson(response, json.toString());
// }
}
}
String dPay = request.getParameter("dPay");
model.addAttribute("dPay", dPay);
// List<CmsDictionary> banks = dictionaryMng.getList();
model.addAttribute("product", product);
// model.addAttribute("banks", banks);
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
CONFIRM_ORDER);
}
/**
* 邮箱和密码验证
*
* @param email
* @param password
* @param request
* @param response
* @return
*/
private WebErrors validateSubmit(String email, String password,
HttpServletRequest request, HttpServletResponse response) {
WebErrors errors = WebErrors.create(request);
if (errors.ifOutOfLength(password, "password", 4, 16)) {
return errors;
}
if (errors.ifNotEmail(email, "email", 100)) {
return errors;
}
return errors;
}
/**
* 代付(下单)
*
* @param productId
* @param orderCodeOld
* @param productCode
* @param productCount
* @param flag
* @param captcha
* @param response
* @param request
* @param model
* @return
*/
@SuppressWarnings("unused")
@RequestMapping(value = "/order/v_order_d_p.jspx", method = RequestMethod.GET)
public String addOrderDPay(Integer productId, String orderCodeOld,
String productCode, Integer productCount, String flag,
String captcha, HttpServletResponse response,
HttpServletRequest request, ModelMap model) {
StringBuffer p = request.getRequestURL();
int endp = p.length() - "order/v_order_d_p.jspx".length();
String path = p.toString().substring(0, endp);
// System.out.println(new Date() + "--当前请求域名为:" + path);
String dPay = request.getParameter("dPay");
model.addAttribute("dPay", dPay);
// 支付方式的值
String bank = request.getParameter("bank");
List<JcOrg> jcOrgs = orgMng.getJcOrgList();
if (null != jcOrgs && jcOrgs.size() > 0) {
for (int i = 0; i < jcOrgs.size(); i++) {
if (path.equals(jcOrgs.get(i).getOrg())) {
if (null != jcOrgs.get(i).getIsDisplay()
&& jcOrgs.get(i).getIsDisplay() == 1) {
String msg = "爱卡商城提醒您:我们不刷信誉不招兼职 请勿将卡密交给其他人 谨防被骗";
model.addAttribute("msg", msg);
}
}
}
}
String receiverEmail = RequestUtils.getQueryParam(request,
"receiverEmail");
String receiverNickName = RequestUtils.getQueryParam(request,
"receiverNickName");
// if (null == flag) {
// WebErrors errors = validateCaptcha(captcha, receiverEmail, request,
// response);
// if (errors.hasErrors()) {
// return FrontUtils.showError(request, response, model, errors);
// }
// }
String ip = RequestUtils.getIpAddr(request);
Product product = null;
if (null == orderCodeOld) {
product = productMng.findById(productId);
String searchKey = RequestUtils.getQueryParam(request, "searchKey");
String authId = (String) session.getAttribute(request, AUTH_KEY);
WebErrors errors = validateSubmit(receiverEmail, searchKey,
request, response);
if (errors.hasErrors()) {
return FrontUtils.showError(request, response, model, errors);
}
// SimpleDateFormat dateFormat = new
// SimpleDateFormat("yyyyMMddhhmmss");
// dateFormat.format(new java.util.Date());
// 下单日期
// java.sql.Timestamp date=new java.sql.Timestamp(new
// java.util.Date().getTime());
java.sql.Date date = new java.sql.Date(
new java.util.Date().getTime());
// 订单号生成
// int r1 = (int) (Math.random() * (10));// 产生3个0-9的随机数
// int r2 = (int) (Math.random() * (10));
// int r3 = (int) (Math.random() * (10));
String r1 = RandomUtil.getCharAndNumr(4);// 产生一个四位数
// long now = System.currentTimeMillis();// 一个13位的时间戳
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss");// 一个14位时间
String now = dateFormat.format(new java.util.Date());
String orderCode = "w" + String.valueOf(r1) + String.valueOf(now);// 订单号
Order order = new Order();
OrderExt ext = new OrderExt();
order.setChargeKey(bank);
if (authId != null) {
// 存在认证ID
Authentication auth = authMng.retrieve(authId);
CmsUser user = cmsUserMng.findById(auth.getUid());
// 存在认证信息,且未过期
if (auth != null) {
order.setUserId(user.getId());
order.setUserName(user.getUsername());
ext.setPrice(product.getVipPrice());
} else {
order.setUserId(-1);
order.setUserName("普通客户");
ext.setPrice(product.getSalePrice());
}
} else {
order.setUserId(-1);
order.setUserName("普通客户");
ext.setPrice(product.getSalePrice());
}
order.setSum(ext.getPrice() * productCount);
if (ext.getPrice() < product.getPurchasePrice()) {
ext.setPrice(product.getPurchasePrice());
order.setSum(product.getPurchasePrice() * productCount);
log.info("提交订单时的单价大于进价,以进价为主", 0);
} else if (order.getSum() < product.getPurchasePrice()
* productCount) {
order.setSum(product.getPurchasePrice() * productCount);
}
order.setIp(ip);
order.setOrderCode(orderCode);
order.setOrdeDate(date);
order.setReceiverEmail(receiverEmail);
order.setReceiverNickName(receiverNickName);
if (null == order.getReceiverNickName()) {
order.setReceiverNickName(order.getOrderCode());
}
order.setSearchKey(searchKey);
order.setSendState(0);
order.setChargeType(0);
order.setStatus(0);
Order temp = orderMng.save(order);
ext.setOrderCode(orderCode);
ext.setCategoryCode(product.getCategoryCode());
ext.setProductCount(productCount);
ext.setProductName(product.getProductName());
ext.setOrderId(order.getOrderId());
ext.setProductCode(product.getProductCode());
if (null != temp) {
ext.setOrderId(temp.getOrderId());
OrderExt ext2 = extMng.save(ext);
temp.setExt(ext2);
log.info("save Order id={}", temp.getOrderId());
if (null != ext2) {
log.info("save OrderExt id={}", ext2.getId());
} else {
Order temp2 = orderMng.deleteById(temp.getOrderId());
log.info("delete Order id={}", temp2.getOrderId());
}
cmsLogMng.orderLogSave(request, temp.getOrderCode(),
"order.log", "下订单成功:orderCode=" + temp.getOrderCode());
} else {
cmsLogMng.orderLogSave(request, null, "order.log",
"下订单失败,产品编号=" + productCode);
}
model.addAttribute("order", temp);
// if(isDelegate){
// String result = "orderCodeOld="+temp.getOrderCode();
// JSONObject json=new JSONObject();
// json.put("result", result);
// ResponseUtils.renderJson(response, json.toString());
// }
} else {
// product = productMng.findByProductCode(productCode);
Order orderExit = orderMng.getOrderByCode(orderCodeOld);
if (null != orderExit) {
OrderExt ext = extMng.getOrderExtListByOrderId(
orderExit.getOrderId()).get(0);
orderExit.setExt(ext);
model.addAttribute("order", orderExit);
product = productMng.findByProductCode(ext.getProductCode());
// if(isDelegate){
// String result = "orderCodeOld="+orderCodeOld;
// JSONObject json=new JSONObject();
// json.put("result", result);
// ResponseUtils.renderJson(response, json.toString());
// }
}
}
// List<CmsDictionary> banks = dictionaryMng.getList();
model.addAttribute("product", product);
// model.addAttribute("banks", banks);
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
CONFIRM_ORDER);
}
/**
* 代付下单(获取产品详情)
*
* @param productId
* @param orderCodeOld
* @param productCode
* @param productCount
* @param flag
* @param captcha
* @param response
* @param isDelegate
* @param request
* @param model
* @throws JSONException
*/
@SuppressWarnings("unused")
@RequestMapping(value = "/order/v_order_d.jspx", method = RequestMethod.POST)
public void addOrderD(Integer productId, String orderCodeOld,
String productCode, Integer productCount, String flag,
String captcha, HttpServletResponse response, boolean isDelegate,
HttpServletRequest request, ModelMap model) throws JSONException {
StringBuffer p = request.getRequestURL();
int endp = p.length() - "v_order_d.jspx".length();
String path = p.toString().substring(0, endp);
// System.out.println(path);
List<JcOrg> jcOrgs = orgMng.getJcOrgList();
captcha = request.getParameter("captcha");
if (null != jcOrgs && jcOrgs.size() > 0) {
for (int i = 0; i < jcOrgs.size(); i++) {
if (path.equals(jcOrgs.get(i).getOrg())) {
if (null != jcOrgs.get(i).getIsDisplay()
&& jcOrgs.get(i).getIsDisplay() == 1) {
String msg = "爱卡商城提醒您:我们不刷信誉不招兼职 请勿将卡密交给其他人 谨防被骗";
model.addAttribute("msg", msg);
}
}
}
}
String receiverEmail = RequestUtils.getQueryParam(request,
"receiverEmail");
String receiverNickName = RequestUtils.getQueryParam(request,
"receiverNickName");
String ip = RequestUtils.getIpAddr(request);
// WebErrors errors = validateCaptcha(captcha, receiverEmail, request,
// response);
// if (errors.hasErrors()) {
// // String result = FrontUtils.showError(request, response, model,
// // errors);
// String result = errors.getErrors().get(0);
// JSONObject json = new JSONObject();
// json.put("status", 0);
// json.put("result", result);
// ResponseUtils.renderJson(response, json.toString());
// } else {
Product product = null;
if (null == orderCodeOld) {
product = productMng.findById(productId);
String searchKey = RequestUtils.getQueryParam(request, "searchKey");
WebErrors errors1 = validateSubmit(receiverEmail, searchKey,
request, response);
if (errors1.hasErrors()) {
// String result = FrontUtils.showError(request, response,
// model, errors1);
String result = errors1.getErrors().get(0);
JSONObject json = new JSONObject();
json.put("status", 0);
json.put("result", result);
ResponseUtils.renderJson(response, json.toString());
} else {
String authId = (String) session
.getAttribute(request, AUTH_KEY);
java.sql.Date date = new java.sql.Date(
new java.util.Date().getTime());
// 订单号生成
// int r1 = (int) (Math.random() * (10));// 产生3个0-9的随机数
// int r2 = (int) (Math.random() * (10));
// int r3 = (int) (Math.random() * (10));
String r1 = RandomUtil.getCharAndNumr(4);// 产生一个四位数
// long now = System.currentTimeMillis();// 一个13位的时间戳
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyyMMddhhmmss");// 一个14位时间
String now = dateFormat.format(new java.util.Date());
String orderCode = "w" + String.valueOf(r1)
+ String.valueOf(now);// 订单号
Order order = new Order();
OrderExt ext = new OrderExt();
// 支付方式的值
String bank = request.getParameter("bank");
order.setChargeKey(bank);
if (authId != null) {
// 存在认证ID
Authentication auth = authMng.retrieve(authId);
CmsUser user = cmsUserMng.findById(auth.getUid());
// 存在认证信息,且未过期
if (auth != null) {
order.setUserId(user.getId());
order.setUserName(user.getUsername());
ext.setPrice(product.getVipPrice());
} else {
order.setUserId(-1);
order.setUserName("普通客户");
ext.setPrice(product.getSalePrice());
}
} else {
order.setUserId(-1);
order.setUserName("普通客户");
ext.setPrice(product.getSalePrice());
}
order.setSum(ext.getPrice() * productCount);
if (ext.getPrice() < product.getPurchasePrice()) {
ext.setPrice(product.getPurchasePrice());
order.setSum(product.getPurchasePrice() * productCount);
log.info("提交订单时的单价大于进价,以进价为主", 0);
} else if (order.getSum() < product.getPurchasePrice()
* productCount) {
order.setSum(product.getPurchasePrice() * productCount);
}
order.setIp(ip);
order.setOrderCode(orderCode);
order.setOrdeDate(date);
order.setReceiverEmail(receiverEmail);
order.setReceiverNickName(receiverNickName);
if (null == order.getReceiverNickName()) {
order.setReceiverNickName(order.getOrderCode());
}
order.setSearchKey(searchKey);
order.setSendState(0);
order.setChargeType(0);
order.setStatus(0);
Order temp = orderMng.save(order);
ext.setOrderCode(orderCode);
ext.setCategoryCode(product.getCategoryCode());
ext.setProductCount(productCount);
ext.setProductName(product.getProductName());
ext.setOrderId(order.getOrderId());
ext.setProductCode(product.getProductCode());
if (null != temp) {
ext.setOrderId(temp.getOrderId());
OrderExt ext2 = extMng.save(ext);
temp.setExt(ext2);
log.info("save Order id={}", temp.getOrderId());
if (null != ext2) {
log.info("save OrderExt id={}", ext2.getId());
} else {
Order temp2 = orderMng.deleteById(temp.getOrderId());
log.info("delete Order id={}", temp2.getOrderId());
}
cmsLogMng.orderLogSave(request, temp.getOrderCode(),
"order.log",
"下订单成功:orderCode=" + temp.getOrderCode());
} else {
cmsLogMng.orderLogSave(request, null, "order.log",
"下订单失败,产品编号=" + productCode);
}
model.addAttribute("order", temp);
if (isDelegate) {
String result = "orderCodeOld=" + temp.getOrderCode();
JSONObject json = new JSONObject();
json.put("status", 1);
json.put("result", result);
ResponseUtils.renderJson(response, json.toString());
}
}
} else {
product = productMng.findByProductCode(productCode);
Order orderExit = orderMng.getOrderByCode(orderCodeOld);
if (null != orderExit) {
OrderExt ext = extMng.getOrderExtListByOrderId(
orderExit.getOrderId()).get(0);
orderExit.setExt(ext);
model.addAttribute("order", orderExit);
if (isDelegate) {
String result = "orderCodeOld=" + orderCodeOld;
JSONObject json = new JSONObject();
json.put("status", 1);
json.put("result", result);
ResponseUtils.renderJson(response, json.toString());
}
}
}
// }
// List<CmsDictionary> banks = dictionaryMng.getList();
// model.addAttribute("product", product);
}
// 订单信息查询
@RequestMapping(value = "/order/v_orderInfo.jspx", method = RequestMethod.POST)
public String searchOrder(String orderCode, String search_key,
HttpServletRequest request, String captcha,
HttpServletResponse response, ModelMap model) {
if (!(orderCode == null || "".equals(orderCode))
&& !(search_key == null || "".equals(search_key))) {
WebErrors errors = validateCaptcha1(captcha, request, response);
if (errors.hasErrors()) {
return FrontUtils.showError(request, response, model, errors);
}
// add by chenyan 20140512 去除前后空格
orderCode = StringUtils.strip(orderCode);
Order order = orderMng.getOrderByCode(orderCode);
if (order == null) {
model.addAttribute("msg", "您输入的订单号和查询密码不正确或不匹配!请重新输入!");
} else {
// 判断密码是否正确, add by chenyan 20140512
if (null != order.getSearchKey()
&& order.getSearchKey().equals(search_key)) {
if (null != order.getCardkey()) {
String carKey = order.getCardkey();
List<Map<Integer, String>> keyList = new ArrayList<Map<Integer, String>>();
if (null != carKey) {
String contentStart = " <table style='width: 470px;' align='left'> <tr >"
+ " <td style='background-color:#CCC'>卡号</td>"
+ " <td style='background-color:#CCC'>密码</td>"
+ " <td style='background-color:#CCC'>过期时间</td>"
+ " </tr> ";
keyList = ReadMessagerUtils.ReadCarKey(carKey);
BASE64Decoder decoder = new BASE64Decoder();
try {
if (null != keyList && keyList.size() > 0) {
for (Map<Integer, String> map2 : keyList) {
String cardno = "";
String cardpsw = "";
if (null != map2.get(0)
&& !"".equals(map2.get(0))) {
cardno = new String(
decoder.decodeBuffer(map2
.get(0)));
}
if (null != map2.get(1)
&& !"".equals(map2.get(1))) {
cardpsw = new String(
decoder.decodeBuffer(map2
.get(1)));
}
String contentKey = " <tr>"
+ " <td style='background-color:#eee'>"
+ cardno
+ "</td>"
+ " <td style='background-color:#eee'>"
+ cardpsw
+ "</td>"
+ " <td style='background-color:#eee'>"
+ map2.get(2) + "</td> "
+ " </tr>";
contentStart = contentStart
+ contentKey;
}
String contentEnd = " </table></br></br>";
contentStart = contentStart + contentEnd;
model.addAttribute("carKey", contentStart);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
OrderExt orderExt = extMng.getOrderExtById(orderCode);
model.addAttribute("order", order);
model.addAttribute("orderExt", orderExt);
} else {
model.addAttribute("msg", "您输入的查询密码不正确!请重新输入!");
}
}
} else {
model.addAttribute("msg", "您输入的订单号和查询密码不能为空!请输入!");
}
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
SEARCH_ORDER);
}
// 自助服务订单状态查询
@RequestMapping(value = "/order/v_orderState.jspx", method = RequestMethod.POST)
public String stateOrder(String orderCode, String querytype,
String searchKey, HttpServletRequest request, String captcha,
HttpServletResponse response, ModelMap model) {
WebErrors errors = validateCaptcha1(captcha, request, response);
if (errors.hasErrors()) {
return FrontUtils.showError(request, response, model, errors);
}
// add by chenyan 20140512 去除前后空格
orderCode = StringUtils.strip(orderCode);
Order order = orderMng.getOrderByCode(orderCode);
if (order == null) {
model.addAttribute("msg", "您输入的订单号不存在!请重新输入!");
} else {
if (null != order.getSearchKey()
&& order.getSearchKey().equals(searchKey)) {
// 排列卡密 (自助服务不要显示卡密)
/*
* if(null!=order.getCardkey()){ String carKey =
* order.getCardkey(); List<Map<Integer,String>> keyList = new
* ArrayList<Map<Integer,String>>(); if(null!=carKey){ String
* contentStart =
* " <table style='width: 470px;' align='left'> <tr >" +
* " <td style='background-color:#CCC'>卡号</td>" +
* " <td style='background-color:#CCC'>密码</td>" +
* " <td style='background-color:#CCC'>过期时间</td>" + " </tr> "
* ; keyList = ReadMessagerUtils.ReadCarKey(carKey);
* if(null!=keyList&&keyList.size()>0){ for (Map<Integer,
* String> map2 : keyList) { String contentKey =" <tr>" +
* " <td style='background-color:#eee'>"+map2.get(0)+"</td>" +
* " <td style='background-color:#eee'>"+map2.get(1)+"</td>" +
* " <td style='background-color:#eee'>"+map2.get(2)+"</td> " +
* " </tr>"; contentStart = contentStart + contentKey; } String
* contentEnd = " </table></br></br>"; contentStart =
* contentStart+contentEnd; model.addAttribute("carKey",
* contentStart); }
*
* } }
*/
orderCode = order.getOrderCode();
OrderExt ext = extMng.getOrderExtById(orderCode);
order.setExt(ext);
Integer status = order.getStatus();
if (null != querytype && "2".equals(querytype)) {
if (null != status && (status == 1 || status == 2))
return againSendEmail(order, null, request, null,
response, model);
else {
if (null == status || status == 0) {
model.addAttribute("msg", "邮件补发失败!返回信息:未支付!");
// OrderExt ext = extMng.getOrderExtById(orderCode);
// order.setExt(ext);
model.addAttribute("ext", ext);
model.addAttribute("order", order);
} else {
model.addAttribute("msg",
"邮件补发失败!返回信息:订单已失效!请重新下单!");
}
}
} else if (null != querytype && "1".equals(querytype)) {
if (null != status && status == 3) {
model.addAttribute("msg", "订单状态更换失败!返回信息:订单已失效!请重新下单!");
} else {
// OrderExt ext = extMng.getOrderExtById(orderCode);
// order.setExt(ext);
model.addAttribute("ext", ext);
model.addAttribute("order", order);
}
}
} else {
model.addAttribute("msg", "查询密码错误!!!");
}
}
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
DOSELF_RESULT);
}
/**
* 发送邮件
*
* @param order
* @param state
* @param request
* @param captcha
* @param response
* @param model
* @return
*/
private String againSendEmail(Order order, String state,
HttpServletRequest request, String captcha,
HttpServletResponse response, ModelMap model) {
if (null != order.getSendState() && order.getSendState() == 2) {
String msg = fetchCard(request, response, model, order);
if ("提卡失败".equals(msg)) {
model.addAttribute("msg", "发送失败!请先检查网络或联系客服!");
Order orderNew = orderMng.getOrderByCode(order.getOrderCode());
OrderExt ext = extMng.getOrderExtById(order.getOrderCode());
model.addAttribute("ext", ext);
model.addAttribute("order", orderNew);
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
log.info("提卡失败", 0);
return FrontUtils.getTplPath(request, site.getSolutionPath(),
"order", DOSELF_RESULT);
}
}
MailSenderInfo mailInfo = new MailSenderInfo();
List<AgentSet> list = agentSetMng.getAgentSetList();
SetMailInfoUtils.setMailMss(mailInfo, list);
mailInfo.setToAddress(order.getReceiverEmail()); // 要发送的邮箱地址
// 邮件内容
// mailInfo.setContent("你好!"); //文本格式的邮件内容
// html页面格式的邮件内容
// mailInfo.setContent("<div style='width:900px;height:900px;text-align:center;color:blue;font-size:20px;border:solid red;'><b>亲爱的"+order.getReceiverNickName()+"!</br>您在<a href='http://www.003511.com/'>爱卡点卡商城</a>有如下订单:您的订单号为:<a href='http://www.003511.com/order/v_searchinput.jspx'>"+order.getOrderCode()+"</a></br>您购买的点卡信息如下 (格式为:卡号1,卡密1,有效日期|卡号2,卡密2,有效期2):</b></br>"
// + order.getCardkey() + "</div>");
String contentStart = getMailContents(order);
mailInfo.setContent(contentStart);
// 这个类主要来发送邮件
SimpleMailSender sms = new SimpleMailSender();
// boolean flag = sms.sendTextMail(mailInfo);// 发送文体格式
boolean flag = sms.sendHtmlMail(mailInfo);// 发送html格式
if (flag) { // true则发送成功
if (null == order.getSendTime() || "".equals(order.getSendTime())) {
order.setSendTime(new java.sql.Date(new java.util.Date()
.getTime()));
}
order.setStatus(1); //订单状态变成已发货
order.setSendState(1); //发货状态变成已发货 add by bin 2015-2-27
orderMng.updateByUpdater(order);
String msg = "发送成功!请注意查收!";
model.addAttribute("msg", msg);
cmsLogMng.sendLogSave(request, order.getOrderCode(),
"order.log.sendSuccess",
"orderCode=" + order.getOrderCode() + ";receiverEmail="
+ order.getReceiverEmail() + ";信息:" + msg);
} else {
String msg = "发送失败!请先检查网络或联系客服!";
model.addAttribute("msg", msg);
cmsLogMng.sendLogSave(request, order.getOrderCode(),
"order.log.sendSuccess",
"orderCode=" + order.getOrderCode() + ";receiverEmail="
+ order.getReceiverEmail() + ";信息:" + msg);
}
Order orderNew = orderMng.getOrderByCode(order.getOrderCode());
OrderExt ext = extMng.getOrderExtById(order.getOrderCode());
model.addAttribute("ext", ext);
model.addAttribute("order", orderNew);
CmsSite site = CmsUtils.getSite(request);
FrontUtils.frontData(request, model, site);
FrontUtils.frontPageData(request, model);
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
DOSELF_RESULT);
}
/**
* 邮件内容
*
* @param order
* @return
*/
private String getMailContents(Order order) {
String contentStart = "<div>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>尊敬的"
+ order.getReceiverNickName()
+ "用户,您好!</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>感谢您对Q-Q点卡商城的支持,现将您从此次购买的产品信息发送到您的邮件给您!</h1>"
+ " </br>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>订单号:"
+ order.getOrderCode()
+ "</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>产品名称:"
+ order.getExt().getProductName()
+ "</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>产品数量:"
+ order.getExt().getProductCount()
+ "</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>订单总额:<span style='color:#F00;'>¥"
+ order.getSum()
+ "</span></h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>产品信息:</h1>"
+ " <table width='600'> <tr >"
+ " <td style='background-color:#CCC'>卡号</td>"
+ " <td style='background-color:#CCC'>密码</td>"
+ " <td style='background-color:#CCC'>过期时间</td>" + " </tr> ";
BASE64Decoder decoder = new BASE64Decoder();
try {
String carKey = order.getCardkey();
List<Map<Integer, String>> keyList = new ArrayList<Map<Integer, String>>();
if (null != carKey) {
keyList = ReadMessagerUtils.ReadCarKey(carKey);
if (null != keyList && keyList.size() > 0) {
for (Map<Integer, String> map2 : keyList) {
String cardno = "";
String cardpsw = "";
if (null != map2.get(0) && !"".equals(map2.get(0))) {
cardno = new String(decoder.decodeBuffer(map2
.get(0)));
}
if (null != map2.get(1) && !"".equals(map2.get(1))) {
cardpsw = new String(decoder.decodeBuffer(map2
.get(1)));
}
String contentKey = " <tr>"
+ " <td style='background-color:#eee'>"
+ cardno + "</td>"
+ " <td style='background-color:#eee'>"
+ cardpsw + "</td>"
+ " <td style='background-color:#eee'>"
+ map2.get(2) + "</td> " + " </tr>";
contentStart = contentStart + contentKey;
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String contentEnd = " </table></br></br>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'><strong>温馨提示:</strong>千万注意!不要将邮件信息购买的订单号等信息随便透露给任何人!!</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>本邮件由系统邮箱发送,请不要回复!!系统邮箱无人职守故对任何邮件都不作回复!!</h1>"
+ " </div>";
contentStart = contentStart + contentEnd;
return contentStart;
}
/**
* 页面显示卡密详情
*
* @param order
* @param request
* @return
*/
private String getMailContents1(Order order, HttpServletRequest request) {
String contentStart = "<div>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>尊敬的"
+ order.getReceiverNickName()
+ "用户,您好!</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>感谢您对Q-Q点卡商城的支持,现将您从此次购买的产品信息发送到您的邮件给您!</h1>"
+ " </br>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>订单号:"
+ order.getOrderCode()
+ "</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>产品名称:"
+ order.getExt().getProductName()
+ "</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>产品数量:"
+ order.getExt().getProductCount()
+ "</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>订单总额:<span style='color:#F00;'>¥"
+ order.getSum()
+ "</span></h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>产品信息:</h1>"
+ " <table width='600'> <tr >"
+ " <td style='background-color:#CCC'>卡号</td>"
+ " <td style='background-color:#CCC'>密码</td>"
+ " <td style='background-color:#CCC'>过期时间</td>" + " </tr> ";
BASE64Decoder decoder = new BASE64Decoder();
try {
String carKey = order.getCardkey();
List<Map<Integer, String>> keyList = new ArrayList<Map<Integer, String>>();
if (null != carKey) {
keyList = ReadMessagerUtils.ReadCarKey(carKey);
if (null != keyList && keyList.size() > 0) {
for (Map<Integer, String> map2 : keyList) {
String cardno = "";
String cardpsw = "";
if (null != map2.get(0) && !"".equals(map2.get(0))) {
cardno = new String(decoder.decodeBuffer(map2
.get(0)));
}
if (null != map2.get(1) && !"".equals(map2.get(1))) {
cardpsw = new String(decoder.decodeBuffer(map2
.get(1)));
}
String contentKey = " <tr>"
+ " <td style='background-color:#eee'>"
+ cardno + "</td>"
+ " <td style='background-color:#eee'>"
+ cardpsw + "</td>"
+ " <td style='background-color:#eee'>"
+ map2.get(2) + "</td> " + " </tr>";
contentStart = contentStart + contentKey;
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String contentEnd = " </table></br> </br>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'><strong>温馨提示:</strong>千万注意!不要将邮件信息购买的订单号等信息随便透露给任何人!!</h1>"
+ " <h1 style='font:13px Verdana, Geneva, sans-serif; color:#000'>本邮件由系统邮箱发送,请不要回复!!系统邮箱无人职守故对任何邮件都不作回复!!</h1>"
+ " </div>";
contentStart = contentStart + contentEnd;
return contentStart;
}
// 订单支付 需判断银行支付方式
@RequestMapping(value = "/order/v_orderPay.jspx", method = RequestMethod.POST)
public String orderPay(String bank, HttpServletRequest request,
String captcha, HttpServletResponse response, ModelMap model)
throws Exception {
// WebErrors errors = validateCaptcha1(captcha, request, response);
// if (errors.hasErrors()) {
// return FrontUtils.showError(request, response, model, errors);
// }
CmsSite site = CmsUtils.getSite(request);
String orderCode = request.getParameter("orderCode");
String productName = request.getParameter("productName");
// String sumStr = request.getParameter("sum");
Order orderPay = orderMng.getOrderByCode(orderCode);
// System.out.println("下单时实际金额:" + orderPay.getSum());
// System.out.println("下单旱提交金额:" + sumStr);
bank = orderPay.getChargeKey();
// 多加一个判断。防止总额被恶意改掉
if (null != orderPay) {
String sum = String.valueOf(orderPay.getSum());
if (null != bank) {
if (bank.equals("alipay")) {
//this.alipay(null, orderCode, productName, sum, request,
// response, model);
tianGuaTransport2alipay(orderCode, productName, sum, request,
response, model);
} else {
this.ipsPay(bank, orderCode, productName, sum, request,
response, model);
}
// else {
// this.alipay(bank, orderCode, productName, sum, request,
// response, model);
// }
}
}
// 支付类型
return FrontUtils.getTplPath(request, site.getSolutionPath(), "order",
ALIPAY_SUBMIT);
}
//-----------------------------------------------------------------------------
/**
* 建立请求,转账到支付宝
* @param sParaTemp 请求参数数组
* @param strMethod 提交方式。两个值可选:post、get
* @param strButtonName 确认按钮显示文字
* @return 提交表单HTML文本
*/
private String tianGuaBuildRequest(String receiver, String amount,
String title, String memo,
String strMethod, String strButtonName) {
StringBuffer sbHtml = new StringBuffer();
String transportUrl = "https://shenghuo.alipay.com/send/payment/fill.htm";
sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + transportUrl
+ "\" method=\"" + strMethod
+ "\">");
sbHtml.append("<input type=\"hidden\" name='optEmail' value=\"" + receiver + "\"/>");
sbHtml.append("<input type=\"hidden\" name='payAmount' value=\"" + amount + "\"/>");
sbHtml.append("<input type=\"hidden\" name='title' value=\"" + title + "\"/>");
sbHtml.append("<input type=\"hidden\" name='memo' value=\"" + memo + "\"/>");
//submit按钮控件请不要含有name属性
sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\"></form>");
sbHtml.append("<script>document.forms['alipaysubmit'].submit();</script>");
return sbHtml.toString();
}
/**
* 转账到指定的支付宝账号
*
* @param orderCode
* @param productName
* @param sum
* @param request
* @param model
* @throws IOException
* @throws DocumentException
* @throws MalformedURLException
*/
private void tianGuaTransport2alipay(String orderCode, String productName,
String sum, HttpServletRequest request,
HttpServletResponse response, ModelMap model){
try {
String str = tianGuaBuildRequest("15859296876", sum, orderCode,
"请勿修改付款说明,以免影响自动发货", "post", "转账");
response.setContentType("text/html");
response.setCharacterEncoding("GBK");
PrintWriter out;
out = response.getWriter();
out.write(str);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 新增甜瓜验证接口
* @param out_trade_no
* @param trade_no
* @param total_fee
* @param time
* @return
*/
private int tianGuaVerify(String out_trade_no, String trade_no,
String total_fee, String time, String key){
//时间检验
SimpleDateFormat datetimeformat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
try {
Date theDate = datetimeformat.parse(time);
Date now = new Date();
long diff = now.getTime() - theDate.getTime();
if(diff > 10000 || diff < 0 ){
System.err.println("time=" + time + ", now=" + now.toString());
return -1;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//MD5检验
String mykey = "dkW_2015";
String temp = "orderSn=" + out_trade_no +
"&tradeNo=" + trade_no +
"&amount=" + total_fee +
"&time=" + time +
"&key=" + mykey;
System.out.println(temp);
temp = MD5Utils.GetMD5Code(temp);
System.out.println("key=" + key + ",temp=" + temp);
if(key.equals(temp)){
return 1;
}
return 0;
}
/**
* 新增甜瓜通知接口
* @param request
* @param response
* @param model
* @author chenyan
*/
@RequestMapping(value = "/order/v_TianGuaCallBack.jspx", method = RequestMethod.POST)
public void v_TianGuaCallBack(HttpServletRequest request,
HttpServletResponse response, ModelMap model) {
// 获取POST过来反馈信息
String out_trade_no = RequestUtils.getQueryParam(request, "orderSn");// 商户订单号
String trade_no = RequestUtils.getQueryParam(request, "tradeNo");// 支付宝交易号
String total_fee = RequestUtils.getQueryParam(request, "amount");// 交易金额
String time = RequestUtils.getQueryParam(request, "time");// 交易金额
String key = RequestUtils.getQueryParam(request, "key");
int ret = tianGuaVerify(out_trade_no, trade_no, total_fee, time, key);
if (ret == 1) {// 验证成功
// 请在这里加上商户的业务逻辑程序代码
Order order = orderMng.getOrderByCode(out_trade_no);
if (order == null) {
System.out.println("根据支付宝返回的参数订单编号:" + out_trade_no
+ "的订单,异步校验,在数据查找订单为空!交易终止!");
return;
}
OrderExt ext = extMng.getOrderExtByOrderCode(order.getOrderCode()).get(0);
// ——更改数据库的订单相关状态——
order.setChargeCode(trade_no);
if (1 != order.getStatus())
order.setStatus(2);
if (null == order.getChargeTime()
|| "".equals(order.getChargeTime())) {
order.setChargeTime(new java.sql.Date(new java.util.Date()
.getTime()));
}
if (1 != order.getSendState())
order.setSendState(2);
order.setChargeAccount("tiangua");
order.setChargeType(1);
// order.setChargeCode(out_trade_no);
order = orderMng.updateByUpdater(order);
order.setExt(ext);
if (2 == order.getStatus()) {
//if(null!=orderCodeTemp&&!"".equals(orderCodeTemp)&&orderCodeTemp.equals(out_trade_no)){
this.fetchCard(request, response, model, order);
// orderCodeTemp = out_trade_no;
//}
}
System.out.println("根据支付宝返回的参数订单编号:" + out_trade_no
+ "的订单,异步校验成功!支付成功 ");
} else {// 验证失败
System.out.println("根据支付宝返回的参数订单编号:" + out_trade_no
+ "的订单,异步校验,由于验证失败,交易失败!!! ");
}
}
//-----------------------------------------------------------------------------
// 订单支付 支付宝服务器异步通知页面
@RequestMapping(value = "/order/v_onCallBack.jspx", method = RequestMethod.POST)
public void v_onCallBack(HttpServletRequest request,
HttpServletResponse response, ModelMap model) {
System.out.println("支付宝服务器异步通知页面!");
// 请求的域名
StringBuffer p = request.getRequestURL();
int endp = p.length() - "order/v_onCallBack.jspx".length();
String path1 = p.toString().substring(0, endp);
// 获取支付宝POST过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
String out_trade_no = RequestUtils.getQueryParam(request,
"out_trade_no");// 商户订单号
String trade_no = RequestUtils.getQueryParam(request, "trade_no");// 支付宝交易号
String trade_status = RequestUtils.getQueryParam(request,
"trade_status");// 交易状态
String total_fee = RequestUtils.getQueryParam(request, "total_fee");// 交易金额
String buyer_email = RequestUtils.getQueryParam(request, "buyer_email");// 卖家支付账号
String subject = RequestUtils.getQueryParam(request, "subject");// 商品名称
if (AlipayNotify.verify(params)) {// 验证成功
// 请在这里加上商户的业务逻辑程序代码
Order order = orderMng.getOrderByCode(out_trade_no);
OrderExt ext = extMng.getOrderExtByOrderCode(order.getOrderCode())
.get(0);
if (order == null) {
// AlipayCore.logResult("根据支付宝返回的参数订单编号:" + out_trade_no
// + "的订单,异步校验,在数据查找订单为空!交易终止!");
log.info("根据支付宝返回的参数订单编号:" + out_trade_no
+ "的订单,异步校验,在数据查找订单为空!交易终止!");
return;
}
if (null == ext || !ext.getProductName().equals(subject)) {
log.info("请求域名=" + path1 + "根据支付宝返回的参数订单编号:" + out_trade_no
+ "的订单,同步校验,订单参数商品名称不对!交易终止!返回名称为:" + subject);
// model.addAttribute("msg", "交易失败!");
// cmsLogMng.orderLogSave(request, order.getOrderCode(),
// "order.log", "请求域名="+path1+"交易失败,订单有误--返回的名称为:" + subject);
return;
}
// ——更改数据库的订单相关状态——
if (trade_status.equals("TRADE_FINISHED")) {
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
// AlipayCore.logResult("根据支付宝返回的参数订单编号:" + out_trade_no
// + "的订单,异步校验成功!交易完成 ");
log.info("根据支付宝返回的参数订单编号:" + out_trade_no + "的订单,异步校验成功!交易完成 ");
// 如果有做过处理,不执行商户的业务程序
// 注意:
// 该种交易状态只在两种情况下出现
// 1、开通了普通即时到账,买家付款成功后。
// 2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。
} else if (trade_status.equals("TRADE_SUCCESS")) {
order.setChargeCode(trade_no);
if (1 != order.getStatus() && 2 != order.getStatus())
order.setStatus(2);
if (null == order.getChargeTime()
|| "".equals(order.getChargeTime())) {
order.setChargeTime(new java.sql.Date(new java.util.Date()
.getTime()));
}
if (1 != order.getSendState() && 2 != order.getSendState())
order.setSendState(2);
order.setChargeAccount(buyer_email);
order.setChargeType(1);
// order.setChargeCode(out_trade_no);
order = orderMng.updateByUpdater(order);
// String productCode= ext.getProductCode();
// Product = productMng.findByProductCode(productCode)
order.setExt(ext);
if (2 == order.getStatus()) {
if(null!=orderCodeTemp&&!"".equals(orderCodeTemp)&&orderCodeTemp.equals(out_trade_no)){
this.fetchCard(request, response, model, order);
orderCodeTemp = out_trade_no;
}
// String msg = getMailContents1(order, request);
// model.addAttribute("msg", msg);
}
// model.addAttribute("msg", "交易成功!");
// 判断该笔订单是否在商户网站中已经做过处理
// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序支付成功
// AlipayCore.logResult("根据支付宝返回的参数订单编号:" + out_trade_no
// + "的订单,异步校验成功!支付成功 ");
log.info("根据支付宝返回的参数订单编号:" + out_trade_no + "的订单,异步校验成功!支付成功 ");
// 如果有做过处理,不执行商户的业务程序
// 注意:
// 该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。
}
// AlipayCore.logResult("根据支付宝返回的参数订单编号:" + out_trade_no
// + "的订单,异步校验成功!交易完成! ");
log.info("根据支付宝返回的参数订单编号:" + out_trade_no + "的订单,异步校验成功!交易完成! ");
} else {// 验证失败
// AlipayCore.logResult("根据支付宝返回的参数订单编号:" + out_trade_no
// + "的订单,异步校验,由于验证失败,交易失败!!! ");
log.info("根据支付宝返回的参数订单编号:" + out_trade_no
+ "的订单,异步校验,由于验证失败,交易失败!!! ");
}
}
/**
* 环讯支付异步返回通知
*
* @param request
* @param response
* @param model
* @throws IOException
*/
@RequestMapping(value = "/order/ips_CallBack.jspx")
public void ips_CallBack(HttpServletRequest request,
HttpServletResponse response, ModelMap model) throws IOException {
System.out.println("环讯支付异步通知!");
// 请求的域名
StringBuffer p = request.getRequestURL();
int endp = p.length() - "order/ips_CallBack.jspx".length();
String path1 = p.toString().substring(0, endp);
String rtnUrl = formatString(path1 + "order/ips_CallBack.jspx");
String billno = request.getParameter("billno");
String currency_type = request.getParameter("Currency_type");
String amount = request.getParameter("amount");
String mydate = request.getParameter("date");
String succ = request.getParameter("succ");
String msgips = request.getParameter("msg");
// String attach = request.getParameter("attach");
String ipsbillno = request.getParameter("ipsbillno");
String retEncodeType = request.getParameter("retencodetype");
String signature = request.getParameter("signature");
// 返回订单加密的明文:billno+【订单编号】+currencytype+【币种】+amount+【订单金额】+date+【订单日期】+succ+【成功标志】+ipsbillno+【IPS订单编号】+retencodetype
// +【交易返回签名方式】+【商户内部证书】
String content = "billno" + billno + "currencytype" + currency_type
+ "amount" + amount + "date" + mydate + "succ" + succ
+ "ipsbillno" + ipsbillno + "retencodetype" + retEncodeType; // 明文:订单编号+订单金额+订单日期+成功标志+IPS订单编号+币种
// request.setCharacterEncoding("iso-8859-1");
// request.setCharacterEncoding("utf-8");
// response.setContentType("text/html");
// response.setCharacterEncoding("gb2312");
// PrintWriter out = response.getWriter();
System.out.println("环讯支付异步返回:v_md5str=" + content);
boolean verify = false;
if (retEncodeType.equals("17")) {
// 登陆http://merchant.ips.com.cn/商户后台下载的商户证书内容
String md5Key = "ABovowjMd1CscDxpnvAUxNbS5G5fxZYLaZNEZDfdzgsbxpH6ZlyOTjLnaLqWr2O3TrH2qhFZEXVGV0VGzy5CaArsEaeDO9nxHo85XEGrUP8wC4HZqZWswBTHzPoE31A5";
cryptix.jce.provider.MD5 b = new cryptix.jce.provider.MD5();
String SignMD5 = b.toMD5(content + md5Key).toLowerCase();
if (SignMD5.equals(signature)) {
verify = true;
}
}
if (verify) {
if (succ != null) {
if (succ.equalsIgnoreCase("Y")) {
// 支付成功,商户 根据自己业务做相应逻辑处理
// 此处加入商户系统的逻辑处理(例如判断金额,更新订单状态等等)......
Order order = orderMng.getOrderByCode(billno);
if (order == null) {
log.info("请求域名=" + path1 + "根据环讯支付返回的参数订单编号:" + billno
+ "的订单,异步校验,在数据查找订单为空!交易终止!");
return;
}
OrderExt ext = extMng.getOrderExtByOrderCode(
order.getOrderCode()).get(0);
if (1 != order.getStatus()) {
if (2 != order.getStatus()) {
order.setStatus(2);
order.setChargeCode(ipsbillno);
if (null == order.getChargeTime()
|| "".equals(order.getChargeTime())) {
order.setChargeTime(new java.sql.Date(
new java.util.Date().getTime()));
}
if (1 != order.getSendState()) {
if(2 != order.getSendState()){
order.setSendState(2);
productMng.updateSaleNum(ext.getProductCode());
}
}
order.setChargeAccount(ipsbillno);
order.setChargeType(5);// 环讯在线
order.setChargeCode(ipsbillno);
order = orderMng.updateByUpdater(order);
order.setExt(ext);
// 多加一个判断以防支付金额不对则不提卡
if (2 == order.getStatus()
&& null != amount
&& !"".equals(amount)
&& Double.valueOf(amount)
.equals(order.getSum())) {
// 提卡
fetchCard(request, response, model, order);
String msg = getMailContents1(order, request);
System.out.println("发货成功!");
model.addAttribute("msg", msg);
cmsLogMng.orderLogSave(request,
order.getOrderCode(), "order.log", "请求域名="
+ rtnUrl + ":环讯支付-" + ipsbillno
+ ":实付金额=" + amount);
}
if (!Double.valueOf(amount).equals(order.getSum())) {
model.addAttribute("msg", "支
|