前言

本人是java后端开发,这次是做一个支付宝APP支付的功能,所以在这里注重讲解后端的代码实现以及业务结构流程。这个教程结合了公司实际项目来编写的。作为一个第一次写支付功能的小白表示,支付宝的开发文档真的有点不太友好,不太看得懂,只能自己慢慢摸索再加上网上的资料,最终还是功夫不负有心人,我完成了这个任务。回头再去看支付宝开发文档,就感觉豁然开朗了。所以写这个教程主要是想给第一次写支付功能的小白一个参考。

业务结构流程图

图中加粗的步骤是后端需要实现的几个步骤

接入前准备

去支付宝获取以下信息https://open.alipay.com/platform/manageHome.htm
appid、应用私钥、支付宝公钥、支付宝网关路径

代码实现

1.首先是配置类AppPayConfig,以下有些信息来自支付宝账户,这个在上面已经提到如何去获取。

public class AppPayConfig {/*** 1.商户appid*/public String APPID = "";/*** 私钥 pkcs8格式的*/public static String RSA_PRIVATE_KEY ="";/*** 3.支付宝公钥*/public static String ALIPAY_PUBLIC_KEY =  "";/** 4.服务器异步通知页面路径 *///支付完成后,支付宝会通过这个url请求到你的服务端..//这个url一定是要公网可以访问才行。如果是本地测试,就需要做内网穿透。//也就是说这个路径是你自定义的,你所写的回调接口的路径。public static String notify_url = "";/*** 5.页面跳转同步通知页面路径,这个暂时没有用到,有兴趣的小伙伴可以研究一下。*///这里同上..不做详细说明了..public static String return_url = "";/*** 正式环境支付宝网关,如果是沙箱环境需更改成https://openapi.alipaydev.com/gateway.do*/public static String URL = "https://openapi.alipay.com/gateway.do";/*** 7.编码格式*/public static String CHARSET = "UTF-8";/*** 私钥 pkcs8格式的*/// 8.返回格式public static String FORMAT = "json";/*** //签名方式 加密类型*/public static String SIGNTYPE = "RSA2";
}

