微信支付和支付宝支付接口笔记

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: ssm 专栏: 爱旅行项目 标签: 支付宝和微信支付

2023-02-28 10:58:53 451浏览

微信支付和支付宝支付接口笔记

支付宝的4个接口

@Controller
public class AlipayController {

    @Autowired
    OrderService orderService;


    //写一个确认订单信息的页面
    @GetMapping("/api/prepay/{orderNo}")
    public String prepay(@PathVariable String orderNo, Model model){
        try {
            ItripHotelOrder order= orderService.prepay(orderNo);

            model.addAttribute("order",order);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "pay";
    }

    //确认订单信息之后去付款  跳到支付宝的页面
    @PostMapping("/api/pay")
    public void pay(HttpServletRequest request, HttpServletResponse response){
        if(request.getParameter("WIDout_trade_no")!=null){
            // 商户订单号,商户网站订单系统中唯一订单号,必填
            String out_trade_no = request.getParameter("WIDout_trade_no");
            // 订单名称,必填
            String subject = request.getParameter("WIDsubject");
            System.out.println(subject);
            // 付款金额,必填
            String total_amount=request.getParameter("WIDtotal_amount");
            // 商品描述,可空
            String body = request.getParameter("WIDbody");
            // 超时时间 可空
            String timeout_express="2m";
            // 销售产品码 必填
            String product_code="QUICK_WAP_WAY";
            /**********************/
            // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
            //调用RSA签名方式
            AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
            AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();

            // 封装请求支付信息
            AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
            model.setOutTradeNo(out_trade_no);
            model.setSubject(subject);
            model.setTotalAmount(total_amount);
            model.setBody(body);
            model.setTimeoutExpress(timeout_express);
            model.setProductCode(product_code);
            alipay_request.setBizModel(model);
            // 设置异步通知地址
            alipay_request.setNotifyUrl(AlipayConfig.notify_url);
            // 设置同步地址
            alipay_request.setReturnUrl(AlipayConfig.return_url);

            // form表单生产
            String form = "";
            try {
                // 调用SDK生成表单
                form = client.pageExecute(alipay_request).getBody();
                response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
                response.getWriter().write(form);//直接将完整的表单html输出到页面
                response.getWriter().flush();
                response.getWriter().close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //同步通知   究竟客户有没有付款成功

    @GetMapping("/api/returnUrl")
    public String returnUrl(HttpServletRequest request) throws Exception {
        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号

        String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

        //支付宝交易号

        String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        //计算得出通知验证结果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");

        if(verify_result){//验证成功
           //修改订单状态  改库存  跳转页面
             ItripHotelOrder order= orderService.prepay(out_trade_no);
            if(order.getOrderStatus() ==0){
                order.setTradeNo(trade_no);
                order.setPayType(1);//支付类型:1支付宝  2微信
                orderService.updateOrderStatus(order);
                orderService.updateStore(order);
            }

            //跳转页面
            return "redirect:"+"http://localhost:3000/#/orderpaystate";

        }else{
            return "redirect:"+"http://localhost:3000/#/orderpaystate?state=0";

        }
    }

    //异步通知   究竟客户有没有付款成功
    @PostMapping("/api/notifyUrl")
    @ResponseBody
    public String notifyUrl(HttpServletRequest request) throws Exception {

        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
            params.put(name, valueStr);
        }
        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
        //商户订单号

        String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
        //支付宝交易号

        String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

        //交易状态
        String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
        //计算得出通知验证结果
        //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");

        if(verify_result){//验证成功
            //////////////////////////////////////////////////////////////////////////////////////////
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

            if(trade_status.equals("TRADE_FINISHED")){
            } else if (trade_status.equals("TRADE_SUCCESS")){
                //修改订单状态  改库存  跳转页面
                ItripHotelOrder order= orderService.prepay(out_trade_no);
                if(order.getOrderStatus() ==0){
                    order.setTradeNo(trade_no);
                    order.setPayType(1);//支付类型:1支付宝  2微信
                    orderService.updateOrderStatus(order);
                    orderService.updateStore(order);
                }

            }

            return "success";


            //////////////////////////////////////////////////////////////////////////////////////////
        }else{//验证失败
            return "fail";
        }

    }

}

微信的3个接口

@RestController
public class WxPayController {
    @Autowired
    Wxconfig wxconfig;
    @Autowired
    OrderService orderService;

    /**
     * 生成付款二维码
     * @param orderNo
     * @return
     * @throws Exception
     */
    @GetMapping("/api/wxpay/createqccode/{orderNo}")
    public Dto createqccode(@PathVariable String orderNo) throws Exception {
        Map<String,String> map = new HashMap<>();
        map.put("body","爱旅行房费");
        map.put("out_trade_no",orderNo);
        map.put("total_fee","1");
        map.put("spbill_create_ip","123.12.12.123");
        map.put("notify_url","http://jmt759.natappfree.cc/trade/api/wxpay/notify");
        map.put("trade_type","NATIVE");

        WXPay wxPay = new WXPay(wxconfig);
        Map<String, String> stringMap = wxPay.unifiedOrder(map);

        if(stringMap.get("return_code").equals("SUCCESS")){
            String codeUrl = stringMap.get("code_url");

            Map<String,Object> newmap= new HashMap<>();

            ItripHotelOrder order = orderService.prepay(orderNo);
            newmap.put("codeUrl",codeUrl);
            newmap.put("payAmount",order.getPayAmount());
            newmap.put("count",order.getCount());
            newmap.put("hotelName",order.getHotelName());
            newmap.put("roomId",order.getRoomId());

            return DtoUtil.returnDataSuccess(newmap);
        }
        return DtoUtil.returnFail("生成付款二维码失败", ErrorCode.AUTH_UNKNOWN);

    }

    /**
     *异步通知:微信回调,如果用户支付成功就修改订单状态和实时库存
     * @param request
     * @throws Exception
     */
    @RequestMapping("/api/wxpay/notify")

    public String notify(HttpServletRequest request) throws Exception {
        ServletInputStream inputStream = request.getInputStream();

        String xmlStr = IOUtils.toString(inputStream, "utf-8");
        Map<String, String> stringMap = WXPayUtil.xmlToMap(xmlStr);

        if (stringMap.get("return_code").equals("SUCCESS")) {
            //付款成功了
            //修改订单状态  改库存
            ItripHotelOrder order= orderService.prepay(stringMap.get("out_trade_no"));
            if(order.getOrderStatus() ==0){
                order.setTradeNo(stringMap.get("transaction_id"));
                order.setPayType(2);//支付类型:1支付宝  2微信
                orderService.updateOrderStatus(order);
                orderService.updateStore(order);
            }


            //告诉微信不需要再烦我了,我已经收到过通知了

            Map<String,String> newmap = new HashMap<>();
            newmap.put("return_code","SUCCESS");
            newmap.put("return_msg","OK");

            String toXml = WXPayUtil.mapToXml(newmap);
            return toXml;

        }
        return "";

    }

    //刷新页面(一直查用户有没有付款这个订单,前端验证这个订单状态是不是2)

    @GetMapping("/api/wxpay/queryorderstatus/{orderNo}")
    public Dto queryorderstatus(@PathVariable String orderNo){
        try {
            ItripHotelOrder order= orderService.prepay(orderNo);

            return DtoUtil.returnDataSuccess(order);
        } catch (Exception e) {
            e.printStackTrace();
            return DtoUtil.returnFail("订单号错误",ErrorCode.AUTH_UNKNOWN);
        }


    }
}


好博客就要一起分享哦!分享海报

此处可发布评论

评论(2展开评论

蓝色妖姬 能力:10

2023-02-28 15:53:33

谢谢尹志文为我付了2元,哈哈哈哈哈,他真的好蠢
蓝色妖姬 能力:10

2023-02-28 15:52:16

尹志文啥子
点击查看更多评论

展开评论

您可能感兴趣的博客

客服QQ 1913284695