public class AlipayConfig { // 支付宝网关(固定) // "https://openapi.alipaydev.com/gateway.do";//沙箱网关 public static final String GATEWAYURL = "https://openapi.alipay.com/gateway.do"; // APPID 即建立应用后生成 // public static final String APPID = "2016092100564910";//沙箱 // 开发者私钥,由开发者本身生成 public static final String APP_PRIVATE_KEY = "xxx"; // 参数返回格式,只支持json public static final String FORMAT = "json"; // 参数返回格式,只支持json public static final String CHARSET = "UTF-8"; // 支付宝公钥,由支付宝生成 public static final String ALIPAY_PUBLIC_KEY = "xxx"; // 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 public static final String SIGN_TYPE = "RSA2"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外 网能够正常访问 public static final String NOTIFY_URL = "http://公网地址"; // 同步返回地址,HTTP/HTTPS开头字符串,非必填 public static final String RETURN_URL = "http://公网地址"; public static final String TimeoutExpress = "1m";// 交易的过时时间,要与redis的二维码同步的 }
AlipayManger工具类:前端
/** * @Description:电脑网站支付 * @author */ public class AlipayManger { /** * alipayClient只须要初始化一次,后续调用不一样的API均可以使用同一个alipayClient对象。 */ private static volatile AlipayManger instance; private static volatile AlipayClient alipayClient; private AlipayManger() { alipayClient = new DefaultAlipayClient(AlipayConfig.GATEWAYURL, AlipayConfig.APPID, AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGN_TYPE); } public static AlipayManger getInstance() { if (instance == null) { synchronized (AlipayManger.class) { if (instance == null) { instance = new AlipayManger(); } } } return instance; } /** * 支付页面:支付操做 * * @param out_trade_no 订单号 * @param total_amount 支付总金额 * @param subject 商品名称 * @return * @throws AlipayApiException */ public AlipayTradePagePayResponse TradePagePay(String out_trade_no, Double total_amount, String subject) { AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); AlipayTradePagePayModel model = new AlipayTradePagePayModel();//用来封装参数的一个类 model.setOutTradeNo(out_trade_no); model.setTotalAmount(String.valueOf(total_amount)); model.setSubject(subject); model.setProductCode("FAST_INSTANT_TRADE_PAY"); model.setTimeoutExpress(AlipayConfig.TimeoutExpress); request.setBizModel(model); request.setNotifyUrl(AlipayConfig.NOTIFY_URL);//设置-异步通知页面 request.setReturnUrl(AlipayConfig.RETURN_URL);//设置-支付成功后同步跳转到哪一个页面 AlipayTradePagePayResponse response = null; try { response = alipayClient.pageExecute(request); } catch (AlipayApiException e) { e.printStackTrace(); } return response; } /** * 统一订单查询接口 * * @param out_trade_no 订单号 * @return * @throws AlipayApiException */ public AlipayTradeQueryResponse TradePayQuery(String out_trade_no) { AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); AlipayTradeQueryModel model = new AlipayTradeQueryModel(); model.setOutTradeNo(out_trade_no); request.setBizModel(model); AlipayTradeQueryResponse response = null; try { response = alipayClient.execute(request); } catch (AlipayApiException e) { e.printStackTrace(); } return response; } /** * 基本退款接口 * * @param out_trade_no 订单号 * @param refundAmount 退款金额 * @param refundReason 退款理由 * @return */ public AlipayTradeRefundResponse TradeRefund(String out_trade_no, String refundAmount, String refundReason) { AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); AlipayTradeRefundModel model = new AlipayTradeRefundModel(); model.setOutTradeNo(out_trade_no); model.setRefundAmount(refundAmount); model.setRefundReason(refundReason); request.setBizModel(model); AlipayTradeRefundResponse response = null; try { response = alipayClient.execute(request); } catch (AlipayApiException e) { e.printStackTrace(); } return response; } /** * 商户的退款查询接口 * * @param out_trade_no 订单号 * @param out_request_no 部分退款传参 * @return */ public AlipayTradeFastpayRefundQueryResponse TradeFastpayRefundQuery(String out_trade_no, String out_request_no) { AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest(); AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel(); model.setOutTradeNo(out_trade_no); boolean flag = StringUtils.isEmpty(out_request_no); model.setOutRequestNo(flag ? out_trade_no : out_request_no); request.setBizModel(model); AlipayTradeFastpayRefundQueryResponse response = null; try { response = alipayClient.execute(request); } catch (AlipayApiException e) { e.printStackTrace(); } return response; } /** * 支付宝服务器异步通知 * 此处要当成一个接口能够经过url进行访问,而且只有放到公网上, * 在支付里面配置了request.setNotifyUrl(AlipayConfig.NOTIFY_URL * 程序支付成功后才会异步处理,失败和订单超时不会进行异步的 * * @param request * @throws UnsupportedEncodingException */ public void NotifyUrl(HttpServletRequest request) throws UnsupportedEncodingException { Map<String, String> params = new HashMap<String, String>(); Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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] + ","; } // 乱码解决,这段代码在出现乱码时使用 try { valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } params.put(name, valueStr); } boolean signVerified = false; try { signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGN_TYPE); } catch (AlipayApiException e) { e.printStackTrace(); } // 调用SDK验证签名 if (signVerified) {// 验证成功,进行业务逻辑的处理 // 商户订单号 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"); if (trade_status.equals("TRADE_SUCCESS")) { /** * 返回的状态是success,接下来能够:更改订单支付成功状态,设置支付信息,等等业务处理…… */ System.out.println("success"); } else { /** * fail 的业务处理:…… */ System.out.println("fail"); } } } /** * 对于支付宝同步跳转页面(return_url),里面的代码和异步的是同样的 * 咱们能够在同步页面中拿到支付宝给你返回的订单信息,而后写个接口,将数据返给前端,让前端进行展现 */ }
ServiceImpl层的使用:java
@Service public class OrderPayServiceImpl implements OrderPayService { static AlipayManger instance = AlipayManger.getInstance();//获取咱们封装的 支付实例 /** * ali电脑支付,前端调用这个接口,将body展现到页面上,就能够跳到支付宝三方到页面上了 */ @Override public String aliPayTradePay(String name, String orderNo, Double price) { AlipayTradePagePayResponse response = instance.TradePagePay(orderNo, price, name); // payCacheImpl.setQrCodeExp(response.getBody(), orderNo, // AlipayConfig.TimeoutExpress, 1); System.out.println(response.getBody()); orderOverTime(orderNo, price, AlipayConfig.TimeoutExpress);// 订单超时未付款处理 return response.getBody();//是form表单,咱们最终须要的二维码数据 } }
以上的这些功能能够完成基础的支付宝电脑支付的功能了,具体的代码仍是要看业务的流程的,若还须要其余的功能,去蚂蚁提供的开发平台查看吧 电脑网站支付文档 这里面还有API,DEMO,错误处理等等……,剩下的只能看你们的了,写的很差还请见谅 ^ - ^web