springboot2 集成支付宝支付

  1. 引入pom依赖
         <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.10.0.ALL</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
  1. 在配置文件配置私钥,支付宝公钥(注意不是支付宝应用公钥
alipay:appid: XXXXXXXXXXXXXgatewayUrl: https://openapi.alipay.com/gateway.do  (正式环境网关,若用沙箱环境,需要更改)format: jsoncharset: utf-8signType: RSA2returnUrl: http://XXXXXXXXXXXXXXXX/alipay/return(同步回调,不需要配置,只要路径正确,本地可以访问即可)notifyUrl: http://XXXXXXXXXXXXX/alipay/notify(异步回调,需要在支付宝上配置路径,外网可访问)app-private-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXalipay-public-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  1. 支付宝配置类
@Component
public class AlipayConfig {// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号@Value("${alipay.appid}")public String app_id;// 商户私钥,您的PKCS8格式RSA2私钥@Value("${alipay.app-private-key}")public String merchant_private_key;// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。@Value("${alipay.alipay-public-key}")public String alipay_public_key;// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问//public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";@Value("${alipay.notifyUrl}")public String notify_url ;// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问// public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";@Value("${alipay.returnUrl}")public String return_url ;// 签名方式@Value("${alipay.signType}")public String sign_type;// 字符编码格式@Value("${alipay.charset}")public String charset;// 支付宝网关@Value("${alipay.gatewayUrl}")public String gatewayUrl;@Value("${alipay.format}")public String format;// 支付宝网关@Value("${alipay.logs}")public static String log_path;//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑/*** 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)* @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();}}}}
}
  1. 控制器
生成支付宝支付二维码:@PostMapping("/gotoPayPage")@ResponseBodypublic void gotoPayPage(){AlipayTradePagePayRequest pagePayRequest=new AlipayTradePagePayRequest();//SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.gatewayUrl,alipayConfig.app_id,alipayConfig.merchant_private_key, alipayConfig.format,alipayConfig.charset, alipayConfig.alipay_public_key, alipayConfig.sign_type);pagePayRequest.setReturnUrl(alipayConfig.return_url);pagePayRequest.setNotifyUrl(alipayConfig.notify_url);// 订单模型String productCode = "FAST_INSTANT_TRADE_PAY";//商户订单号String orderNo = “订单号”;//付款金额String totalFee  = “付款金额,以元为单位”;//订单名称String subject = "456";//商品描述String body = "123";AlipayTradePayModel model = new AlipayTradePayModel();model.setOutTradeNo(orderNo);model.setProductCode(productCode);model.setTotalAmount(totalFee);model.setSubject("subject");// model.setBody("body");pagePayRequest.setBizModel(model);//请求String form = "";try {//String result = alipayClient.pageExecute(pagePayRequest).getBody();AlipayTradePagePayResponse payResponse = alipayClient.pageExecute(pagePayRequest);form = payResponse.getBody();response.setContentType("text/html;charset="+alipayConfig.charset);response.getWriter().write(form);response.getWriter().flush();response.getWriter().close();}catch (Exception e){e.printStackTrace();throw new RuntimeException("支付宝二维码数据生成失败");}}
2、支付宝同步回调方法/*** 支付宝支付后同步回调方法* @param request* @param response*/@GetMapping("/return")public String returnCallback(HttpServletRequest request, HttpServletResponse response){System.out.println("**************************同步回调方法执行*******************************************");//获取支付宝GET过来反馈信息Map<String,String> params = new HashMap<String,String>();Map requestParams = request.getParameterMap();try {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);}System.out.println("params---------->"+params);//调用SDK验证签名boolean signVerified = AlipaySignature.rsaCheckV1(params,alipayConfig.alipay_public_key, alipayConfig.charset, alipayConfig.sign_type);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");//TODO 将支付宝返回的数据记录到数据库中//1、根据订单号查询订单是否存在,//2、根据支付宝返回的trade_status状态进行下一步要操作,成功:更新订单状态,//response.getWriter().write("success");return "success";}else {return "fail";// response.getWriter().write("fail");}}catch (Exception e){e.printStackTrace();throw new RuntimeException("回调异常");}}
3、异步回调/*** 支付订单后异步回调方法* @param request* @param response* @return*/@PostMapping("/notify")@ResponseBodypublic String notifyUrl(HttpServletRequest request,HttpServletResponse response){//获取支付宝POST过来反馈信息Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();try {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");params.put(name, valueStr);}System.out.println("支付宝支付返回参数params-------->"+params);boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.alipay_public_key, alipayConfig.charset, alipayConfig.sign_type); //调用SDK验证签名System.out.println("signVerified----->"+signVerified);PrintWriter out = null;if (signVerified){//商户订单号  orderNoString 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 buyer_id = new String(request.getParameter("buyer_id").getBytes("ISO-8859-1"),"UTF-8");//交易总金额String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");//实收金额String receipt_amount = new String(request.getParameter("receipt_amount").getBytes("ISO-8859-1"),"UTF-8");//付款金额String buyer_pay_amount = new String(request.getParameter("buyer_pay_amount").getBytes("ISO-8859-1"),"UTF-8");//交易时间String gmt_create = new String(request.getParameter("gmt_create").getBytes("ISO-8859-1"),"UTF-8");//交易付款时间String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"),"UTF-8");//获取appidString app_id = new String(request.getParameter("app_id").getBytes("ISO-8859-1"),"UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");//根据订单查询该订单是否存在if (memberOrder == null){throw new AlipayApiException("out_trade_no错误");}//判断支付金额是否正确if (!total_amount.equals(memberOrder.getTotalFee().toString())){throw new AlipayApiException("error total_amount");}//判断appid是否一致if (!app_id.equals(alipayConfig.app_id)){throw new AlipayApiException("app_id不一致");}System.out.println("trade_status------------>"+trade_status);if(trade_status.equals("TRADE_FINISHED")){                //判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知}else if (trade_status.equals("TRADE_SUCCESS")){//向支付宝订单记录表中添加数据//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知}//response.getOutputStream().print("success");return "success";//}else {//验签失败// response.getOutputStream().print("failure");return "failure";}}catch (AlipayApiException e) {System.out.println(e.getErrMsg());throw new RuntimeException("调用支付宝接口发生异常");} catch (UnsupportedEncodingException e) {System.out.println(e.getMessage());throw new RuntimeException("URLDecoderf发生异常");} /*catch (IOException e) {System.out.println(e.getMessage());throw new RuntimeException("IO发生异常");}*/}4、订单查询@GetMapping("/query")@ResponseBodypublic String query(String orderNo, String tradeNo){if (StringUtils.isBlank(orderNo)){throw new RuntimeException("订单号不能为空");}//SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.gatewayUrl,alipayConfig.app_id,alipayConfig.merchant_private_key, alipayConfig.format,alipayConfig.charset, alipayConfig.alipay_public_key, alipayConfig.sign_type);AlipayTradeQueryRequest alipay_request = new AlipayTradeQueryRequest();AlipayTradeQueryModel model=new AlipayTradeQueryModel();model.setOutTradeNo(orderNo);model.setTradeNo(tradeNo);alipay_request.setBizModel(model);String form = "";try {AlipayTradeQueryResponse alipay_response =alipayClient.execute(alipay_request);form = alipay_response.getBody();System.out.println("form----->"+form);return form;}catch (AlipayApiException e){e.printStackTrace();throw new RuntimeException("支付宝查询交易数据失败");}}

注意:要对异步回调、同步回调、查询放行,不要拦截

springboot2 集成支付宝支付相关推荐

  1. Android端集成支付宝支付

    Android端集成支付宝支付 1.申请账号及配置变量 支付宝快速接入链接点击打开链接 支付宝扫码或者账号密码登录 下面是支付宝给出的接入介绍 第一步:创建应用并获取APPID 要在您的应用中接入支付 ...

  2. android如何实现支付宝,(Android集成支付宝支付)react-native实现支付宝支付

    网上关于RN的支付宝支付组件大部分都是IOS的,Android要实现支付宝支付只剩下走原生这一步了. 整体思路: 1.在蚂蚁金服开放平台申请应用 2.在android原生集成支付宝 3.封装andro ...

  3. Android 集成支付宝支付,支付宝支付2.0

    成功起调支付宝支付 下载支付sdk复制到libs文件夹下并add  as library:https://docs.open.alipay.com/54/104509 1.首先申请支付宝 企业账户  ...

  4. Java服务端集成支付宝支付SDK

    文章目录 文档 流程说明 添加依赖 集成步骤 常见问题 文档 蚂蚁金服官方文档 https://docs.open.alipay.com/54/103419/https://docs.open.ali ...

  5. springboot 集成支付宝支付

    最简单的springboot集成支付宝 1 注册沙箱 沙箱是一个模拟环境登录,百度蚂蚁金服开放平台,支付宝扫码登录如下 然后沙箱需要注册一下,非常之简单,注册好以后进入到如下页面,选沙箱工具,然后下载 ...

  6. Android app集成支付宝支付

    支付宝支付 其实是比较简单的,但因为发起订单总是失败,经过各种测试.排除,最终确定是服务端返回数据有误造成的.所以严格来说支付宝文档等没有什么问题,问题在于后端程序员不认真看文档和测试. 申请id需要 ...

  7. Android怎么集成支付宝支付和微信支付功能(上)

    看到网上写支付的文章不多,又有感于许多资料和官网内容中到处都有坑,填过坑的我决定让支付简单点(想起了我当初到处找资料的情景,唉,心累).为便于浏览,分为支付宝支付和微信支付上下两篇.看官请看..... ...

  8. 【网站支付PHP篇】thinkPHP集成支付宝支付(担保交易)

    目录 系列说明 开发环境 部署支付宝 支付请求 支付宝返回处理 系列说明 最近在帮朋友的系统安装支付模块(兑换网站积分),现在总结一些开发心得,希望对大家有用.这个系列会讲以下第三方支付平台的集成: ...

  9. springboot集成支付宝支付2.0

    springboot集成微信APP支付V3最新版 流程详解 创建应用 添加支付能力 接口加签 获取证书 集成支付到springboot项目 流程详解 相对于集成微信支付来说,支付宝相对简单些,支付宝对 ...

  10. 安卓-Android如何集成支付宝支付(集成阿里支付)详解。Android接入alipay支付

    支付宝支付官网地址: 打开官网 服务器端如何拼接Orderinfo所需参数请看这篇文章.打开链接 安卓app集成阿里支付流程: 步骤一:下载aar和demo,并将aar添加到安卓项目依赖里.点击查看如 ...

最新文章

  1. Spring Boot集成Quartz注入Spring管理的类
  2. 【剑指offer-Java版】24二叉搜索树后序遍历序列
  3. 神策数据:从产品与运营视角,了解教育行业转介绍
  4. Python实现将不规范的英文名字首字母大写
  5. QQ自定义在线机型状态源码
  6. 高并发下的系统设计(偏数据库设计)
  7. 使用IIS 7.0 Smooth Streaming 优化视频服务
  8. 解决php保存文件时文件名乱码问题
  9. 软件工程项目____搜查令
  10. 联想电脑无法调节屏幕亮度
  11. VMware虚拟机无法识别U盘解决方案
  12. 新手主播在一对一视频直播平台更容易发展,轻松月入过万!
  13. Linux安装Kibana详细教程
  14. 根据前序遍历和中序遍历创建二叉树
  15. 涠洲岛日出日落时间表,1月10日涠洲岛开船时间/日出日落/天气预报
  16. wifi 信号差 android,手机WiFi信号弱怎么办 手机WiFi信号突然变弱的解决方法
  17. 英文手绘字体_40种免费的高质量手绘字体
  18. 计算机进制转换专项训练,计算机各种进制转换练习题(附答案) (精选可编辑)...
  19. 智能电表远红外远程抄表实施方案
  20. 【Verilog基础】【总线协议】AHB BURST传输可以提前终止吗?

热门文章

  1. 淘宝卖家如何有效控制直通车展现?
  2. PHPUnit 在 Windows下的安装
  3. 攻防演练中防守方的防护措施.
  4. 《 黑白团团队》第一次作业:团队亮相
  5. Selenium元素定位方法总结
  6. matlab画单位圆的代码,请问用MATLAB软件,以动画的形式作出单位圆x^2 +y^2 = 1的图像的程序代码是什么?...
  7. GRB控制型非隔离dc-dc低压升压高压电源模块24V转100V120V150V200V250V350V500V1000V
  8. material-table的使用
  9. 使用hBuilder打包成app扫一扫
  10. SCI论文写作(一) | SCI论文的文献综述(Literature Review)部分