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<Object, Object> 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<Object, Object> 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<Object, Object> prepayId(Map<String, String> map) {
|
SortedMap<Object, Object> 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<Object, Object> 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<Object, Object> 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<String, String> 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);
|
|
}
|
}
|