1. 准备

支付宝开放平台中导航栏选择开发中心里面的研发服务
配置公钥
密钥生成器官方文档下载
下载SDK和demo
java开发可以直接引入maven依赖

<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.7.110.ALL</version></dependency>

从demo中引入AlipayConfig类,当然也可以自己编写


import org.springframework.context.annotation.Configuration;import java.io.FileWriter;
import java.io.IOException;
@Configuration
public class AlipayConfig {//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号public static String app_id = "2016101100664086";// 商户私钥,您的PKCS8格式RSA2私钥public static String merchant_private_key = "********";// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。public static String alipay_public_key = "这里一定要是支付宝公钥,而不是应用公钥";// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问,public static String notify_url = "http://localhost:1022/notify_url";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = "http://localhost:1022/return_url";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "utf-8";// 支付宝网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";// 支付宝网关public static String log_path = "C:\\";//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑/*** 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)* @param sWord 要写入日志里的文本内容*/public static void logResult(String sWord) {FileWriter writer = null;try {writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");writer.write(sWord);} catch (Exception e) {e.printStackTrace();} finally {if (writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}}}
}
  • alipay_public_key一定要是支付宝公钥而不是应用公钥,否则会出现支付成功,回调时一直验签错误的结果

2. 后台处理

controller:

