支付宝APP支付,无论在文档上,还是在demo上,比微信支付高好几个level吧.使用起来非常方便,基本上不会有什么太大的坑,只要严格按照demo,和文档进行操作的话,基本上可以一把过的.在这里要提示下,加签和验签使用的公钥问题:加签是在开发商平台查看公钥的时候的:应用公钥,而回调验签使用的,在开发商平台查看公钥的时候的:支付公钥.一定要注意这个,要不回调会报错的.

Controller:

  @PostMapping("/payRequest")@ApiOperation("统一下单alipay支付")public Result payRequest(@RequestBody MallOrderPayDto mallOrderPayDto) throws Exception {log.info("ali 支付:{}",mallOrderPayDto);try {Map<String,String> maps =  aliPayService.payRequest(mallOrderPayDto);return super.success(maps);} catch (Exception e) {log.info("订单ali支付异常:{}",e);return super.error("订单数据异常!");}}@PostMapping(value = "/aliPayOrderCallBack")@ApiOperation("alipay支付回调")public Map<String, String> aliPayOrderCallBack(HttpServletRequest request){Map<String, String> map = new HashMap<String, String>();try {AliPayVO aliPayVo = friendsMallAliPayService.aliPayCallBack(request);aliPayService.aliPayOrderCallBack(aliPayVo);map.put("msg", "SUCCESS");} catch (Exception e) {e.printStackTrace();log.error("aliPayOrderCallBack Error.",e);}return map;}

Service:

public interface AliPayService {//支付宝支付public Map<String, String> payRequest(OrderPayDto orderPayDto) throws Exception;//支付宝回调public AliPayVO aliPayCallBack(HttpServletRequest request) throws Exception;//支付宝订单支付回调业务处理public void aliPayOrderCallBack(AliPayVO aliPayVo) throws Exception;
}

ServiceImpl:

