JAVA微信支付(公众号支付JSAPI)

分为三步,

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);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值