package com.izouma.nineth.web; import com.alibaba.fastjson.JSON; import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.izouma.nineth.config.GeneralProperties; import com.izouma.nineth.domain.Order; import com.izouma.nineth.enums.OrderStatus; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.OrderRepo; import com.izouma.nineth.service.*; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; import me.chanjar.weixin.mp.bean.result.WxMpUser; import org.apache.commons.codec.EncoderException; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.regex.Pattern; @Controller @RequestMapping("/payOrder") @Slf4j @AllArgsConstructor public class OrderPayController { private final OrderService orderService; private final WxMpService wxMpService; private final GiftOrderService giftOrderService; private final OrderRepo orderRepo; private final MintOrderService mintOrderService; private final SandPayService sandPayService; private final OrderPayService orderPayService; private final GeneralProperties generalProperties; @RequestMapping(value = "/alipay_h5", method = RequestMethod.GET) @ResponseBody public String payOrderAlipayH5(Long id, Model model) throws BaseAdaPayException { // return (String) orderService.payAdapay(id, "alipay_wap", null); return orderPayService.payOrder(id); } @RequestMapping(value = "/alipay_wx", method = RequestMethod.GET) public String payOrderAlipayWx(Long id, Model model) throws BaseAdaPayException { // Order order = orderRepo.findById(id).orElseThrow(new BusinessException("订单不存在")); // if (order.getStatus() != OrderStatus.NOT_PAID) { // return "redirect:/9th/store"; // } // String payUrl = (String) orderService.payAdapay(id, "alipay_wap", null); // model.addAttribute("payUrl", payUrl); // model.addAttribute("orderId", id); // return "AlipayHtml"; Order order = orderRepo.findById(id).orElseThrow(new BusinessException("订单不存在")); if (order.getStatus() != OrderStatus.NOT_PAID) { return "redirect:/" + generalProperties.resolveFrontUrl(order.getCompanyId(), "/store"); } String payUrl = orderPayService.payOrder(id); model.addAttribute("payUrl", payUrl); model.addAttribute("orderId", id); return "AlipayHtml"; } @RequestMapping(value = "/alipay_qr", method = RequestMethod.GET) @ResponseBody public String payOrderAlipayQR(Long id, Model model) throws BaseAdaPayException { return (String) orderService.payAdapay(id, "alipay_qr", null); } @RequestMapping(value = "/alipay_app", method = RequestMethod.GET) @ResponseBody public String payOrderAlipayApp(Long id, Model model) throws BaseAdaPayException { return orderPayService.payOrder(id); } @RequestMapping(value = "/weixin_h5") public String payOrderWeixinH5(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) throws EncoderException, WxPayException { detectUA(userAgent, model); model.addAttribute("payUrl", orderService.payOrderWeixin(id, WxPayConstants.TradeType.MWEB, null)); return "WeixinPayHtml"; } @RequestMapping(value = "/weixin") @ResponseBody public Object payOrderWeixin(@RequestParam Long id, @RequestParam(defaultValue = "wx_lite") String channel, @RequestParam(required = false) String openId) throws BaseAdaPayException { return orderService.payAdapay(id, channel, openId); } @RequestMapping(value = "/weixin_pc") public String payOrderWeixinPC(@RequestParam Long id, @RequestParam String code, Model model) throws WxPayException, EncoderException, WxErrorException { WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code); WxMpUser user = wxMpService.oauth2getUserInfo(accessToken, null); WxPayMpOrderResult payParams = (WxPayMpOrderResult) orderService .payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, user.getOpenId()); model.addAttribute("payParams", JSON.toJSONString(payParams)); return "PayOrderPC"; } @ApiOperation("衫德h5快捷") @RequestMapping(value = "/sandQuick", method = RequestMethod.GET, produces = "text/html") @ResponseBody public String sandQuick(@RequestParam Long id, Model model) throws BaseAdaPayException { // return (String) orderService.payAdapay(id, "alipay_wap", null); return orderPayService.payOrderQuick(id); } @ApiOperation("衫德h5快捷") @RequestMapping(value = "/agreementPay", method = RequestMethod.GET, produces = "text/html") @ResponseBody public String agreementPay(@RequestParam Long id) { // return (String) orderService.payAdapay(id, "alipay_wap", null); return orderPayService.payOrderQuick(id); } @RequestMapping(value = "/gift/alipay_h5", method = RequestMethod.GET) @ResponseBody public String payGiftOrderAlipayH5(Long id, Model model) throws BaseAdaPayException { // return (String) giftOrderService.payAdapay(id, "alipay_wap", null); return orderPayService.payGiftOrder(id); } @RequestMapping(value = "/gift/alipay_wx", method = RequestMethod.GET) public String payGiftOrderAlipayWx(Long id, Model model) throws BaseAdaPayException { // String payUrl = (String) giftOrderService.payAdapay(id, "alipay_wap", null); String payUrl = orderPayService.payGiftOrder(id); model.addAttribute("payUrl", payUrl); model.addAttribute("orderId", id); return "AlipayHtml"; } @RequestMapping(value = "/gift/alipay_qr", method = RequestMethod.GET) @ResponseBody public String payGiftOrderAlipayQR(Long id, Model model) throws BaseAdaPayException { return orderPayService.payGiftOrder(id); } @RequestMapping(value = "/gift/alipay_app", method = RequestMethod.GET) @ResponseBody public String payGiftOrderAlipayApp(Long id, Model model) throws BaseAdaPayException { return orderPayService.payGiftOrder(id); } @RequestMapping(value = "/gift/weixin_h5") public String payGiftOrderWeixinH5(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) throws EncoderException, WxPayException { detectUA(userAgent, model); model.addAttribute("payUrl", giftOrderService.payOrderWeixin(id, WxPayConstants.TradeType.MWEB, null)); return "WeixinPayHtml"; } @RequestMapping(value = "/gift/weixin") @ResponseBody public Object payGiftOrderWeixin(@RequestParam Long id, @RequestParam(defaultValue = "wx_lite") String channel, @RequestParam(required = false) String openId) throws BaseAdaPayException { return giftOrderService.payAdapay(id, channel, openId); } @RequestMapping(value = "/gift/weixin_pc") public String payGiftOrderWeixinPC(@RequestParam Long id, @RequestParam String code, Model model) throws WxPayException, EncoderException, WxErrorException { WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code); WxMpUser user = wxMpService.oauth2getUserInfo(accessToken, null); WxPayMpOrderResult payParams = (WxPayMpOrderResult) giftOrderService .payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, user.getOpenId()); model.addAttribute("payParams", JSON.toJSONString(payParams)); return "PayOrderPC"; } @RequestMapping(value = "/mint/alipay_h5", method = RequestMethod.GET) @ResponseBody public String payMintOrderAlipayH5(Long id, Model model) throws BaseAdaPayException { // return (String) mintOrderService.payAdapay(id, "alipay_wap", null); return orderPayService.payMintOrder(id); } @RequestMapping(value = "/mint/alipay_wx", method = RequestMethod.GET) public String payMintOrderAlipayWx(Long id, Model model) throws BaseAdaPayException { // String payUrl = (String) mintOrderService.payAdapay(id, "alipay_wap", null); String payUrl = orderPayService.payMintOrder(id); model.addAttribute("payUrl", payUrl); model.addAttribute("orderId", id); return "AlipayHtml2"; } @RequestMapping(value = "/mint/alipay_qr", method = RequestMethod.GET) @ResponseBody public String payMintOrderAlipayQR(Long id, Model model) throws BaseAdaPayException { return (String) mintOrderService.payAdapay(id, "alipay_qr", null); } @RequestMapping(value = "/mint/alipay_app", method = RequestMethod.GET) @ResponseBody public String payMintOrderAlipayApp(Long id, Model model) throws BaseAdaPayException { // return (String) mintOrderService.payAdapay(id, "alipay", null); return orderPayService.payMintOrder(id); } @RequestMapping(value = "/mint/weixin_h5") public String payMintOrderWeixinH5(Long id, Model model, @RequestHeader(value = "User-Agent") String userAgent) throws EncoderException, WxPayException { detectUA(userAgent, model); model.addAttribute("payUrl", mintOrderService.payOrderWeixin(id, WxPayConstants.TradeType.MWEB, null)); return "WeixinPayHtml"; } @RequestMapping(value = "/mint/weixin") @ResponseBody public Object payMintOrderWeixin(@RequestParam Long id, @RequestParam(defaultValue = "wx_lite") String channel, @RequestParam(required = false) String openId) throws BaseAdaPayException { return mintOrderService.payAdapay(id, channel, openId); } @RequestMapping(value = "/mint/weixin_pc") public String payMintOrderWeixinPC(@RequestParam Long id, @RequestParam String code, Model model) throws WxPayException, EncoderException, WxErrorException { WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code); WxMpUser user = wxMpService.oauth2getUserInfo(accessToken, null); WxPayMpOrderResult payParams = (WxPayMpOrderResult) mintOrderService .payOrderWeixin(id, WxPayConstants.TradeType.JSAPI, user.getOpenId()); model.addAttribute("payParams", JSON.toJSONString(payParams)); return "PayOrderPC"; } public void detectUA(String ua, Model model) { boolean weixin = Pattern.matches(".*(micromessenger).*", ua.toLowerCase()); boolean ios = Pattern.matches(".*(ipad|iphone).*", ua.toLowerCase()); boolean android = Pattern.matches(".*(android).*", ua.toLowerCase()); model.addAttribute("weixin", weixin); model.addAttribute("ios", ios); model.addAttribute("android", android); } }