微信小程序支付

/**
	 * 支付接口
	 * @return
	 */
	@Log(title="微信支付(商品消费)",businessType = BusinessType.INSERT)
	@PostMapping("/wechatpaygoods")
	@ResponseBody
	public Map<String,Object> wechatPayOrderInfo(OrderInfo orderInfo){
		responseHeaderPage();
		Long memberId = orderInfo.getMemberId();
		String checkPrice = (String) orderInfo.getParams().get("checkActualPrice");
		//传入参数检查
		if(memberId != null && !memberId.equals(0L) && orderInfo.getGoodsType() != null && orderInfo.getGoodsId() != null && orderInfo.getGoodsId() != 0L && orderInfo.getGoodsNum() != null && StringUtils.isNotEmpty(checkPrice)) {
			Member member = membersService.selectMemberByMemberId(memberId);
			if(member != null) {
				//商品消费订单提交预处理
				try {
					orderInfo.setOrderType(0);
					orderInfo = orderInfoService.submitOrderInfoPretreatment(orderInfo);
					if(MoneyUtils.moneyComp(orderInfo.getOrderActualPrice(), "0.01")) {
					}else {
						return error("-2","业务逻辑错误:实际付款金额不得小于0.01元");
					}
				}catch(Exception e) {
					e.getMessage();
					e.printStackTrace();
					//return error("-2","业务逻辑错误:" + e.getMessage());
					return error("-2",e.getMessage());
				}
				orderInfo.setPaymentType(2);//微信支付
				//支付(获取appid,mchId,mchKey)
				WechatPublic wechatPublic = wechatPublicService.queryWechatPublicById(member.getWechatPublicId());
				if(wechatPublic != null){
				}else{
					return error("-2","业务逻辑错误:店铺未开通微信支付功能");
				}
				String goodsName = "商品消费金额:" + orderInfo.getOrderActualPrice();
				//支付记录表
				PayRecord payRecord = new PayRecord();
				payRecord.setOrderCode(IdUtils.getUUIDKey());
				payRecord.setOrderType(0);
				payRecord.setOrderTitle(goodsName);
				if(orderInfo.getGoodsType().equals(0)) {
					payRecord.setGoodsId(orderInfo.getGoodsId());
				}else {
					payRecord.setPackageId(orderInfo.getGoodsId());
				}
				payRecord.setPayCost(orderInfo.getOrderActualPrice());
				payRecord.setTopUpCost(orderInfo.getOrderTotalPrice());//借用充值金额字段存储订单总金额
				payRecord.setMemberId(memberId);
				payRecord.setTopUpNum((long)(int)orderInfo.getGoodsNum());//借用充值次数存储购买商品数量
				payRecord.setCouponsOperateIdStr(orderInfo.getCheckedCouponsOperate());
				if(orderInfo.getFlagForAppoint() == 1){//借用remark字段存储预约信息
					payRecord.setRemark(orderInfo.getAppointDate() + "," + orderInfo.getAppointTime() + "," + orderInfo.getAppointPhoneNum());
				}
				
				payRecordService.insertPayRecord(payRecord);
				//回调地址
				String notifyUrl = Global.getConfig("ruoyi.api_head_url") + "/api/orderinfo/wechatpayorderinfocallback";//Global.getConfig("ruoyi.api_head_url")获取yml配置参数
				//微信统一下单接口
				Map<String,Object> wechatPayMap = wechatUnifiedOrder(goodsName,payRecord.getOrderCode(),payRecord.getPayCost(),notifyUrl,member.getOpenid(),wechatPublic.getAppletId(),wechatPublic.getMchId(),wechatPublic.getMchKey());
				//返回支付记录id,用于后期查询订单信息
				wechatPayMap.put("payRecordId", payRecord.getRecordId());
				return wechatPayMap;
			}else {
				return error("-1","非法参数:该会员信息不存在");
			}
		}else {
			return error("-1","非法参数:会员ID或订单总金额为空");
		}
	}
/**
     * @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);
	        //调用统一下单接口
	        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;
                //再次签名,这个签名用于小程序端调用wx.requesetPayment方法
                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;
	}
    
/**
	 * 商品消费微信支付回调接口
	 */
	@PostMapping("/wechatpayorderinfocallback")
	@ResponseBody
	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);
				PayRecord payRecord = payRecordService.selectPayRecordByCode(outTradeNo);
				
				if(payRecord.getPayStatus().equals(0)) {//待付款
					OrderInfo orderInfo = new OrderInfo();
					orderInfo.setPaymentType(2);
					orderInfo = orderInfoService.insertOrderInfoPretreatment(orderInfo, payRecord);
					orderInfo.setThirdPartyNumber(payRecord.getOrderCode());
					int rows = orderInfoService.insertOrderInfo(orderInfo);
					if(rows > 0) {//插入成功
						try {
							rows = orderInfoService.orderInfoPaymentSuccessfully(orderInfo);
						}catch(Exception e) {//业务处理失败
							e.getMessage();
							e.printStackTrace();
						}
					}
					//订单id(微信回调接口生成保存)
					payRecord.setOrderId(orderInfo.getOrderInfoId());
					payRecord.setPayStatus(1);
					payRecordService.updatePayRecord(payRecord);
					
					logger.info("微信回调 会员商品消费付款成功");
					StringBuffer buffer = new StringBuffer();
                    buffer.append("<xml>");
                    buffer.append("<return_code>SUCCESS</return_code>");
                    buffer.append("<return_msg>OK</return_msg>");
                    buffer.append("<xml>");
                    
                    PrintWriter writer = response.getWriter();
                    writer.print(buffer.toString());
				}
			}
		}catch(IOException e) {
			e.printStackTrace();
		}catch(Exception e) {
			e.getMessage();
			e.printStackTrace();
		}
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值