@PostMapping("/AliPay")public String goPay(HttpServletRequest request){String clientId = request.getParameter("cID");Competition current = competitionMapper.getPayInfoByCID(clientId);System.out.println(clientId);//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填Date date = new Date();String out_trade_no = Long.toString(date.getTime());//付款金额,必填String total_amount = String.valueOf(current.getAmount());//订单名称,必填String subject = current.getTitle();//商品描述,可空String body = current.getPlace();// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。String timeout_express = "1c";alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"body\":\""+ body +"\","+ "\"timeout_express\":\""+ timeout_express +"\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求try {String result = alipayClient.pageExecute(alipayRequest).getBody();System.out.println(result);Order order = new Order();order.setOrder_no(out_trade_no);order.setOrder_amount(Float.valueOf(total_amount));order.setCompetition_id(clientId);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");order.setCreate_time(sdf.format(new Date()));boolean flag = orderMapper.addOrder(order);if (!flag){return "创建订单失败";}return result;}catch (Exception e){System.out.println("订单请求错误");JSONObject jsonObject = new JSONObject();jsonObject.put("status",500);return "fail";}}
  • out_trade_no这一项是订单号,不能请求一样的订单号,会返回该订单已支付,建议使用时间戳记录;
  • 该接口返回的是一个string字符,是为了让其自动跳转

将JSP转为html和接口

@GetMapping("/return_url")public JSONObject return_url(HttpServletRequest request,@AuthenticationPrincipal Principal principal) throws Exception{//获取支付宝GET过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();System.out.println("map信息:" + requestParams.toString());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] + ",";}//乱码解决,这段代码在出现乱码时使用valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");System.out.println("同步验签---- " + valueStr);params.put(name, valueStr);}System.out.println(params.size());try {boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用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 total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");JSONObject jsonObject = new JSONObject();if(orderMapper.paySuccess(trade_no,out_trade_no)){String cID = orderMapper.getCID(out_trade_no);GameRecord gameRecord = new GameRecord();gameRecord.setCID(Integer.parseInt(cID));gameRecord.setUID(Integer.parseInt(myUserMapper.getUIDByUsername(principal.getName())));//测试//gameRecord.setUID(26659526);if (gameRecordMapper.addRecord(gameRecord)){jsonObject.put("status",200);jsonObject.put("out_trade_no",out_trade_no);jsonObject.put("trade_no",trade_no);jsonObject.put("total_amount",total_amount);}else {jsonObject.put("status",400);}}else {jsonObject.put("status",500);}System.out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);return jsonObject;}else {System.out.println("验签失败");JSONObject jsonObject = new JSONObject();jsonObject.put("status",501);return jsonObject;}}catch (Exception e){e.printStackTrace();System.out.println("验证错误");JSONObject jsonObject = new JSONObject();jsonObject.put("status",502);return jsonObject;}//——请在这里编写您的程序(以下代码仅作参考)——}

官方给的Demo中使用的是jsp页面,而我的项目使用的是html,其中转换无非是参数的传递
AlipayConfig中配置了同步回调和异步回调的地址,可将其改成我们自己的html页面,之后在写一个ajax与后台进行交互,对返回结果进行相应控制

3. 前端请求

<div><form action="/AliPay" method="post"><input type="hidden" name="cID" value="123214" /><input type="submit" value="下单"> <input type="reset" value="重置"></form></div>

springboot整合支付宝网页支付PC端,沙箱环境,无JSP相关推荐

  1. springboot整合支付宝微信支付案例+代码

    springboot支付宝微信支付 每天多学一点点~ 之前写好了一篇,不下心被覆盖的,我的锅....下次写博客记得导出来!!!! 话不多说,这就开始吧- 文章目录 springboot支付宝微信支付 ...

  2. Java web集成支付宝电脑支付接口(沙箱环境)

    前言 这篇博客主要介绍如何在Java web项目中集成支付宝的电脑支付接口(会稍微介绍一下服务器集成APP支付接口).目前支付宝接口更新很快,在博主查找资料的时候,很多都是即时到账接口,APP支付则是 ...

  3. springboot整合支付宝沙箱支付

    springboot整合支付宝沙箱支付 1.简介 支付宝开发平台地址:https://open.alipay.com/develop/sandbox/app 对于学生来说,目前网上确实没有比较统一而且 ...

  4. SpringBoot整合支付宝支付接口 详解 (有源文件)

    目录 1.简介与支付接口运行原理 2.基本配置说明 3.支付接口实现 4.整合后沙箱测试 1.简介与支付接口运行原理 简介: 现在与钱有关的项目都离不开支付,现在就来介绍一下如何对接支付宝接口.演示项 ...

  5. SpringBoot整合支付宝之电脑网站支付

    SpringBoot整合支付宝之电脑网站支付 一.支付宝介绍 1.2 过程分析 1.3 对接支付宝的准备工作 1.4 申请步骤: 2.支付功能实现 2.1 思路分析 2.2 编写支付宝支付接口 2.2 ...

  6. 个人支付系统源码 支付宝包装网银+支付宝网关软件+PC端监控+支付宝全自动收款系统软件

    简介: 支付宝包装网银/支付宝网关/支付宝网银/网银支付/支付宝网关软件/PC端监控安全稳定支付宝全自动收款系统软件网银充值版[交易管理系统开发语言PHP, 监控软件为客户端EXE运行程序] 网盘下载 ...

  7. python支付程序源码_python项目中实现支付宝网页支付

    支付流程 在一次项目中需要引入支付宝接口实现支付宝支付,使用场景如下: 用户在我方商户系统中选择了购买商品,我方商户系统生成一张支付订单,用户点击订单的支付按钮后,页面会跳转到一个支付二维码的界面. ...

  8. Springboot整支付宝网站支付、APP支付、单笔转账给用户、退款功能

    一.概述 最近在写项目,遇到了要调用支付宝支付的地方(后台管理页面的网站支付,APP内的用户支付,APP内用户提现也就是单笔转账给用户.退款).研究了好久,全部调通了,下面把我的代码分享出来. 首先那 ...

  9. 支付宝网页支付交互流程 nest 版

    自己整理了一份支付宝网页支付的交互流程 , 完全按交互流程响应步骤介绍的代码,效果图.因为平时主要用node开发,所以服务端用的node,框架是 nest. 用最精简的代码实现支付功能 1,流程图 为 ...

  10. 移动网页支付(微信H5支付和支付宝网页支付)

    支付宝网页支付: 1.前端发送(流水号,手机号,产品ID,金额,回调地址,取消地址,支付类型)支付信息给后端, 2.后端组装数据,通过SDK向支付宝发起请求,返回数据给前端. let loc =&qu ...

最新文章

  1. 线性代数-矩阵-【5】矩阵化简 C和C++实现
  2. 互联网大厂月饼哪家强?我看了之后,口水流了一地!
  3. Titanium开发环境搭建第一个坑
  4. 计算机中的颜色XIII——颜色转换的快速计算公式
  5. RSA非对称加密简析-java
  6. 打算把我的视频工具整合一下
  7. LeetCode 05最长回文子串
  8. 乐橙本地录像回放不了_本地工具访问:安全、高效、合规的IT资源远程访问
  9. 基于上一篇AS项目依赖库问题的优化解决方案
  10. cad直线和圆弧倒角不相切_曲线操作-直线,圆弧,圆,倒斜角
  11. sql sever 2008基础知识
  12. 天气预报\气象服务APP素材框架模板|UI及UX设计好帮手
  13. html引用单文件组件,webpack入坑之旅(五)加载vue单文件组件_html/css_WEB-ITnose
  14. Windows2012服务器无法复制粘贴问题
  15. Activity 的启动模式
  16. RESTClient 使用
  17. 坯子库怎么导入插件_【亲测能用】草图大师Sketchup坯子库插件管理器SU2014-2019插件64位下载-羽兔网...
  18. 一图搞懂梯度、散度、旋度、Jacobian、Hessian、Laplacian之间的关系
  19. 多线程的三种设计模式的介绍
  20. 如何使用ODB(How to use odb On windows)

热门文章

  1. ThunderSoft Video to GIF Converter(电脑视频转gif软件)官方正式版V3.3.0 | 轻松将视频转换成GIF图片
  2. STM32固件库点灯
  3. python如何计数while循环次数_While循环计数
  4. javaweb JSP JAVA 酒店预订系统j酒店管理系统民宿预订)酒店客房预订系统宾馆客房预订系统
  5. 详解Java编码与解码以及常见的编码表,灵活处理乱码问题
  6. 花巨款跟巴菲特吃饭的人,是亏是赚?
  7. 电商直播发展正夯,搭建电商网站需要怎样的云服务器配置?
  8. Java Calendar,Date,DateFormat,TimeZone,Locale等时间相关内容的认知和使用(2) 自己封装的Calendar接口
  9. AutoCAD2018_块
  10. 石家庄地铁站项目最终总结报告