OpenFeign远程调用实现

package com.java1234.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.java1234.entity.Order;
import com.java1234.feign.OrderFeignService;
import com.java1234.properties.WeixinpayProperties;
import com.java1234.service.IOrderDetailService;
import com.java1234.service.IOrderService;
import com.java1234.util.MD5Util;
import com.java1234.util.XmlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

/**
 * 微信支付Controller
 * @author java1234_小锋
 * @site www.java1234.com
 * @company 南通小锋网络科技有限公司
 * @create 2022-04-10 9:28
 */
@Controller
@RequestMapping("/pay")
public class WeixinpayController {

    @Autowired
    private IOrderService orderService;

    @Autowired
    private OrderFeignService orderFeignService;

    @Autowired
    private WeixinpayProperties weixinpayProperties;



    private final static Logger logger=LoggerFactory.getLogger(WeixinpayController.class);


    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        Order order = orderFeignService.getOne("JAVA20231005103107000000933");
        System.out.println("order:"+order);
        order.setConsignee("测试2233366666");
        orderFeignService.save(order);
        return "ok";
    }
    /**
     * 微信支付服务器异步通知
     * @param request
     * @throws Exception
     */
    @RequestMapping("/notifyUrl")
    public synchronized void notifyUrl(HttpServletRequest request)throws Exception{
        logger.info("notifyUrl");
        // 第一步 获取数据
        InputStream inputStream;
        StringBuffer sb=new StringBuffer();
        inputStream = request.getInputStream();
        String s;
        BufferedReader in=new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
        while(((s=in.readLine())!=null)){
            sb.append(s);
        }
        in.close();
        inputStream.close();
        logger.info("sb:"+sb.toString());

        // 解析xml成map
        Map<String,String> m=new HashMap<>();
        m=XmlUtil.doXMLParse(sb.toString());

        // 过滤空 设置TreeMap
        SortedMap<Object,Object> packageParams=new TreeMap<>();
        Iterator<String> it = m.keySet().iterator();
        while(it.hasNext()){
            String parameter = it.next();
            String parameterValue = m.get(parameter);

            String v="";
            if(parameterValue!=null){
                v=parameterValue.trim();
            }
            packageParams.put(parameter,v);
        }
        logger.info("packageParams:"+packageParams);

        // 微信支付的API秘钥
        String key = weixinpayProperties.getKey();

        String out_trade_no= (String) packageParams.get("out_trade_no");

        if(isTenpaySign("UTF-8",packageParams,key)){
            logger.info("验证签名通过");
            if("SUCCESS".equals(packageParams.get("result_code"))){
                Order order = orderFeignService.getOne(out_trade_no);
                if(order!=null && order.getStatus()==1){
                    order.setPayDate(new Date());
                    order.setStatus(2); // 设置已经支付状态
                    orderFeignService.save(order);
                    logger.info(out_trade_no+":微信服务器异步修改订单状态成功");
                }
            }
        }else{
            logger.info(out_trade_no+":微信服务器异步验证失败!");
        }


    }


    /**
     * 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
     * @return boolean
     */
    public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {
        StringBuffer sb = new StringBuffer();
        Set es = packageParams.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            String v = (String)entry.getValue();
            if(!"sign".equals(k) && null != v && !"".equals(v)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + API_KEY);

        //算出摘要
        String mysign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toLowerCase();
        String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();

        return tenpaySign.equals(mysign);
    }
}

    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        Order order = orderFeignService.getOne("JAVA20231005103107000000933");
        System.out.println("order:"+order);
        order.setConsignee("测试2233366666");
        orderFeignService.save(order);
        return "ok";
    }

    @RequestMapping("/getOne")
    public Order getOne(@RequestParam("orderNo")String orderNo){
        return orderService.getOne(new QueryWrapper<Order>().eq("orderNo", orderNo));
    }

    @RequestMapping("/save")
    public void save(@RequestBody Order order){
        orderService.saveOrUpdate(order);
    }
package com.java1234.feign;

import com.java1234.entity.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 订单FeignService
 */
@FeignClient("mall-order")
public interface OrderFeignService {

    @RequestMapping("/order/getOne")
    public Order getOne(@RequestParam("orderNo")String orderNo);

    @RequestMapping("/order/save")
    public void save(@RequestBody Order order);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值