package com.cn.riwise.m.controller.payManage;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.cn.riwise.m.api.common.OrderGenerator;
import com.cn.riwise.m.api.common.OrderStatus;
import com.cn.riwise.m.api.common.PayStatus;
import com.cn.riwise.m.api.common.WebResponseCode;
import com.cn.riwise.m.api.common.annotation.TokenCheck;
import com.cn.riwise.m.api.pojo.myspringbean.WxOrderAppPayConfigBean;
import com.cn.riwise.m.api.pojo.shoping.Order;
import com.cn.riwise.m.api.pojo.shoping.Paymentlog;
import com.cn.riwise.m.api.pojo.user.UserToken;
import com.cn.riwise.m.api.service.general.SettleService;
import com.cn.riwise.m.api.service.store.DubboTestServer;
import com.cn.riwise.m.api.service.store.PaymentlogService;
import com.cn.riwise.m.api.service.store.ShoppingCartService;
import com.cn.riwise.m.api.service.trans.OrderService;
import com.cn.riwise.m.common.BaseResponseData;
import com.cn.riwise.m.common.CollectionUtil;
import com.cn.riwise.m.common.ConfigUtil;
import com.cn.riwise.m.common.FileUtil;
import com.cn.riwise.m.common.HttpUtils;
import com.cn.riwise.m.common.PayUtil;
import com.cn.riwise.m.common.Result;
import com.cn.riwise.m.common.XmlUtil;
/**
* 微信app支付_商品购买
* @author yuzj
* 2017年11月15日
* 申请退款_微信支付的参数文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
*/
@Controller
@RequestMapping("/wx")
public class WxProductAppPayController {
private static final Logger logger = Logger.getLogger(WxProductAppPayController.class);
private static final String ORDER_PAY = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 统一下单
private static final String ORDER_PAY_QUERY = "https://api.mch.weixin.qq.com/pay/orderquery"; // 支付订单查询
// private static final String ORDER_REFUND = "https://api.mch.weixin.qq.com/secapi/pay/refund"; // 申请退款
//
// private static final String ORDER_REFUND_QUERY = "https://api.mch.weixin.qq.com/pay/refundquery"; // 申请退款
// private static final String APP_ID_MM = ConfigUtil.getProperty("wx.appid.mm");
// private static final String MCH_ID_MM = ConfigUtil.getProperty("wx.mchid.mm");
// private static final String API_SECRET_MM = ConfigUtil.getProperty("wx.api.secret.mm");
// private static final String NOTIFY_URL_MM = ConfigUtil.getProperty("wx.notify.url.mm");
// private static final String APP_ID_HB = ConfigUtil.getProperty("wx.appid.hb"); // 应用ID
// private static final String MCH_ID_HB = ConfigUtil.getProperty("wx.mchid.hb"); // 商户号
// private static final String API_SECRET_HB = ConfigUtil.getProperty("wx.api.secret.hb");// 密钥
// private static final String NOTIFY_URL_HB = ConfigUtil.getProperty("wx.notify.url.hb");// 回调URL
// 应用ID
private static final String APP_ID_MM = WxOrderAppPayConfigBean.getAPP_ID_MM();
// 商户号
private static final String MCH_ID_MM = WxOrderAppPayConfigBean.getMCH_ID_MM();
// 密钥
private static final String API_SECRET_MM = WxOrderAppPayConfigBean.getAPI_SECRET_MM();
// 回调URL
private static final String NOTIFY_URL_MM = WxOrderAppPayConfigBean.getNOTIFY_URL_MM();
private static final String APP_ID_HB = WxOrderAppPayConfigBean.getAPP_ID_HB(); // 应用ID
private static final String MCH_ID_HB = WxOrderAppPayConfigBean.getMCH_ID_HB(); // 商户号
private static final String API_SECRET_HB = WxOrderAppPayConfigBean.getAPI_SECRET_HB();// 密钥
private static final String NOTIFY_URL_HB = WxOrderAppPayConfigBean.getNOTIFY_URL_HB();// 回调URL
@Autowired
private ShoppingCartService shoppingCartService;
@Autowired
private PaymentlogService paymentlogService;
@Autowired
DubboTestServer dubboTestService;
@Resource
SettleService settleService;
@Autowired
OrderService orderService;
/**
* 支付下订单
*
* @param request
* @param orderId
* 单据ID
*/
@RequestMapping("/pay")
@TokenCheck(userToken = "#token")
public @ResponseBody BaseResponseData orderPay(HttpServletRequest request,UserToken token) {
BaseResponseData data = new BaseResponseData();
HashMap<String, Object> resData = new HashMap<String, Object>();
String compoundOrderId = request.getParameter("orderId");//传过来的复合订单号
logger.info("compoundOrderId=============" + compoundOrderId);
String priceStr = request.getParameter("totalFee");
String orderName = request.getParameter("orderName");
String type = request.getParameter("type"); //1伙伴 2妈妈
// 针对于待付款列表先微信后在待付款选择支付宝的情况,修改支付记录的支付类型
List<Paymentlog> list1 = shoppingCartService.getPaymentlogByCompoundOrderIdAndPayType(compoundOrderId, 2);
if (list1.size()==0) {
List<Paymentlog> list2 = shoppingCartService.getPaymentlogByCompoundOrderIdAndPayType(compoundOrderId, 1);
if (list2 != null && list2.size() > 0) {
Paymentlog pl = list2.get(0);
pl.setCompoundOrderId(compoundOrderId);
pl.setNewPayType(2);
pl.setPayType(1);
shoppingCartService.updatePaymentlogByComId(pl);
}
}
//--------------------------------------验证订单产品价格-------------------------------------
if(!orderService.validateOrder(compoundOrderId, priceStr)){
data.setCode(WebResponseCode.ERROR);
data.setMessage("下单系统异常!");
return data;
}
//--------------------------------------验证订单产品价格-------------------------------------
//生成新的复合订单号用于支付,防止微信服务器提示商户号已存在
String userId = request.getParameter("userId");
String newCompoundOrderId =OrderGenerator.getOrderVoId(userId);
// 获取系统的单据的ID [orderId],这个值是由APP端提交过来的,
if (StringUtils.isEmpty(compoundOrderId)) {
data.setCode(1002);
data.setMessage("商品ID不存在");
data.setResponseData(resData);
resData.put("Result", Result.error("商品ID不存在"));
return data;
}
//查询该复合订单号是否已支付,如已支付则提示已付款
// 根据复合订单号查询到所有的订单信息ShoppingCartService
List<Paymentlog> orderList = shoppingCartService.getOrdersByComID(compoundOrderId);
logger.info("orderList.size()=============" + orderList.size());
Integer num =0;
if((orderList.size()>0 && num.equals(orderList.get(0).getPayStatus())) ||orderList.size()==0){
data.setCode(1002);
data.setMessage("该订单已支付!");
data.setResponseData(resData);
resData.put("Result", Result.error("该订单已支付!"));
return data;
}
// 根据单据ID,我们可以查询系统需要支付的单据的信息
// 比如我们现在需要的是价格【price】和一些该单据的信息【content】
/**
* 此处省略获取单据信息等一些操作,这里我们需要单据的价格和商品内容信息
* OrderInfo item = xxxSVC.getById(orderId);
*/
// 价格 微信支付是以 ‘分’为单位
Double price = new Double(priceStr);
// 商品内容(支付界面提示语)
String content = orderName;
logger.info("price1=============" + price);
Map<String, String> restmap = null;
boolean flag = true; // 是