游戏迷提供最新游戏下载和手游攻略!

SpringBoot 集成支付宝电脑网站支付指南

发布时间:2024-10-16浏览:88

一:简介

电脑支付常用于电商和后台管理系统的账户充值等场景。

电脑网站支付 文档

电脑网站支付流程图

二:集成步骤

0. 创建应用、配置密钥

集成前需要先创建应用、配置密钥、回调地址等以及alipay-sdk-java.jar和alipay-trade-sdk.jar请查看Spring Boot入门教程(三十五):支付宝集成-准备工作

1. dependency

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- alipay begin --> <dependency> <groupId>com.alipay</groupId> <artifactId>alipay-sdk-java</artifactId> <version>20170725114550</version> </dependency> <dependency> <groupId>com.alipay</groupId> <artifactId>alipay-trade-sdk</artifactId> <version>20161215</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.1</version> </dependency> <!-- alipay end --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency></dependencies>

2. application.yml

# 沙箱账号pay: alipay: gatewayUrl: https://openapi.alipaydev.com/gateway.do appid: 2016091400508498 appPrivateKey: MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCtXKWs+trRSuCxEUvlsEeSAuLWs3B/Dh74R8223BnfzoA29aGeoycAqfKlBMcbzU2G1KayESvZKGpwBLeejSbecRYjgZsQDyEaDimQQJtGFvZVV6u4XNnvIJ72eQzEaEIQfuiorjBTLm6DQuds4R0GxftqON6QFoIZkWB9ZrZKd02cuy16dW+UqtLVGGAHcCIAkB63zUiKSNfweMddneZ7MVs3lvu3xhMnD+5us/+n2Vp4qhfmpYLcdqIW6InU4GypeoOpyUTrfUGpgdR0l924vHy/GQJZEKFaRcK3cYK+ECyKpSIoqaJJFLHbkqsliuPpMUG+rM3jiqeIAH4psAznAgMBAAECggEBAJ5jyEbbxrJzrAh7GhHX1fwUQPYSadTbrPYAfHX2cHlnrQMJtsk+nTLhEv0r+VJwZ8WpYkfMong8kcqYtL7ajcmsHqMAFhE9EWxBxj2ymWsXLabZe93sj30IG9Rq0nxcGQgDO0RqKWLGSFgK93Al2KRInKT3InkY53K+vR61ihVLmGf7+GwPtIZteBy+tuAyvcj2RlkYvjiFi3ySyZ1wA3sJIlgrGiixd6fj20XFGNE3CnAwu0BJgXXbP/S9J4C0RRa3ZXj8fX7oONhVxz2xKxn7AT4e8OWjt7J41H2LRct8Fgl9pqgz2FJYv/WfbkG8x9fGiKYYvPXoxjjrk/tkewkCgYEA8f9Lcu5JPrE9rpw9zlwhm5cOO81xLxdwL5R5/1bRP48BZGIYuqlCbVvjJVqtO8eTnLhUwH7fG8B7cmoeO9bGr9GQrtfyCqz6FtVymTBieJlfgZDVhtzyv2qKOBMIFE8jsbSBK/NHHMvykJ+XdQ1riwCeQDdXICRuYTTFwGk2OsUCgYEAt2SoN95tVmVrvKG6ATLNEtge/ozeVywA4GjltrSw/G9vqp+DkkT2pY19uROuzMazoTzKWpPho2q/qzNlv/ANbOFM2GEmKamQ7CO88JgRxMsPTvc/HxCLU/ClMJU8LcOf9LfP2KYZpPwuheKJoF4vDGj8NsbFmccJyYSdpkNEk7sCgYBJlL2FMaz1sgC2Ue19DIhvfaunRV1P20mSPgwmNmijccETm7w3LXX0OIdFeV/JGHLqqSWj7i+6iXk/ncKZoUGCfi8G6sQ+uL/GJ5qTt6GJV+ExTS+PtSjeSO/EAw1m13Vb+C16hpstx1l23f+4aJ81gbecgPct38XsKpaiXZtOnQKBgQCMsN7QRYYxwoq9YoDUzIlAzKYyeBVWYL6najHYUZR5hG/xQIBqZRem9/4cTvpJxKInrwA6LrrqaEl0aHDFp75U6h7O3PCvA5PXZK9dD/yJsZIj7U/yX/nTQokn1UUegrYiwiTkusBvrrtuINWePsLvTVc4GpObHnPmsiNTWsWwYwKBgENaeTNOCHV2km/ysXQSEIhKbtlAMQPsgWHCt/bzHlF9m18izb1LrJyjzcSsd+Zy78R+pv4G50Q27c3e/DFPz/wYxN/yHWRbyLBA8ipJbCtMtPEdS9krpmN6cChIdLGbz4CVUqOPSRzNb9lhhgPCcCNRq6DG3HBceb1Se9VnO3zk alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApFQKccMq+wPoWh93DcX3XYrnT7FJ3gntJA/jEwgk6Jd3iEVS2CyUCCgFVcQn8xjXT81YbZHYvoC50IBuu+A+Ey+J8VIgsBm5g9uwbOLRf66GrZjuKOlalHm5gHXjcL2gZRMBJEStOxstcO2YQriqhQzdL3EKp+HQc9u14IOVFpZdR8qq1l7CzKHn1vQo/1fUPfUrTLQqSuQTU9Ospv/QHFqOJA7DPetUQ+jnaZ082f3clr4ITw4EE8A6IWqTXcETTx5j/udCGP84g2Y4j+8i9DqYGyD5ePVgt4G0ICBX1bi1qNlylfxRg8Y3c1DFrRGyr0NpKQxSVXkYaVNvrCoudQIDAQAB returnUrl: http://s9v2cw.natappfree.cc/alipay/return notifyUrl: http://s9v2cw.natappfree.cc/alipay/notifyspring: thymeleaf: prefix: classpath:/templates/ suffix: .html mode: HTML5 encoding: UTF-8

