分为三步,
1、JSSDK要获取config:官方文档(前置)
注意根据base_token(access_token)
Map<String,Object> resultMap = new HashMap<>();
String geturl = WechatConfig.GET_TICKET_URL+"?access_token="+this.selectByUseHome(StatusCode.TOKEN_HOME_1)+"&type=jsapi";
String returnResult = HttpReqUtil.HttpsDefaultExecute(Constant.GET_METHOD,geturl, null, null, null);
logger.info("WeixinTokenServiceImpl getJsapiTicket:"+returnResult);
JSONObject jsonObject = JSONObject.parseObject(returnResult);
resultMap.put("noncestr", PayUtil.createNonceStr());//随机字符串
resultMap.put("jsapi_ticket", jsonObject.getString("ticket"));
resultMap.put("timestamp", PayUtil.createTimeStamp());
resultMap.put("url", url);
/**** 用对象进行签名 ****/
String paySign = SignatureUtil.createSha1Sign(resultMap, null,Constant.DEFAULT_CHARACTER_ENCODING);
String signature = paySign.toLowerCase();
logger.info("WeixinTokenServiceImpl getJsapiTicket paySign:"+signature+",noncestr:"+resultMap.get("noncestr")+",jsapi_ticket:"+resultMap.get("jsapi_ticket")+",timestamp:"+resultMap.get("timestamp")+"url:"+url);
resultMap.put("signature", signature);
2、微信预支付:官方文档
3、组装微信支付参数:官方文档
2和3放在一起
@Override
public Map<String, Object> preOrder(HttpServletRequest request) {
Map<String, Object> resultMap = new HashMap<>();
TOrdOrderInfo orderMap = orderMapper.queryOrderByNo(request.getParameter("orderNo"));
if(orderMap == null) {
throw new BussinessException(CodeEnum.ORDER_NOT_EXIST);
}
String spbill_create_ip = HttpReqUtil.getRemortIP(request);
logger.info(" preOrder 支付IP {} ", spbill_create_ip);
String nonce_str = PayUtil.createNonceStr(); // 随机数据
// 参数组装
UnifiedOrderParams unifiedOrderParams = new UnifiedOrderParams();
unifiedOrderParams.setAppid(WechatConfig.APP_ID);// 必须
unifiedOrderParams.setMch_id(WechatConfig.MCH_ID);// 必须
unifiedOrderParams.setOut_trade_no(request.getParameter("orderNo").trim());// 必须
unifiedOrderParams.setBody("ceshi");// 必须 微信支付-支付测试
// unifiedOrderParams.setTotal_fee(PayUtil.getFen(new BigDecimal(orderMap.get("transAmt").toString()))); // 必须
int total_fee = 1; // 产品价格1分钱,用于测试
unifiedOrderParams.setTotal_fee(total_fee);// 金额必须
unifiedOrderParams.setNonce_str(nonce_str); // 必须
unifiedOrderParams.setSpbill_create_ip(spbill_create_ip); // 必须
unifiedOrderParams.setTrade_type("JSAPI"); // 必须
unifiedOrderParams.setOpenid(request.getParameter("openId").trim());
// unifiedOrderParams.setAttach(order.getMerNo());
unifiedOrderParams.setNotify_url(WechatConfig.NOTIFY_URL);// 异步通知url
// 统一下单 请求的Xml(正常的xml格式)
String unifiedXmL = MsgUtil.abstractPayToXml(unifiedOrderParams);// 签名并入util
logger.info(" preOrder unifiedXmL "+unifiedXmL);
// 返回<![CDATA[SUCCESS]]>格式的XML
String unifiedOrderResultXmL = HttpReqUtil.HttpsDefaultExecute(Constant.POST_METHOD,
WechatConfig.UNIFIED_ORDER_URL, null, unifiedXmL, null);
logger.info(" preOrder unifiedOrderResultXmL "+unifiedOrderResultXmL);
// 进行签名校验
try {
if (SignatureUtil.checkIsSignValidFromWeiXin(unifiedOrderResultXmL, WechatConfig.API_KEY, null)) {
String timeStamp = PayUtil.createTimeStamp();
// 统一下单响应
UnifiedOrderResult unifiedOrderResult = XmlUtil.getObjectFromXML(unifiedOrderResultXmL,UnifiedOrderResult.class);
resultMap.put("appId", WechatConfig.APP_ID);
resultMap.put("timeStamp", timeStamp);
resultMap.put("nonceStr", nonce_str);// 直接用返回的
resultMap.put("package", "prepay_id=" + unifiedOrderResult.getPrepay_id());
resultMap.put("signType", "MD5");
/**** 用对象进行签名 ****/
String paySign = SignatureUtil.createSign(resultMap, WechatConfig.API_KEY,
Constant.DEFAULT_CHARACTER_ENCODING);
resultMap.put("paySign", paySign);
// obj.setPaySign(paySign);
logger.info(" preOrder nonce_str "+nonce_str+" prepay_id:"+unifiedOrderResult.getPrepay_id() +","
+ " result_code:"+unifiedOrderResult.getResult_code()+", paySign:"+paySign+",timeStamp:"+timeStamp);
return resultMap;
} else {
throw new BussinessException(CodeEnum.WX_PAY_FAIL);
}
} catch (Exception e) {
throw new BussinessException(CodeEnum.WX_SERVICE_ERROR);
}
}