@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class AliPayServiceImpl implements AliPayService {//订单支付支付宝回调地址public static String ALIPAY_ORDER_CALLBACK = "http://127.0.0.1:8080/api/alipay/aliPayOrderCallBack";@Overridepublic Map<String, String> payRequest(OrderPayDto orderPayDto) throws Exception {Map<String, String> map = new HashMap<String, String>();//TODO 要查库.获取配置AlipayConfig alipayConfig = new AlipayConfig();alipayConfig.setUrl("https://openapi.alipay.com/gateway.do");alipayConfig.setAppId("2020920193812");//appId alipayConfig.setRsaPrivateKey("aaaa");//私钥alipayConfig.setAlipayPublicKey("bbbbbbb");//公钥alipayConfig.setCharset("utf-8");//编码格式alipayConfig.setFormat("json");//返回格式alipayConfig.setSignType("RSA2");//签名方式//实例化客户端log.info("实例化客户端开始=====================");AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),alipayConfig.getRsaPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAlipayPublicKey(), alipayConfig.getSignType());AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();AlipayTradePayModel model = new AlipayTradePayModel();log.info("封装ali支付请求参数==================");//支付编号String orderNum = PayUtils.getOrderNumber();log.info("支付订单号:{}",orderNum);model.setOutTradeNo(orderNum);//订单名称model.setSubject("订单描述");//支付总金额String money = totalAmount.toString()+".00"; //此处是测试demo的时候临时加的,自行处理下String的,小数点后两位.model.setTotalAmount(money);//超时则关闭订单model.setTimeoutExpress("30m");aliPayRequest.setBizModel(model);//异步回调地址aliPayRequest.setNotifyUrl(ALIPAY_ORDER_CALLBACK);AlipayTradeAppPayResponse response = alipayClient.sdkExecute(aliPayRequest);map.put("aliPaySdk", response.getBody());log.info("支付宝支付加密结果:{}",map);log.info("alipay 参数封装完成,开始入库流水=================订单号:{}",orderNum);return map;}@Overridepublic AliPayVO aliPayCallBack(HttpServletRequest request) throws Exception {AlipayConfig alipayConfig = new AlipayConfig();//获取支付宝反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();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] + ",";}params.put(name, valueStr);}//调用SDK验证签名boolean signVerified = AlipaySignature.rsaCheckV1(params, alipayConfig.getAlipayPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType());//校验签名if (!signVerified) {log.error("1.支付宝支付回调签名不正确");throw new Exception("支付宝支付回调签名不正确");}//校验支付状态if (!request.getParameter("trade_status").equals("TRADE_SUCCESS")) {log.error("2.支付宝支付回调支付状态不正确");throw new Exception("支付宝支付回调支付状态不正确");}AliPayVO aliPayVo = new AliPayVO();//商户订单号-系统生成订单号String outTradeNo = request.getParameter("out_trade_no");aliPayVo.setOutTradeNo(outTradeNo);//支付订单号-阿里28位订单号String tradeNo = request.getParameter("trade_no");aliPayVo.setPayOrderNo(tradeNo);//交易状态String tradeStatus = request.getParameter("trade_status");aliPayVo.setTradeStatus(tradeStatus);//资金总额String totalAmount = request.getParameter("total_amount");aliPayVo.setTotalAmount(totalAmount);//卖家支付宝账户String sellerId = request.getParameter("seller_id");aliPayVo.setSellerId(sellerId);//买家支付宝账户String buyerLogonId = request.getParameter("buyer_logon_id");aliPayVo.setBuyerLogoinId(buyerLogonId);//签名方式aliPayVo.setSignType(alipayConfig.getSignType());//签名String sign = request.getParameter("sign");aliPayVo.setSign(sign);return aliPayVo;}@Overridepublic void aliPayOrderCallBack(AliPayVO aliPayVo) throws Exception {log.info("3.alipay 回调开始============:{}",aliPayVo);if (aliPayVo != null && StringUtil.isNotEmpty(aliPayVo.getOutTradeNo())) {synchronized (aliPayVo.getOutTradeNo()) {MallUserRechargeDetail order = friendsMallUserRechargeDetailService.selectByOrderId(aliPayVo.getOutTradeNo());if (order.getStatus().equals(0)) {if (aliPayVo.getTradeStatus().equals("TRADE_FINISHED")) {//交易创建,等待买家付款log.info("4.交易创建,等待买家付款:TRADE_FINISHED");} else if (aliPayVo.getTradeStatus().equals("WAIT_BUYER_PAY")) {//未付款交易超时关闭,或支付完成后全额退款log.info("5.未付款交易超时关闭,或支付完成后全额退款:WAIT_BUYER_PAY");} else if (aliPayVo.getTradeStatus().equals("TRADE_CLOSED")) {//交易结束,不可退款log.info("6.交易结束,不可退款:TRADE_CLOSED");} else if (aliPayVo.getTradeStatus().equals("TRADE_SUCCESS")) {//交易支付成功log.info("7.支付状态成功:TRADE_SUCCESS");MallUserRechargeDetail mallUserRechargeDetail = friendsMallUserRechargeDetailService.selectByOrderId(aliPayVo.getOutTradeNo());log.info("8.根据订单号,查询用户充值记录,订单号:{},充值记录:{}",aliPayVo.getOutTradeNo(),mallUserRechargeDetail);//订单金额BigDecimal payNumSum = new BigDecimal(mallUserRechargeDetail.getMoney());log.info("9.订单金额:{}",payNumSum);//资金总额BigDecimal totalAmount = new BigDecimal(aliPayVo.getTotalAmount());log.info("10.回调金额:{}",totalAmount);//以防万一,校验金额if (payNumSum.compareTo(totalAmount) != 0) {log.error("11.***订单号: " + aliPayVo.getOutTradeNo() + "***支付宝支付金额与订单需支付金额不一致***支付宝支付金额为:" + totalAmount + " ***订单需支付金额总为:" + payNumSum + "***日期:" + new Date());throw new Exception("订单金额和回调金额不一致.");}log.info("12.校验订单状态,防止重复回调======================");if (mallUserRechargeDetail.getStatus() == 1){log.error("13.***订单号: " + aliPayVo.getOutTradeNo() + "**********支付状态为已成功,人工处理==============");throw new Exception("订单状态为已支付,后续不处理,有异常人工处理.");}//中间的数据校验和业务处理省略了log.info( i > 0 ? " 28.交易日志记录保存成功!" : "交易日志记录保存失败!");}} else {log.info("29.该订单已支付处理,交易编号为: " + aliPayVo.getOutTradeNo());}}}}}

实体:


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AlipayConfig {//appIdprivate String appId;//私钥private String rsaPrivateKey;//请求网关地址private String url;//编码格式private String charset;//返回格式private String format;//支付宝公钥private String alipayPublicKey;//签名方式private String signType;
}

依赖:

     <dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>${alipay-sdk-java.version}</version></dependency>
<alipay-sdk-java.version>4.9.71.ALL</alipay-sdk-java.version>

支付宝App支付源码相关推荐

  1. 微信App支付源码坑注释

    微信App支付源码&坑注释 部分的代码,因为代码是copy的我自己代码,然后再进行部分的编辑和注释,所以在使用的时候有可能有欠缺,不过整体来说,应该不影响使用的.如果有疑问,可以留言.在微信A ...

  2. h5调用支付宝 php支付源码,友价源码如何集成支付宝H5接口(即支付宝手机支付接口)...

    在旧版的友价源码系统中,手机里打开友价程序,用支付宝付款时,还是跳到PC端的付款页面,现在新版的补丁已经改进这个问题,可以直接实现支付宝手机版付款,效果如下: 具体的设置方法请严格按照以下步骤操作,因 ...

  3. php支付宝聚合支付源码,ThinkPHP5.1聚合支付源码

    资源介绍 目前已经接入支付渠道:微信(扫码支付).支付宝(电脑网站支付.手机网站支付): ### 项目结构 ``` project                             应用部署目录 ...

  4. 个人支付宝h5支付源码,即时到个人账户

    H5支付,个人支付宝使用H5拉起支付 ,即时支付到个人账户,无需手续费. 测试效果如下图: https://github.com/apppay/h5pay/blob/master/README.md

  5. php 支付宝订单查询_php实现支付宝APP支付功能与源码

    原标题:php实现支付宝APP支付功能与源码 码农程序自学与交流微信群 微信群有,就怕你进群发一些乱七八糟的,群有群规,既然规定是技术学习交流,那就不要发广告信息,推广信息,小程序分享,刷屏刷图等!一 ...

  6. 最新码支付源码+完整版+免挂监听回调+微信、支付宝、qq监控APP打包教程

    码支付手机APP打包教程 码支付官网:https://pay.madanbao.com 1.打开uniapp的官网注册一个账号,网址为:www.dcloud.io/ 3.打开工具导入项目,打开mani ...

  7. 个人免签码支付源码+监控APP【野马资源网】

    1.宝塔面板中新建网站安装环境需要设置:+ 运行环境为PHP7.0+MYsql5.6 网站目录->运行目录 设置为public并保存伪静态 设置为thinkphp并保存默认文档 设置将index ...

  8. 2022.7.2新版码易支付源码+三网免签挂+APP监控在线更新

    2022.7.2新版码易支付源码+三网免签挂+APP监控在线更新 新版三网免签易支付系统源码,支持QQ/微信/支付宝三网免输入码支付源码,支持云端免挂直接用宝塔的计划任务监控即可,支持APP监控本地挂 ...

  9. 2022外卖霸王餐程序、外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变 自带账单 在线支付提现等

    2022外卖霸王餐程序.外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变 自带账单 在线支付提现等 外卖霸王餐系统程序/H5/APP源码 2022最新霸王餐程序 霸王餐程序/H5/A ...

  10. java版Spring Cloud+Mybatis 微服务商城 b2b2c商城 直播商城 小程序商城 多商家入驻商城 APP商城源码 聚合支付商城

    1. 平台简介 一个全新覆盖全行业,以直播.短视频带货,商家实体VR全景体验,多营销模式,分销分佣,多商家入驻,多端支持的大型新零售电商平台. 2. 平台清单 系统管理平台 + 商家端(PC+手机) ...

最新文章

  1. FlasCC Windows下开发环境搭建
  2. 增加XP的IIS连接数,解决403.9连接用户过多的问题
  3. how is my Angular custom controller code executed
  4. .net core 注入机制与Autofac
  5. E. Anfisa the Monkey
  6. web应用调试工具_如何使用浏览器开发人员工具调试渐进式Web应用程序
  7. Hive ROW_NUMBER,RANK(),DENSE_RANK()
  8. 获取SQL Server数据库增长和收缩事件的详细信息
  9. MongoDB:The Definitive Guide CHAPTER 2 Getting Started
  10. Tomcat部署记事
  11. 论文笔记_S2D.12-2019-ITSC-DFuseNet: 用于图像稠密深度补全的RGB和稀疏深度信息深度融合的网络
  12. c# mysql存储过程 输出参数值_C#获取存储过程返回值和输出参数值的方法
  13. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_22-CMS前端页面查询开发-Api调用-跨域解决...
  14. python制作一个简易计算器_最简易的python计算器实现源代码
  15. C语言简单程序编写(一)
  16. 值得总结!推荐10款超实用的神级办公网站和软件,效率翻倍
  17. HDU6287 口算训练 【两种优化版分解质因数】【二分下标】
  18. 学术诚信的重要性_坚守学术道德,弘扬学术诚信
  19. input输入框对伪类(after,before)支持情况
  20. 3分钟为你的应用添加声波通讯功能

热门文章

  1. 《深海探测装备》学习笔记1(深海探测传感器)
  2. java一些基础知识点
  3. 2020校园招聘公司列表!计算机/互联网 技术类岗位!,一直更新!
  4. set_global_opts在PyEcharts中实现全局配置项
  5. Eureka高可用注册中心通过defaultZone深入理解zone和serviceUrl
  6. 爆销产品标题怎么写_抖音爆火标题文案模板
  7. 研发岗位OKR的设计与激励 - 管理角度(附部分岗位样例)
  8. supervisor备忘
  9. gitee和gitHub的命令和详细步骤操作
  10. 坤坤音效键盘(Python实现)