3. AlipayProperties

/** * 支付宝支付的参数配置 * * @author mengday zhang */@Data@Slf4j@ConfigurationProperties(prefix = "pay.alipay")public class AlipayProperties { /** 支付宝gatewayUrl */ private String gatewayUrl; /** 商户应用id */ private String appid; /** RSA私钥,用于对商户请求报文加签 */ private String appPrivateKey; /** 支付宝RSA公钥,用于验签支付宝应答 */ private String alipayPublicKey; /** 签名类型 */ private String signType = "RSA2"; /** 格式 */ private String formate = "json"; /** 编码 */ private String charset = "UTF-8"; /** 同步地址 */ private String returnUrl; /** 异步地址 */ private String notifyUrl; /** 最大查询次数 */ private static int maxQueryRetry = 5; /** 查询间隔(毫秒) */ private static long queryDuration = 5000; /** 最大撤销次数 */ private static int maxCancelRetry = 3; /** 撤销间隔(毫秒) */ private static long cancelDuration = 3000; private AlipayProperties() {} /** * PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。 */ @PostConstruct public void init() { log.info(description()); } public String description() { StringBuilder sb = new StringBuilder("\nConfigs{"); sb.append("支付宝网关: ").append(gatewayUrl).append("\n"); sb.append(", appid: ").append(appid).append("\n"); sb.append(", 商户RSA私钥: ").append(getKeyDescription(appPrivateKey)).append("\n"); sb.append(", 支付宝RSA公钥: ").append(getKeyDescription(alipayPublicKey)).append("\n"); sb.append(", 签名类型: ").append(signType).append("\n"); sb.append(", 查询重试次数: ").append(maxQueryRetry).append("\n"); sb.append(", 查询间隔(毫秒): ").append(queryDuration).append("\n"); sb.append(", 撤销尝试次数: ").append(maxCancelRetry).append("\n"); sb.append(", 撤销重试间隔(毫秒): ").append(cancelDuration).append("\n"); sb.append("}"); return sb.toString(); } private String getKeyDescription(String key) { int showLength = 6; if (StringUtils.isNotEmpty(key) && key.length() > showLength) { return new StringBuilder(key.substring(0, showLength)).append("******") .append(key.substring(key.length() - showLength)).toString(); } return null; }}

