package com.cweb.controller.pay; import com.alibaba.fastjson.JSONObject; import com.hai.common.pay.WechatPayUtil; import com.hai.common.pay.util.IOUtil; import com.hai.common.pay.util.XmlUtil; import com.hai.common.pay.util.sdk.WXPayConstants; import com.hai.common.utils.HttpsUtils; import com.hai.common.utils.WxUtils; import com.hai.model.WxSharingOrderRequestModel; import com.hai.model.WxSharingReceiversVO; import com.hai.service.pay.NotifyService; import com.hai.service.pay.PayRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import net.sf.cglib.beans.BeanMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedOutputStream; import java.util.*; @Controller @RequestMapping(value = "/wechatpay") @Api(value = "微信支付") public class WechatPayController { private static Logger log = LoggerFactory.getLogger(WechatPayController.class); private WXPayConstants.SignType signType; @Resource private NotifyService notifyService; @Resource private PayRecordService payRecordService; @Resource private WechatPayUtil wechatPayUtil; @RequestMapping(value = "/notify", method = RequestMethod.POST) @ApiOperation(value = "微信支付 -> 异步回调") public void wechatNotify(HttpServletRequest request, HttpServletResponse response) { try { log.info("微信支付 -> 异步通知:处理开始"); String resXml = ""; // 反馈给微信服务器 String notifyXml = null; // 微信支付系统发送的数据(格式) notifyXml = IOUtil.inputStreamToString(request.getInputStream(), "UTF-8"); log.info("微信支付系统发送的数据:" + notifyXml); SortedMap map = XmlUtil.parseXmlToTreeMap(notifyXml, "UTF-8"); resXml = notifyService.wechatNotify(map); /* if (SignatureUtil.reCheckIsSignValidFromWeiXin(notifyXml, SysConst.getSysConfig().getWxApiKey(), "UTF-8")) { log.info("微信支付系统发送的数据:" + notifyXml); SortedMap map = XmlUtil.parseXmlToTreeMap(notifyXml, "UTF-8"); resXml = notifyService.wechatNotify(map); } else { log.error("微信支付 -> 异步通知:验签失败"); log.error("apiKey:" + SysConst.getSysConfig().getWxApiKey()); log.error("返回信息:" + notifyXml); resXml = "" + "" + "" + " "; }*/ BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); log.info("微信支付 -> 异步通知:处理完成"); } catch (Exception e) { log.error("WechatPayController --> wechatNotify() error!", e); } } /*@RequestMapping(value = "/testCreateOrder", method = RequestMethod.GET) @ApiOperation(value = "微信测试 创建支付信息(发版时注释此接口)") @ResponseBody public SortedMap testCreateOrder(@RequestParam(value = "subject", required = true) String subject, @RequestParam(value = "orderNo", required = true) String orderNo, @RequestParam(value = "totalPrice", required = true) Integer totalPrice, HttpServletRequest httpRequest, HttpServletResponse httpResponse) { try { String nonce_str = MD5Util.MD5Encode(String.valueOf(ThreadLocalRandom.current().nextInt(10000)), "UTF-8"); WeChatPayReqInfo weChatPayReqInfo = new WeChatPayReqInfo(); weChatPayReqInfo.setAppid(wechatConfig.getApp_id()); //公众号id weChatPayReqInfo.setMch_id(wechatConfig.getMch_id()); //商户号 weChatPayReqInfo.setNonce_str(nonce_str); //随机字符串 weChatPayReqInfo.setBody(subject); //商品描述 weChatPayReqInfo.setOut_trade_no(orderNo); //商户订单号 weChatPayReqInfo.setTotal_fee(totalPrice); //总 weChatPayReqInfo.setSpbill_create_ip("182.43.154.4"); //终端ip weChatPayReqInfo.setNotify_url(wechatConfig.getNotify_url()); //通知url //weChatPayReqInfo.setTrade_type("APP"); //交易类型 weChatPayReqInfo.setTrade_type("JSAPI"); //weChatPayReqInfo.setOpenid(""); weChatPayReqInfo.setAttach("Test"); *//** 获取沙箱key start *//* String sandboxKey = GetSignKey(); *//** 获取沙箱key end *//* String sign = SignatureUtil.createSign(weChatPayReqInfo, sandboxKey, "UTF-8"); // 测试 todo del weChatPayReqInfo.setSign(sign); String unifiedXmL = XmlUtil.toSplitXml(weChatPayReqInfo); String unifiedOrderResultXmL = HttpReqUtil.HttpsDefaultExecute("POST", wechatConfig.getUnified_order_url(), null, unifiedXmL, null); log.error("支付信息:" + unifiedOrderResultXmL); // 签名校验 SortedMap sortedMap = null; // 组装支付参数 WechatCallBackInfo wechatCallBackInfo = XmlUtil.getObjectFromXML(unifiedOrderResultXmL, WechatCallBackInfo.class); Long timeStamp = System.currentTimeMillis()/1000; sortedMap = new TreeMap<>(); sortedMap.put("appid",wechatConfig.getApp_id()); sortedMap.put("partnerid",wechatConfig.getMch_id()); sortedMap.put("prepayid",wechatCallBackInfo.getPrepay_id()); sortedMap.put("noncestr",wechatCallBackInfo.getNonce_str()); sortedMap.put("timestamp",timeStamp); sortedMap.put("package","Sign=WXPay"); String secondSign = SignatureUtil.createSign(sortedMap, wechatConfig.getApi_key(), "UTF-8"); sortedMap.put("sign",secondSign); return sortedMap; } catch (Exception e) { log.error("AlipayTest -> createOrder:生成订单错误", e); } return null; }*/ /** * @desc 获取沙箱key */ /*public String GetSignKey() throws Exception { String nonce_str = WXPayUtil.generateNonceStr(); //生成随机字符 Map param = new HashMap<>(); param.put("mch_id", wechatConfig.getMch_id()); //需要真实商户号 param.put("nonce_str", nonce_str); //随机字符 String sign = WXPayUtil.generateSignature(param, wechatConfig.getApi_key(), WXPayConstants.SignType.MD5); //通过SDK生成签名其中API_KEY为商户对应的真实密钥 param.put("sign", sign); String xml = WXPayUtil.mapToXml(param); //将map转换为xml格式 String url = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey"; //沙箱密钥获取api String signKey = HttpUtil.post(url, xml); System.out.println("signkey+"+signKey); Map param1 = new HashMap(); param1 = WXPayUtil.xmlToMap(signKey.toString()); String key = param1.get("sandbox_signkey"); return key; }*/ @RequestMapping(value = "/addLedgerReceiver", method = RequestMethod.POST) @ApiOperation(value = "微信支付 -> 添加分账接收方") public void addLedgerReceiver(HttpServletRequest request, HttpServletResponse response) { try { WxSharingReceiversVO receiversVO = new WxSharingReceiversVO(); receiversVO.setAccount("1609882817"); receiversVO.setType("MERCHANT_ID"); receiversVO.setName("个体户黎杨珍"); receiversVO.setRelation_type("SERVICE_PROVIDER"); Map map = new HashMap<>(); map.put("mch_id" , "1289663601"); map.put("sub_mch_id" , "1609882817"); map.put("appid" , "wx637bd6f7314daa46"); map.put("nonce_str" , WxUtils.makeNonStr()); map.put("sign_type" , "HMAC-SHA256"); map.put("receiver" , JSONObject.toJSONString(receiversVO)); String sign = WxUtils.generateSignature(map, "Skufk5oi85wDFGl888i6wsRSTkdd5df5" , WXPayConstants.SignType.HMACSHA256); map.put("sign" , sign); String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver"; String xm = WxUtils.mapToXml(map); String rest = String.valueOf(HttpsUtils.postData(url, xm)); System.out.println(rest); log.info("微信支付 -> 添加分账接收方:处理开始"); } catch (Exception e) { log.error("WechatPayController --> wechatNotify() error!", e); } } }