package com.panzhihua.common.utlis; import java.math.BigDecimal; import java.util.LinkedHashMap; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import com.panzhihua.common.utlis.wx.WXPayUtil; import org.json.XML; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.panzhihua.common.constants.PayCpmstant; import lombok.extern.slf4j.Slf4j; @Slf4j public class WxPayUtils { public static String getUnifiedorder(String appid, String mchId, String payKey, String notifyUrl, String body, String openid, String outTradeNo, BigDecimal money,String attach) { String nonceStr = PayUtil.makeUUID(32); SortedMap params = new TreeMap<>(); params.put("appid", appid); params.put("body", body); params.put("mch_id", mchId); params.put("nonce_str", nonceStr); params.put("notify_url", notifyUrl); params.put("openid", openid); //附加数据 if(StringUtils.isNotEmpty(attach)){ params.put("attach", attach); } params.put("out_trade_no", outTradeNo);// 商品订单号 params.put("spbill_create_ip", PayUtil.getLocalIp());// 服务部署的ip params.put("total_fee", PayUtil.moneyToIntegerStr(money));// 费用的参数转型 params.put("trade_type", "JSAPI");// 对接类型 params.put("sign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, params, payKey));// MD5签名 // 转换成xml String xmlData = PayUtil.getRequestXml(params); // 请求微信后台,获取支付id String resXml = HttpClientUtil.httpsRequest(PayCpmstant.UNIFIEDORDER_URL, xmlData); log.info("请求微信支付返回参数:" + resXml); org.json.JSONObject resultData = XML.toJSONObject(resXml); JSONObject data = JSON.parseObject(resultData.get("xml").toString()); JSONObject result = new JSONObject(); if (data.get("return_msg").equals(PayCpmstant.RETURN_MSG) && data.get("return_code").equals(PayCpmstant.RETURN_CODE)) { // 将微信统一下单成功的参数拼接再签名 // 统一下单返回prepay_id String prepayId = "prepay_id=" + data.getString("prepay_id"); // 时间戳 Long timeStamp = System.currentTimeMillis() / 1000; // 封装需要签名的字段 SortedMap payParams = new TreeMap<>(); payParams.put("appId", appid); payParams.put("nonceStr", nonceStr); payParams.put("package", prepayId); payParams.put("signType", PayCpmstant.SIGN_TYPE); payParams.put("timeStamp", timeStamp); // 将参数以及签名计算完成封装返回给前端 result.put("timeStamp", timeStamp); result.put("nonceStr", nonceStr); result.put("package", prepayId); result.put("signType", PayCpmstant.SIGN_TYPE); result.put("paySign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, payParams, payKey)); } return result.toJSONString(); } public static SortedMap prepayId(Map map) { SortedMap parameters = new TreeMap<>(); parameters.put("appId", ""); parameters.put("timeStamp", PayUtil.create_timestamp()); parameters.put("nonceStr", map.get("nonce_str")); parameters.put("package", "prepay_id=" + map.get("prepay_id")); parameters.put("signType", "MD5"); String sign = PayUtil.createSign("UTF-8", parameters, "商户秘钥"); parameters.put("prepay_id", "prepay_id=" + map.get("prepay_id")); parameters.put("paySign", sign); return parameters; } public static String h5pay(String appid, String mchId, String payKey, String notifyUrl, String body, String openid, String outTradeNo, BigDecimal money, String tradeType, String clientIp) { String nonceStr = PayUtil.makeUUID(32); SortedMap params = new TreeMap<>(); params.put("appid", appid); params.put("body", body); params.put("mch_id", mchId); params.put("nonce_str", nonceStr); params.put("notify_url", notifyUrl); params.put("openid", openid); params.put("out_trade_no", outTradeNo);// 商品订单号 params.put("spbill_create_ip", clientIp);// 用户真实ip params.put("total_fee", PayUtil.moneyToIntegerStr(money));// 费用的参数转型 params.put("trade_type", tradeType);// 对接类型 params.put("sign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, params, payKey));// MD5签名 // 转换成xml String xmlData = PayUtil.getRequestXml(params); // 请求微信后台,获取支付id String resXml = HttpClientUtil.httpsRequest(PayCpmstant.UNIFIEDORDER_URL, xmlData); log.info("请求微信支付返回参数:" + resXml); org.json.JSONObject resultData = XML.toJSONObject(resXml); JSONObject data = JSON.parseObject(resultData.get("xml").toString()); JSONObject result = new JSONObject(); if (data.get("return_msg").equals(PayCpmstant.RETURN_MSG) && data.get("return_code").equals(PayCpmstant.RETURN_CODE)) { // 将微信统一下单成功的参数拼接再签名 // 统一下单返回prepay_id if(tradeType.equals("JSAPI")) { String prepayId = "prepay_id=" + data.getString("prepay_id"); // 时间戳 Long timeStamp = System.currentTimeMillis() / 1000; // 封装需要签名的字段 SortedMap payParams = new TreeMap<>(); payParams.put("appId", appid); payParams.put("nonceStr", nonceStr); payParams.put("package", prepayId); payParams.put("signType", PayCpmstant.SIGN_TYPE); payParams.put("timeStamp", timeStamp); // 将参数以及签名计算完成封装返回给前端 result.put("timeStamp", timeStamp); result.put("nonceStr", nonceStr); result.put("package", prepayId); result.put("signType", PayCpmstant.SIGN_TYPE); result.put("paySign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, payParams, payKey)); } else if(tradeType.equals("NATIVE")) { result.put("codeUrl",data.getString("code_url")); } else if(tradeType.equals("MWEB")) { result.put("mWebUrl",data.getString("mweb_url")); } } return result.toJSONString(); } public static String refund(String appid,String mchId,String orderNo,BigDecimal totalFee,BigDecimal refundFee,String refundNo,Boolean isTest) throws Exception { //创建请求地址 String url = PayCpmstant.REFUND_URL; Map paramMap = new LinkedHashMap<>(); paramMap.put("appid",appid); paramMap.put("mch_id",mchId); paramMap.put("nonce_str", WXPayUtil.generateNonceStr()); paramMap.put("out_refund_no",refundNo); paramMap.put("out_trade_no",orderNo); paramMap.put("refund_fee",String.valueOf(refundFee.multiply(BigDecimal.valueOf(100)).longValue())); paramMap.put("total_fee",String.valueOf(totalFee.multiply(BigDecimal.valueOf(100)).longValue())); paramMap.put("sign",WXPayUtil.generateSignature(paramMap,PayCpmstant.REFUND_KEY)); log.info("微信退款请求参数:{},{},{},{}",url,WXPayUtil.mapToXml(paramMap),mchId,isTest); //接收请求返回值 return HttpClientUtil.doRefund(url,WXPayUtil.mapToXml(paramMap),mchId,isTest); } }