package com.java110.front.smo; import com.java110.front.properties.WechatAuthProperties; import com.java110.core.component.AbstractComponentSMO; import com.java110.core.context.IPageData; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.CommonConstant; import com.java110.utils.util.Assert; import com.java110.utils.util.PayUtil; import com.java110.utils.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestTemplate; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; public abstract class AppAbstractComponentSMO extends AbstractComponentSMO { private static final Logger logger = LoggerFactory.getLogger(AppAbstractComponentSMO.class); @Autowired private WechatAuthProperties wechatAuthProperties; /** * 调用中心服务 * * @return */ @Override protected ResponseEntity callCenterService(RestTemplate restTemplate, IPageData pd, String param, String url, HttpMethod httpMethod) { Assert.notNull(pd.getAppId(), "请求头中未包含应用信息"); ResponseEntity responseEntity = null; HttpHeaders header = new HttpHeaders(); header.add(CommonConstant.HTTP_APP_ID.toLowerCase(), pd.getAppId()); header.add(CommonConstant.HTTP_USER_ID.toLowerCase(), StringUtil.isEmpty(pd.getUserId()) ? CommonConstant.ORDER_DEFAULT_USER_ID : pd.getUserId()); header.add(CommonConstant.HTTP_TRANSACTION_ID.toLowerCase(), pd.getTransactionId()); header.add(CommonConstant.HTTP_REQ_TIME.toLowerCase(), pd.getRequestTime()); header.add(CommonConstant.HTTP_SIGN.toLowerCase(), ""); HttpEntity httpEntity = new HttpEntity(param, header); //logger.debug("请求中心服务信息,{}", httpEntity); try { responseEntity = restTemplate.exchange(url, httpMethod, httpEntity, String.class); } catch (HttpStatusCodeException e) { //这里spring 框架 在4XX 或 5XX 时抛出 HttpServerErrorException 异常,需要重新封装一下 responseEntity = new ResponseEntity( e.getResponseBodyAsString(), e.getStatusCode()); } catch (Exception e) { responseEntity = new ResponseEntity(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); } finally { logger.debug("请求地址为,{} 请求中心服务信息,{},中心服务返回信息,{}", url, httpEntity, responseEntity); return responseEntity; } } /** * 预下单 * * @param orderNum * @param money * @param openId * @return * @throws Exception */ protected Map java110Payment(RestTemplate outRestTemplate, String feeName, String tradeType, String orderNum, double money, String openId,String payAppId,String payMchId) throws Exception { logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum); SortedMap resultMap = new TreeMap(); //生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元 double payAmount = PayUtil.getPayAmountByEnv(MappingCache.getValue("HC_ENV"), money); //添加或更新支付记录(参数跟进自己业务需求添加) Map resMap = this.java110UnifieldOrder(outRestTemplate,feeName, orderNum, tradeType, payAmount, openId); if ("SUCCESS".equals(resMap.get("return_code")) && "SUCCESS".equals(resMap.get("result_code"))) { if(WechatAuthProperties.TRADE_TYPE_JSAPI.equals(tradeType)) { if(payAppId != null){ resultMap.put("appId", payAppId); }else{ resultMap.put("appId", wechatAuthProperties.getAppId()); } if(payMchId != null){ resultMap.put("sign", PayUtil.createSign(resultMap, payMchId)); }else{ resultMap.put("sign", PayUtil.createSign(resultMap, wechatAuthProperties.getKey())); } resultMap.put("timeStamp", PayUtil.getCurrentTimeStamp()); resultMap.put("nonceStr", PayUtil.makeUUID(32)); resultMap.put("package", "prepay_id=" + resMap.get("prepay_id")); resultMap.put("signType", "MD5"); }else if(WechatAuthProperties.TRADE_TYPE_APP.equals(tradeType)){ resultMap.put("appId", wechatAuthProperties.getAppId()); resultMap.put("timeStamp", PayUtil.getCurrentTimeStamp()); resultMap.put("nonceStr", PayUtil.makeUUID(32)); resultMap.put("partnerid", wechatAuthProperties.getMchId()); resultMap.put("prepayid", resMap.get("prepay_id")); //resultMap.put("signType", "MD5"); resultMap.put("sign", PayUtil.createSign(resultMap, wechatAuthProperties.getKey())); } resultMap.put("code", "0"); resultMap.put("msg", "下单成功"); logger.info("【小程序支付】统一下单成功,返回参数:" + resultMap); } else { resultMap.put("code", resMap.get("return_code")); resultMap.put("msg", resMap.get("return_msg")); logger.info("【小程序支付】统一下单失败,失败原因:" + resMap.get("return_msg")); } return resultMap; } /** * 小程序支付统一下单 */ private Map java110UnifieldOrder(RestTemplate outRestTemplate, String feeName, String orderNum, String tradeType, double payAmount, String openid) throws Exception { //封装参数 SortedMap paramMap = new TreeMap(); paramMap.put("appid", wechatAuthProperties.getAppId()); paramMap.put("mch_id", wechatAuthProperties.getMchId()); paramMap.put("nonce_str", PayUtil.makeUUID(32)); paramMap.put("body", "HC智慧家园-" + feeName); paramMap.put("out_trade_no", orderNum); paramMap.put("total_fee", PayUtil.moneyToIntegerStr(payAmount)); paramMap.put("spbill_create_ip", PayUtil.getLocalIp()); paramMap.put("notify_url", wechatAuthProperties.getWxNotifyUrl()); paramMap.put("trade_type", tradeType); paramMap.put("openid", openid); paramMap.put("sign", PayUtil.createSign(paramMap, wechatAuthProperties.getKey())); //转换为xml String xmlData = PayUtil.mapToXml(paramMap); logger.debug("调用支付统一下单接口" + xmlData); ResponseEntity responseEntity = outRestTemplate.postForEntity( wechatAuthProperties.getWxPayUnifiedOrder(), xmlData, String.class); logger.debug("统一下单返回" + responseEntity); //请求微信后台,获取预支付ID if (responseEntity.getStatusCode() != HttpStatus.OK) { throw new IllegalArgumentException("支付失败" + responseEntity.getBody()); } return PayUtil.xmlStrToMap(responseEntity.getBody()); } }