Springboot支付宝支付
亚利桑那的天空 人气:01.需要的Maven依赖
// 支付宝 <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.8.73.ALL</version> </dependency>
2.controller层
/** * 统一下单接口 * @param orderNo 订单号 * @param request * @return */ @PostMapping("/unifiedOrder") @CrossOrigin(origins = "*",maxAge = 3600)//跨域 public ResultMap unifiedOrder(@RequestParam("orderNo") String orderNo,@RequestParam("payType") Integer payType, HttpServletRequest request){ try { // 1、验证订单是否存在 // 2、开始微信支付统一下单 Orders orders = ordersService.FindOrder(orderNo); ResultMap resultMap =null; if(orders!=null){ if(payType==1){ String spbill_create_ip = getIpAddr(request); resultMap = wxPayService.unifiedOrder(orders.getOrderNo(),orders.getTotalPrice(),"云App",spbill_create_ip); Hotel hotel= hotelMapper.selHotelById(orders.getHId()); Note note=new Note(); String s=note.Notefs(hotel.getPhone(),1); ordersService.updataorderpaytype(orders.getOrderNo(),payType); return resultMap; }else if(payType==2){ // 2、创建支付宝订单 String orderStr = alipayService.createOrder(orders.getOrderNo(), orders.getTotalPrice(),"App"); ordersService.updataorderpaytype(orders.getOrderNo(),payType); return ResultMap.ok().put("data",orderStr); } } return resultMap;//系统通用的返回结果集 } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); return ResultMap.error("服务器异常,付款失败"); } } //这是支付宝异步回调函数 /** * 支付异步通知 * 接收到异步通知并验签通过后,一定要检查通知内容, * 包括通知中的app_id、out_trade_no、total_amount是否与请求中的一致,并根据trade_status进行后续业务处理。 * https://docs.open.alipay.com/194/103296 */ @PostMapping("/notify") @CrossOrigin(origins = "*",maxAge = 3600)//跨域 public String notify(HttpServletRequest request, HttpSession session) { // 调用service层rsaCheckV1验证签名 boolean flag = alipayService.rsaCheckV1(request); if (flag) { String tradeStatus = request.getParameter("trade_status"); // 交易状态 String outTradeNo = request.getParameter("out_trade_no"); // 商户订单号 String tradeNo = request.getParameter("trade_no"); // 支付宝订单号 /** * 还可以从request中获取更多有用的参数,自己尝试 */ //调用service层notify函数 boolean notify = alipayService.notify(tradeStatus, outTradeNo, tradeNo); if(notify){ return "success"; } } return "fail"; }
3.service层
private String publicKey="公钥"; @Override public String createOrder(String orderNo, double amount, String body) throws AlipayApiException { //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 //构造client //构造client CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); //设置网关地址https://openapi.alipay.com/gateway.do certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); //设置应用Id certAlipayRequest.setAppId("appid"); //设置应用私钥 certAlipayRequest.setPrivateKey("应用私钥"); certAlipayRequest.setFormat("json"); //设置字符集 certAlipayRequest.setCharset("UTF-8"); //设置签名类型 certAlipayRequest.setSignType("RSA2"); //设置应用公钥证书路径 certAlipayRequest.setCertPath("证书验证的应用公钥证书路径"); //设置支付宝公钥证书路径 certAlipayRequest.setAlipayPublicCertPath("证书验证的支付宝公钥证书路径"); //设置支付宝根证书路径 certAlipayRequest.setRootCertPath("证书验证的支付宝根证书路径"); //构造client AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setSubject(body); model.setOutTradeNo(orderNo); model.setTotalAmount(String.valueOf(amount)); model.setTimeoutExpress("30m"); /*model.setTotalAmount("0.01");*/ model.setProductCode("QUICK_MSECURITY_PAY"); /* model.setPassbackParams("公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数");*/ //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest(); ali_request.setBizModel(model); ali_request.setNotifyUrl("回调地址");// 回调地址 AlipayTradeAppPayResponse ali_response = alipayClient.sdkExecute(ali_request); //就是orderString 可以直接给客户端请求,无需再做处理。 return ali_response.getBody(); } //支付宝签名验证 @Override public boolean rsaCheckV1(HttpServletRequest request){ try { //获取支付宝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] + ","; } //乱码解决,这段代码在出现乱码时使用。 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。 //boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType) boolean flag = AlipaySignature.rsaCertCheckV1(params, publicKey, alipayConfig.getCharset(),"RSA2"); /* 千万不要调用错了!!!上面的才是证书验证调用的函数这个是普通验证调用函数 boolean verifyResult = AlipaySignature.rsaCheckV1(params, publicKey, alipayConfig.getCharset(), alipayConfig.getSignType());*/ System.out.println("flag-----------"+flag); return flag; }catch (AlipayApiException e) { logger.debug("verify sigin error, exception is:{}",e); return false; } } //notify()支付成功或者失败后一系列操作 @Override public boolean notify(String tradeStatus, String orderNo, String tradeNo) { if ("TRADE_FINISHED".equals(tradeStatus) || "TRADE_SUCCESS".equals(tradeStatus)) { Orders orders =ordersMapper.FindOrder(orderNo); // 支付成功,根据业务逻辑修改相应数据的状态 int state =ordersMapper.updateOrder(DateUtil.now(),orderNo); Hotel hotel= hotelMapper.selHotelById(orders.getHId()); Note note=new Note(); String s=note.Notefs(hotel.getPhone(),1); // boolean state = orderPaymentService.updatePaymentState(orderNo, tradeNo); if (state!=0) { return true; }else { UMember m= memberMapper.selMemByOrderNo(orderNo); Boolean b= userMapper.updateVip(m.getOpenId(),2); } } //支付失败查询订单详情得到用户id Orders orders=ordersMapper.FindOrder(orderNo); //将扣除的积分返还 if(orderNo!=null){ //添加用户积分 ordersMapper.RefundIntegral(orders.getOpenId(),orders.getIntegral()); /*//添加退回积分记录 ordersMapper.insIntegralRecord(orders.getOpenId(),orders.getIntegral(),1,2);*/ } return false; }
哈哈,以上仅为基础版证书验证支付宝支付的源码,有很大的优化空间,需要小伙伴自己去优化了!
加载全部内容