| | |
| | | package com.panzhihua.common.utlis; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.panzhihua.common.constants.PayCpmstant; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.json.XML; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Map; |
| | | import java.util.SortedMap; |
| | | import java.util.TreeMap; |
| | | |
| | | @Slf4j |
| | | public class WxPayUtils { |
| | | |
| | | public static String getUnifiedorder(String body, String openid, String outTradeNo, BigDecimal money) throws Exception{ |
| | | public static String getUnifiedorder(String appid, String mchId, String payKey, String notifyUrl, String body, String openid, String outTradeNo, BigDecimal money){ |
| | | String nonceStr = PayUtil.makeUUID(32); |
| | | SortedMap<Object, Object> params = new TreeMap<>(); |
| | | params.put("appid", "wx0cef797390444b75"); |
| | | params.put("appid", appid); |
| | | params.put("body", body); |
| | | params.put("mch_id", "1608439275"); |
| | | params.put("mch_id", mchId); |
| | | params.put("nonce_str",nonceStr); |
| | | params.put("notify_url", "http://387405oo37.zicp.vip/api/applets/wx/notify"); |
| | | params.put("notify_url", notifyUrl); |
| | | params.put("openid", openid); |
| | | 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("UTF-8", params, "01A9CB2234D7CBD0AC61B75EB1263805"));//MD5签名 |
| | | 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); |
| | | System.out.println(resXml); |
| | | log.info("请求微信支付返回参数:" + resXml); |
| | | |
| | | JSONObject data = XMLUtils.xml2Json(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("OK")){ |
| | | if(data.get("return_msg").equals(PayCpmstant.RETURN_MSG) && data.get("return_code").equals(PayCpmstant.RETURN_CODE)){ |
| | | //将微信统一下单成功的参数拼接再签名 |
| | | //统一下单返回prepay_id |
| | | String prepay_id = "prepay_id=" + data.getString("prepay_id"); |
| | | String prepayId = "prepay_id=" + data.getString("prepay_id"); |
| | | //时间戳 |
| | | Long timeStamp = System.currentTimeMillis()/1000; |
| | | //封装需要签名的字段 |
| | | SortedMap<Object, Object> payParams = new TreeMap<>(); |
| | | params.put("appid", "wx0cef797390444b75"); |
| | | params.put("nonce_str",nonceStr); |
| | | params.put("package",nonceStr); |
| | | params.put("signType",nonceStr); |
| | | params.put("timeStamp",nonceStr); |
| | | 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",prepay_id); |
| | | result.put("signType","MD5"); |
| | | result.put("paySign",PayUtil.createSign("UTF-8", payParams, "01A9CB2234D7CBD0AC61B75EB1263805")); |
| | | result.put("package",prepayId); |
| | | result.put("signType",PayCpmstant.SIGN_TYPE); |
| | | result.put("paySign",PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, payParams, payKey)); |
| | | } |
| | | return result.toJSONString(); |
| | | } |