Java微信支付 -- 统一下单接口封装 (可直接调用实现)

调起微信支付 – 统一下单接口的一个方法封装。需要的同学们可以参考下。
调第三方接口用到了 restTemplate , 需要先进行注入。

注:用到的工具类,放到了文章后面。

/**
     * @title 微信支付:统一下单接口调用
     * @param goodsName 商品描述
     * @param orderCode 商品订单号(可用于支付成功回调方法的查询)
     * @param buyCost 标价金额
     * @param notifyUrl 支付成功通知回调地址
     * @param openId 会员openid
     * @param appId 公众号appid
     * @param mchId 商户平台id
     * @remark body的传输字符编码:把tomcat中server.xml文件中的URIEncoding改为 UTF-8
			  <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
     * @return
     */
    @SuppressWarnings({
    "rawtypes", "unchecked" })
    protected Map<String,Object> wechatUnifiedOrder(String goodsName, String orderCode, String buyCost, String notifyUrl, String openId, String appId, String mchId,String mchKey){
   
    	
    	Map<String,Object> response = new HashMap<String,Object>();
    	
    	try {
   
	    	//生成的随机字符串
			String nonce_str = WXPayUtil.generateNonceStr();
			//商品描述
			String body = goodsName;
			//商户订单号
			String out_trade_no = orderCode;
			//标价价额
			String total_fee = MoneyUtils.moneyMul(buyCost, "100");
			//终端Ip
			String spbill_create_ip = IpUtils.getIpAddr(getRequest());
			//通知地址
			String notify_url = notifyUrl;
			//交易类型
			String trade_type = "JSAPI";
			//OpenId
			String openid = openId;
			//商户key
			String mch_key = mchKey;
			
			//1.参数封装
			Map<String,String> packageParams = new HashMap<String,String>();
			//公众账号ID
	        packageParams.put("appid", appId);
	        //商户号
	        packageParams.put("mch_id", mchId);
	        //随机字符串
	        packageParams.put("nonce_str", nonce_str);
	        packageParams.put("body", new String(body.getBytes(),"utf-8"));
	        //交易订单号
	        packageParams.put("out_trade_no", out_trade_no);
	        //金额(分)
	        packageParams.put("total_fee", total_fee);
	        packageParams.put("spbill_create_ip", spbill_create_ip);
	        packageParams.put("notify_url", notify_url);
	        //交易类型
	        packageParams.put("trade_type", trade_type);
	        //用户标示
	        packageParams.put("openid", openid);
        
	        String xmlParam = WXPayUtil.generateSignedXml(packageParams, mch_key);
	    	
	    	/** 建立编码请求头  */
	    	HttpHeaders headers = new HttpHeaders();
	        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
	        headers.setContentType(type);
	        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
			HttpEntity formEntity = new HttpEntity(xmlParam ,headers);
			System.out.println("调试模式_统一下单接口 请求XML数据:" + formEntity);
	        //调用统一下单接口  WechatConstants.API_PAY_UNIFIEDORDER :https://api.mch.weixin.qq.com/pay/unifiedorder
	        String result = new String(restTemplate.postForObject(WechatConstants.API_PAY_UNIFIEDORDER, formEntity, String.class).getBytes(),"UTF-8");
	        System.out.println("调试模式_统一下单接口 返回XML数据:" + result);
	        
	        //将解析结果存储在HashMap中
			Map map = WechatPayUtils.doXMLParse(result);
			String return_code = (String) map.get("return_code");//返回状态码
			
			if(return_code.equals("SUCCESS")){
   
				response.put("return_code", "SUCCESS");
				//业务结果
                String prepay_id = (String) map.get("prepay_id");//返回的预付单信息
                response.put("nonceStr", nonce_str);
                response.put("package", "prepay_id=" + prepay_id);
                Long timeStamp = System.currentTimeMillis() / 1000;
                response.put("timeStamp", timeStamp + "");//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
  
  
                String stringSignTemp = "appId=" + appId + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id+ "&signType=" + "MD5" + "&timeStamp=" + timeStamp;
                //再次签名,1. 用于小程序端调用wx.requesetPayment方法 2.用于微信网页js-api的wx.chooseWXPay方法 
                String paySign = WechatPayUtils.sign(stringSignTemp, mchKey, "utf-8").toUpperCase();
                logger.info("=======================第二次签名:" + paySign + "=====================");
                
                response.put("paySign", paySign);
                response.put("appid", appId);
                
			}else {
   
				response.put("return_code", "ERROR");
				response.put("msg", "统一下单接口调用失败 "+(String) map.get("return_msg"));
			}
			
        } catch (Exception e) {
   
			e.printStackTrace();
		}
        
        return response;
	}

用户下单成功后 – 回调接口:

public void wechatPayFastConCallBack(HttpServletRequest request,HttpServletResponse response) {
   
		logger.info("微信回调接口方法start");
		logger.info("微信回调接口操作逻辑start");
		String inputLine = "";
		String notifyXml = "";
		try {
   
			while((inputLine = request.getReader().readLine()) != null) {
   
				notifyXml += inputLine;
			}
			request.getReader().close();
			logger.info("微信回调内容信息:" + notifyXml);
			
			@SuppressWarnings("unchecked")
			Map<String,String> map = WechatPayUtils.doXMLParse(notifyXml);
			
			if("SUCCESS".equals(map.get("result_code"))) {
   //支付成功
				logger.info("微信回调返回是否支付成功:是");
				String outTradeNo = map.get("out_trade_no");
				logger.info("微信回调返回商户订单号:" + outTradeNo);
				
				//你的支付成功后的相关逻辑
				
			}
		}catch(IOException e) {
   
			e.printStackTrace();
		}catch(Exception e) {
   
			e.getMessage
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值