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. 在一个sql分组查询中使用多个聚集函数
  2. 数据中心新认证出现,UPTIME面临挑战
  3. 60佳优秀的 Photoshop 网页制作教程【下篇】
  4. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)
  5. 使用Google App Engine开始新的网站开发学习
  6. php 获取当前action,ThinkPHP3.2.2获取当前Action名称
  7. 为何优秀的程序员不断离开?| 畅言
  8. C++的类型强制转换,static_cast,dynamic_cast,const_cast,reinterpret_cast
  9. Web服务及http协议_学习笔记
  10. 手把手教你python实现量价形态选股知乎_Python实现量化选股
  11. matlab聚类实验,实验3Matlab聚类分析
  12. 【AR开发】ARCore简介
  13. 作文 进入中职计算机班,我的中职生活作文(精选5篇)
  14. PTA 求链式线性表的倒数第K项 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
  15. 安装 deepin系统 实现windows和deepin双系统
  16. 基于Python猫眼票房TOP100电影数据抓取
  17. Android在应用中打开系统播放器
  18. 安装CocoaPods出现错误解决方法
  19. Linux运维:推荐八款Linux远程连接工具
  20. 广告营销DSP和DMP概念解释

热门文章

  1. Nvidia xavier NX通过flash.sh烧录linux系统
  2. Winform当移入控件时,鼠标变手的通用方法
  3. 2014联通见习感悟
  4. MMDetection框架入门教程(完全版)
  5. 项目结构优化设计之smv架构
  6. OV7725之AL422B-FIFO及摄像头的驱动原理
  7. 一家计算机专卖店A型计算器,A型计算器谱子 | 手游网游页游攻略大全
  8. web如何伪装自己的IP地址
  9. [转] 一些你不知道但是超美的地方,一定要去
  10. 【Python 爬虫系列非专业教学】(3)手把手教你获取猫眼电影 Top 100 榜单