4. AlipayConfiguration

/** * 两个支付宝客户端,用户可以使用任意一个. * * alipay-trade-sdk 是对alipay-sdk-java的封装,建议使用alipay-trade-sdk. * * @author mengday zhang */@Configuration@EnableConfigurationProperties(AlipayProperties.class)public class AlipayConfiguration { @Autowired private AlipayProperties properties; /** * alipay-trade-sdk * @return */ @Bean public AlipayTradeService alipayTradeService() { return new AlipayTradeServiceImpl.ClientBuilder() .setGatewayUrl(properties.getGatewayUrl()) .setAppid(properties.getAppid()) .setPrivateKey(properties.getAppPrivateKey()) .setAlipayPublicKey(properties.getAlipayPublicKey()) .setSignType(properties.getSignType()) .build(); } /** * alipay-sdk-java * @return */ @Bean public AlipayClient alipayClient(){ return new DefaultAlipayClient(properties.getGatewayUrl(), properties.getAppid(), properties.getAppPrivateKey(), properties.getFormate(), properties.getCharset(), properties.getAlipayPublicKey(), properties.getSignType()); }}

5. AlipayPagePayController

/** * 支付宝-电脑网站支付. * <p> * 电脑网站支付 https://docs.open.alipay.com/270/105898/ * * @author Mengday Zhang * @version 1.0 * @since 2018/6/14 */@Controller@RequestMapping("/alipay/page")public class AlipayPagePayController { @Autowired private AlipayProperties alipayProperties; @Autowired private AlipayClient alipayClient; @Autowired private AlipayController alipayController; @PostMapping("/gotoPayPage") public void gotoPayPage(HttpServletResponse response) throws AlipayApiException, IOException { // 订单模型 String productCode = "FAST_INSTANT_TRADE_PAY"; AlipayTradePagePayModel model = new AlipayTradePagePayModel(); model.setOutTradeNo(UUID.randomUUID().toString()); model.setSubject("支付测试"); model.setTotalAmount("0.01"); model.setBody("支付测试,共0.01元"); model.setProductCode(productCode); AlipayTradePagePayRequest pagePayRequest =new AlipayTradePagePayRequest(); pagePayRequest.setReturnUrl("http://s9v2cw.natappfree.cc/alipay/page/returnUrl"); pagePayRequest.setNotifyUrl(alipayProperties.getNotifyUrl()); pagePayRequest.setBizModel(model); // 调用SDK生成表单, 并直接将完整的表单html输出到页面 String form = alipayClient.pageExecute(pagePayRequest).getBody(); response.setContentType("text/html;charset=" + alipayProperties.getCharset()); response.getWriter().write(form); response.getWriter().flush(); response.getWriter().close(); } @RequestMapping("/returnUrl") public String returnUrl(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException, AlipayApiException { response.setContentType("text/html;charset=" + alipayProperties.getCharset()); boolean verifyResult = alipayController.rsaCheckV1(request); if(verifyResult){ //验证成功 //请在这里加上商户的业务逻辑程序代码,如保存支付宝交易号 //商户订单号 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"); return "pagePaySuccess"; }else{ return "pagePayFail"; } }}

6. AlipayController

/** * 支付宝通用接口. * <p> * detailed description * * @author Mengday Zhang * @version 1.0 * @since 2018/6/13 */@Slf4j@RestController@RequestMapping("/alipay")public class AlipayController { @Autowired private AlipayProperties aliPayProperties; @Autowired private AlipayClient alipayClient; @Autowired private AlipayTradeService alipayTradeService; /** * 支付异步通知 * * 接收到异步通知并验签通过后,一定要检查通知内容,包括通知中的app_id、out_trade_no、total_amount是否与请求中的一致,并根据trade_status进行后续业务处理。 * * https://docs.open.alipay.com/194/103296 */ @RequestMapping("/notify") public String notify(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException { // 一定要验签,防止黑客篡改参数 Map<String, String[]> parameterMap = request.getParameterMap(); StringBuilder notifyBuild = new StringBuilder("/****************************** alipay notify ******************************/\n"); parameterMap.forEach((key, value) -> notifyBuild.append(key + "=" + value[0] + "\n") ); log.info(notifyBuild.toString()); boolean flag = this.rsaCheckV1(request); if (flag) { /** * TODO 需要严格按照如下描述校验通知数据的正确性 * * 商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号, * 并判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), * 同时需要校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email), * * 上述有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。 * 在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。 * 在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。 */ //交易状态 String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8"); // 商户订单号 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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8"); // TRADE_FINISHED(表示交易已经成功结束,并不能再对该交易做后续操作); // TRADE_SUCCESS(表示交易已经成功结束,可以对该交易做后续操作,如:分润、退款等); if(tradeStatus.equals("TRADE_FINISHED")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细, // 并判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知 //如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。 } else if (tradeStatus.equals("TRADE_SUCCESS")){ //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细, // 并判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),并执行商户的业务程序 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的 //如果有做过处理,不执行商户的业务程序 //注意: //如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。 } return "success"; } return "fail"; } /** * 订单查询(最主要用于查询订单的支付状态) * @param orderNo 商户订单号 * @return */ @GetMapping("/query") public String query(String orderNo){ AlipayTradeQueryRequestBuilder builder = new AlipayTradeQueryRequestBuilder() .setOutTradeNo(orderNo); AlipayF2FQueryResult result = alipayTradeService.queryTradeResult(builder); switch (result.getTradeStatus()) { case SUCCESS: log.info("查询返回该订单支付成功: )"); AlipayTradeQueryResponse resp = result.getResponse(); log.info(resp.getTradeStatus());// log.info(resp.getFundBillList()); break; case FAILED: log.error("查询返回该订单支付失败!!!"); break; case UNKNOWN: log.error("系统异常,订单支付状态未知!!!"); break; default: log.error("不支持的交易状态,交易返回异常!!!"); break; } return result.getResponse().getBody(); } /** * 退款 * @param orderNo 商户订单号 * @return */ @PostMapping("/refund") @ResponseBody public String refund(String orderNo) throws AlipayApiException { AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest(); AlipayTradeRefundModel model=new AlipayTradeRefundModel(); // 商户订单号 model.setOutTradeNo(orderNo); // 退款金额 model.setRefundAmount("0.01"); // 退款原因 model.setRefundReason("无理由退货"); // 退款订单号(同一个订单可以分多次部分退款,当分多次时必传)// model.setOutRequestNo(UUID.randomUUID().toString()); alipayRequest.setBizModel(model); AlipayTradeRefundResponse alipayResponse = alipayClient.execute(alipayRequest); System.out.println(alipayResponse.getBody()); return alipayResponse.getBody(); } /** * 退款查询 * @param orderNo 商户订单号 * @param refundOrderNo 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的外部订单号 * @return * @throws AlipayApiException */ @GetMapping("/refundQuery") @ResponseBody public String refundQuery(String orderNo, String refundOrderNo) throws AlipayApiException { AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest(); AlipayTradeFastpayRefundQueryModel model=new AlipayTradeFastpayRefundQueryModel(); model.setOutTradeNo(orderNo); model.setOutRequestNo(refundOrderNo); alipayRequest.setBizModel(model); AlipayTradeFastpayRefundQueryResponse alipayResponse = alipayClient.execute(alipayRequest); System.out.println(alipayResponse.getBody()); return alipayResponse.getBody(); } /** * 关闭交易 * @param orderNo * @return * @throws AlipayApiException */ @PostMapping("/close") @ResponseBody public String close(String orderNo) throws AlipayApiException { AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest(); AlipayTradeCloseModel model =new AlipayTradeCloseModel(); model.setOutTradeNo(orderNo); alipayRequest.setBizModel(model); AlipayTradeCloseResponse alipayResponse = alipayClient.execute(alipayRequest); System.out.println(alipayResponse.getBody()); return alipayResponse.getBody(); } /** * 校验签名 * @param request * @return */ public boolean rsaCheckV1(HttpServletRequest request){ // https://docs.open.alipay.com/54/106370 // 获取支付宝POST过来反馈信息 Map<String,String> params = new HashMap<>(); 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] + ","; } params.put(name, valueStr); } try { boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayProperties.getAlipayPublicKey(), aliPayProperties.getCharset(), aliPayProperties.getSignType()); return verifyResult; } catch (AlipayApiException e) { log.debug("verify sigin error, exception is:{}", e); return false; } }}

7. WebMvcConfiguration

/** * WebMVC 配置. * <p> * 添加路径和页面的映射关系 * * @author Mengday Zhang * @version 1.0 * @since 2018/6/13 */@Configurationpublic class WebMvcConfiguration extends WebMvcConfigurationSupport { @Override protected void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/gotoWapPage").setViewName("gotoWapPay"); registry.addViewController("/gotoPagePage").setViewName("gotoPagePay"); super.addViewControllers(registry); }}

8. templates

gotoPagePay.html

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body style="font-size: 30px"><form method="post" action="/alipay/page/gotoPayPage"> <h3>购买商品:越南新娘</h3> <h3>价格:20000</h3> <h3>数量:10个</h3> <button style="width: 100%; height: 60px; alignment: center; background: #b49e8f" type="submit">立即支付</button></form></body></html>

pagePaySuccess.html

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><h1>电脑网站支付 成功,我们将尽快从越南偷渡过来,收货后请请及时验货!欢迎下次再来</h1></body></html>

三:Demo图

三:查询对账单下载地址

/** * billDate : 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 * 查询对账单下载地址: https://docs.open.alipay.com/api_15/alipay.data.dataservice.bill.downloadurl.query/ * @param billDate */@GetMapping("/bill")@ResponseBodypublic void queryBill(String billDate) { // 1. 查询对账单下载地址 AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest(); AlipayDataDataserviceBillDownloadurlQueryModel model = new AlipayDataDataserviceBillDownloadurlQueryModel(); model.setBillType("trade"); model.setBillDate(billDate); request.setBizModel(model); try { AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request); if (response.isSuccess()) { String billDownloadUrl = response.getBillDownloadUrl(); System.out.println(billDownloadUrl); // 2. 下载对账单 List<String> orderList = this.downloadBill(billDownloadUrl); System.out.println(orderList); // 3. 先比较支付宝的交易合计/退款合计笔数/实收金额是否和自己数据库中的数据一致,如果不一致证明有异常,再具体找出那些订单有异常 // 查找支付宝支付成功而自己支付失败的记录和支付宝支付失败而自己认为支付成功的异常订单记录到数据库 } else { // 失败 String code = response.getCode(); String msg = response.getMsg(); String subCode = response.getSubCode(); String subMsg = response.getSubMsg(); } } catch (AlipayApiException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }}/** * 下载下来的是一个【账号_日期.csv.zip】文件(zip压缩文件名,里面有多个.csv文件) * 账号_日期_业务明细 : 支付宝业务明细查询 * 账号_日期_业务明细(汇总):支付宝业务汇总查询 * * 注意:如果数据量比较大,该方法可能需要更长的执行时间 * @param billDownLoadUrl * @return * @throws IOException */private List<String> downloadBill(String billDownLoadUrl) throws IOException { String ordersStr = ""; CloseableHttpClient httpClient = HttpClients.createDefault(); RequestConfig config = RequestConfig.custom() .setConnectTimeout(60000) .setConnectionRequestTimeout(60000) .setSocketTimeout(60000) .build(); HttpGet httpRequest = new HttpGet(billDownLoadUrl); httpRequest.setConfig(config); CloseableHttpResponse response = null; byte[] data = null; try { response = httpClient.execute(httpRequest); HttpEntity entity = response.getEntity(); data = EntityUtils.toByteArray(entity); } finally { response.close(); httpClient.close(); } ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(data), Charset.forName("GBK")); ZipEntry zipEntry = null; try{ while( (zipEntry = zipInputStream.getNextEntry()) != null){ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try{ String name = zipEntry.getName(); // 只要明细不要汇总 if(name.contains("汇总")){ continue; } byte[] byteBuff = new byte[4096]; int bytesRead = 0; while ((bytesRead = zipInputStream.read(byteBuff)) != -1) { byteArrayOutputStream.write(byteBuff, 0, bytesRead); } ordersStr = byteArrayOutputStream.toString("GBK"); }finally { byteArrayOutputStream.close(); zipInputStream.closeEntry(); } } } finally { zipInputStream.close(); } if (ordersStr.equals("")) { return null; } String[] bills = ordersStr.split("\r\n"); List<String> billList = Arrays.asList(bills); billList = billList.parallelStream().map(item -> item.replace("\t", "")).collect(Collectors.toList()); return billList;}

用户评论

莫飞霜

这个教程真不错,看了之后对SpringBoot和支付宝支付有了更深入的了解。

    有7位网友表示赞同!

煮酒

按照教程一步步操作,感觉集成支付宝支付也不是那么复杂嘛。

    有18位网友表示赞同!

闷骚闷出味道了

感谢作者分享这么实用的干货,让我节省了不少时间。

    有20位网友表示赞同!

等量代换

之前一直对支付宝支付集成感到困惑,现在终于搞懂了。

    有10位网友表示赞同!

命硬

这个教程对新手来说太友好了,很容易上手。

    有5位网友表示赞同!

执拗旧人

对于商家来说,集成支付宝支付是一个很好的选择。

    有13位网友表示赞同!

各自安好ぃ

通过这个教程,我学会了如何将支付宝支付功能应用到自己的项目中。

    有18位网友表示赞同!

陌颜

感谢作者详细讲解了支付流程和注意事项。

    有17位网友表示赞同!

一生只盼一人

这个教程让我对SpringBoot和支付宝支付有了全新的认识。

    有11位网友表示赞同!

何年何念

学习这个教程后,我发现自己对支付宝支付的理解更加深入了。

    有17位网友表示赞同!

箜明

这个教程让我明白了支付宝支付在电商行业的重要性。

    有14位网友表示赞同!

海盟山誓总是赊

作者讲解得非常清晰,让我对SpringBoot和支付宝支付有了全新的认识。

    有6位网友表示赞同!

站上冰箱当高冷

这个教程让我对支付宝支付的安全性有了更深的了解。

    有10位网友表示赞同!

我的黑色迷你裙

学习了这个教程,我现在可以独立完成支付宝支付功能的集成。

    有18位网友表示赞同!

呆萌

对于想要拓展自己电商平台的商家来说,这个教程非常有帮助。

    有6位网友表示赞同!

最怕挣扎

这个教程让我对SpringBoot有了更全面的了解。

    有18位网友表示赞同!

别悲哀

感谢作者分享这么实用的技巧,让我在开发过程中少走了很多弯路。

    有17位网友表示赞同!

烬陌袅

这个教程让我明白了支付宝支付在电商平台的优势。

    有6位网友表示赞同!

打个酱油卖个萌

学习了这个教程,我现在对SpringBoot和支付宝支付的结合应用有了更深入的了解。

    有11位网友表示赞同!

汐颜兮梦ヘ

这个教程让我对支付宝支付在电商行业的发展趋势有了更清晰的认知。

    有11位网友表示赞同!

热点资讯