2.前端选择支付宝支付后需要调用的下订单接口。

    @Value("${ali.config.app.id}")private String appId;@Value("${ali.config.gateway.url}")private String gatewayUrl;@Value("${ali.config.return.url}")private String returnUrl;@Value("${ali.config.notice.url}")private String notifyUrl;@Value("${ali.config.private.key}")private String privateKey;@Value("${ali.config.public.key}")private String publicKey;public String order(AlipayBean alipayBean) {String orderString = "";//这个字符串是用来返回给前端的//这行代码是生成一个商户的订单号..根据你们自己的业务需求去生成就可以了..log.info("==================支付宝下单,商户订单号为:" + alipayBean.getOut_trade_no());//这个是自己数据库的订单价格,为了保证安全性。不用前端传递过来的价格。Long price = otherTooler.fetchPrice(alipayBean.getOut_trade_no(), alipayBean.getSession_id());try {//实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId,privateKey, "json", "utf-8",publicKey, "RSA2");//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.payAlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();//业务参数传入,可以传很多,参考API//model.setPassbackParams(URLEncoder.encode(request.getBody().toString())); //公用参数(附加数据)//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。model.setBody(alipayBean.getBody());//商品名称model.setSubject(alipayBean.getSubject());//商户订单号model.setOutTradeNo(alipayBean.getOut_trade_no());//交易超时时间 这里的30m就是30分钟model.setTimeoutExpress("30m");//支付金额 后面保留2位小数点..不能超过2位
//            model.setTotalAmount(String.valueOf(BigDecimal.valueOf(price).divide(BigDecimal.valueOf(100),2,BigDecimal.ROUND_DOWN)));model.setTotalAmount("0.01");//销售产品码(固定值) //这个不做多解释..看文档api接口参数解释model.setProductCode(alipayBean.getProduct_code());alipayBean.setSession_id(alipayBean.getSession_id());alipayBean.setUserId(alipayBean.getUserId());alipayBean.setShopId(alipayBean.getShopId());model.setPassbackParams(JSON.toJSONString(alipayBean));ali_request.setBizModel(model);//异步回调地址ali_request.setNotifyUrl(notifyUrl);log.info("====================异步通知的地址为:" + ali_request.getNotifyUrl());//同步回调地址(APP)同上ali_request.setReturnUrl(returnUrl);log.info("====================同步通知的地址为:" + ali_request.getReturnUrl());// 这里和普通的接口调用不同,使用的是sdkExecute//返回支付宝订单信息(预处理)AlipayTradeAppPayResponse alipayTradeAppPayResponse = alipayClient.sdkExecute(ali_request);//就是orderString 可以直接给APP请求,无需再做处理。orderString = alipayTradeAppPayResponse.getBody();System.out.println(orderString);} catch (AlipayApiException e) {e.printStackTrace();log.info("与支付宝交互出错,未能生成订单,请检查代码!");}return orderString;}

3.在第2步将支付宝返回的信息原样返回给前端后,支付宝那边会处理并调用你传递过去的异步回调通知地址。然后这个接口去获取传递过来的数据,并做验签,然后可根据自己的业务来做后续的事情。
注意:我用支付宝提供的request . getParameterMap ()方法获取不到传递过来的参数,上网查了半天,发现用流的方法就可以获取到信息。在用流的方式时,一定要注意,不要少截取了信息,传递过来的信息全部都要截取出来。

public String alipayNotify(HttpServletRequest request) throws Exception {//获取支付宝POST过来反馈信息BufferedReader bufr =new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));StringBuilder sBuilder = new StringBuilder("");String temp = "";while ((temp = bufr.readLine()) != null) {sBuilder.append(temp);}bufr.close();System.out.println(sBuilder);HashMap<String, String> hashMap = new HashMap<>();String[] split = sBuilder.toString().split("&");for (String str : split) {String[] strings = str.split("=");if (strings != null && strings.length == 2) {hashMap.put(strings[0], URLDecoder.decode(strings[1], "UTF-8"));}}log.info("支付宝支付结果通知:" + hashMap.toString());log.info("支付宝返回交易参数: " + "out_trade_no : " + hashMap.get("out_trade_no"));log.info("支付宝返回交易参数: " + "trade_no : " + hashMap.get("trade_no"));log.info("支付宝返回交易参数: " + "trade_status : " + hashMap.get("trade_status"));//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果boolean verify_result = AlipaySignature.rsaCheckV1(hashMap, publicKey, "utf-8", "RSA2");if (!verify_result) {AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, appId, privateKey, "json", "utf-8", publicKey, "RSA2"); //获得初始化的AlipayClientAlipayTradeCancelRequest requests = new AlipayTradeCancelRequest();//创建API对应的request类//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setOutTradeNo(hashMap.get("out_trade_no"));requests.setBizModel(model);AlipayTradeCancelResponse response = alipayClient.execute(requests);//通过alipayClient调用API,获得对应的response类System.out.print(response.getBody());//验证失败return "fail";} else {//根据自己的业务所需去处理}}return "success";}}

对接支付宝APP支付后端实现最详细教程相关推荐

  1. java SpringBoot 对接支付宝 APP支付 证书模式及非证书模式

    一. 添加maven依赖 sdk <dependency><groupId>com.alipay.sdk</groupId><artifactId>al ...

  2. 这样可以几分钟快速对接支付宝APP支付和手机网站支付

    这个接口主要是实现企业支付宝APP支付已经签约完成的,想对接到手机网站实现手机网站支付来用的. 如果对接到PC网站,用户支付的时候就是扫码支付,网站出付款码,用户扫码完成支付. 如果对接到APP平台, ...

  3. 可以几分钟快速对接支付宝APP支付和手机网站支付?

    这个接口主要是实现企业支付宝APP支付已经签约完成的,想对接到手机网站实现手机网站支付来用的. 如果对接到PC网站,用户支付的时候就是扫码支付,网站出付款码,用户扫码完成支付. 如果对接到APP平台, ...

  4. 对接支付宝App支付和网页支付接口详解

    之前在项目中使用过支付宝的沙箱测试支付和实际开发支付,是关于App对接支付宝接口的,由于前段时间有朋友询问怎么对接网页支付,通过研究支付包的开发文档,在这里总结一下对接支付宝的App支付接口和网页支付 ...

  5. java后端实现集成支付宝APP支付(沙箱环境)

    沙箱环境集成支付宝APP支付后端实现 前言 获取支付宝相关信息 整体开发流程 1.获取核心参数 2.将支付宝SDK集成到项目中 3.后台使用支付宝SDK与支付宝进行交互逻辑 1.将支付宝公共信息参数写 ...

  6. 支付宝APP支付 ALIN10146-自查方案

    ALIN10146-自查方案地址: https://openclub.alipay.com/club/history/read/6918 iwebshop 对接支付宝app支付 异步通知的url不要携 ...

  7. java后端+uniapp 对接微信app支付 报错-1

    问题描述: 原因分析: 上面两张图片完美的呈现了对接微信APP支付所能遇见的问题 排查流程: 检测自己的app是否 以及注册到微信开放平台 并且填写了与APP中的包名相对应的 检测自己的App是否开通 ...

  8. springboot接入支付宝app支付总结

    本文主要讲解楼主在使用spingboot框架对接支付宝app时需要做到几个步骤,以及防坑指南. app支付 1.app支付的文档及其配置,附上链接 https://docs.open.alipay.c ...

  9. 支付宝APP支付 ---服务器开发

    写过微信支付再写支付宝支付就好理解了很多.而且支付宝提供的sdk很好用,几行代码就可以了~~,写的代码还没有测试,应该问题不大,如果有错误希望各位指正. 开发之前必要的配置请参考支付宝APP支付官方文 ...

  10. 支付宝APP支付Java服务端

    支付宝APP支付Java服务端: 公司项目要求对接支付宝进行支付功能,这边做出整理方便以后使用(支付宝的支付对接还是很简单的). 1):去支付宝开放平台,-1.注册账号,2.创建应用 3.配置应用 4 ...

最新文章

  1. FTP资源下检测URL地址下文件大小
  2. Web渗透测试(sql注入 access,mssql,mysql,oracle,)
  3. 磁盘阵列简介---图片说明
  4. 【机器学习】什么是机器学习?(下)
  5. 一款针对Outlook的红队安全研究工具
  6. oracle函数 trunc(x[,y])
  7. ACM题解系列之一:刘汝佳:《算法竞赛入门经典》(第2版)
  8. mysql 配置自动截断_MySql超长自动截断实例详解
  9. android 中手势GestureDetector 的使用
  10. iptraf:一个实用的TCP/UDP网络监控工具
  11. 04 Linux软件安装与卸载命令
  12. 小米笔记本 镜像_2020年小米笔记本Air 13.3原装WIN10出厂系统ISO镜像1607原版下载...
  13. 浅谈从一维空间到十一维空间
  14. 串联稳压电源与多谐振荡器
  15. 苹果屏蔽更新描述文件_无需越狱,屏蔽 iOS 更新的描述文件来了
  16. 备案后可以改服务器信息吗,域名备案后可以更改服务器
  17. S3C2440-裸机篇-01 | JZ2440开发板快速上手
  18. 拆轮子之Fish动画分析
  19. 苦心志,劳筋骨,饿体肤,乏其身,乱其所为
  20. “麦田音乐节·超时空歌会”即将破空 探索元宇宙虚拟演唱会新形式

热门文章

  1. 作业2:健身类软件调研
  2. 10bit视频编码——特性及全面播放方法介绍
  3. 2021-2025年中国共享Web托管服务行业市场供需与战略研究报告
  4. java bean vo_关于JavaBean和vo的解释
  5. 什么是windows用户账户
  6. Eclipse 下载,安装,配置教程
  7. 4个免费又好用的wordpress企业主题
  8. android studio海马玩模拟器
  9. 浅谈电力系统短路故障的分析
  10. js获取本周日期和上周日期