一、适用场景:pc端拉起付款二维码 用户扫码付款(非证书模式下单)

二、接入准备

1:支付宝-appId

2:支付宝公钥-appPublicKey

(是支付宝公钥,不是应用公钥,拿错会无法拉起支付)

3:支付宝应用私钥-appPrivateKey

三、官方DEMO下载地址

支付宝sdk官方下载地址
https://opendocs.alipay.com/open/270/106291?ref=api

四、代码

1:maven依赖

     <!-- 支付宝支付SDK --><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.9.100.ALL</version></dependency>

2:配置文件


介绍下其他参数

returnUrl:阿里同步通知接口地址—后边会有代码展示
notifyUrl:支付后阿里通知支付状态的接口地址—后边会有代码展示
requestUrl:主要用于支付成功后页面跳转的网站地址(支付宝支付前端会用阿里自己的页面,所以支付成功以后要跳转到自己的页面)

配置类

@ConfigurationProperties(prefix = "alipay")
@Component
@Data
public class AliPayProperties {private String appId;private String gatewayUrl;private String format;private String charset;private String signType;private String returnUrl;private String notifyUrl;private String appPrivateKey;private String appPublicKey;private String requestUrl;//支付宝支付页面超时时间private String overTime;}

3:下单接口

//支付宝拉起统一下单public Map<String, String> prePay(UserOrders order, String clientIP) {log.info("支付宝统一下单接收到请求,下单用户ip :{}", clientIP);Map<String, String> map = new HashMap<>();AlipayClient alipayClient=new DefaultAlipayClient(properties.getGatewayUrl(),properties.getAppId(),properties.getAppPrivateKey(),properties.getFormat(),properties.getCharset(),properties.getAppPublicKey(),properties.getSignType());try {//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = new String(order.getOrderNum().getBytes("UTF-8"),"UTF-8");//付款金额,必填Double payPrice = order.getPayPrice();String total_amount = new String(payPrice.toString().getBytes("UTF-8"),"UTF-8");//订单名称,必填String subject = new String(order.getPackageName().getBytes("UTF-8"),"UTF-8");AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();String encode = URLEncoder.encode(order.getOperatorInfo(), "UTF-8");request.setNotifyUrl(properties.getNotifyUrl());request.setReturnUrl(properties.getReturnUrl());request.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"passback_params\":\""+ encode +"\","+ "\"timeout_express\":\""+ properties.getOverTime()+"\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");AlipayTradePagePayResponse response = null;response = alipayClient.pageExecute(request);map.put("success", "true");map.put("body", response.getBody());map.put("msg", response.getMsg());} catch (AlipayApiException e) {e.printStackTrace();}catch (UnsupportedEncodingException e) {e.printStackTrace();}return map;}

对当前返回的map进行校验返回前端

4:异步回调

controller

@RequestMapping("/ali/notify")public String notify(HttpServletRequest request){log.info("支付宝异步回调接收到请求!!!");Map<String,String> flag = aliPayService.aliPayNotify(request);if("success".equals(flag.get("status"))){//这块做自己的业务逻辑AsyncManager.me().execute(AsyncFactory.updateCourseSignNum(flag.get("courseId")));}return flag.get("status");}

service

public Map<String, String> aliPayNotify(HttpServletRequest request) {Map<String, String> map = new HashMap<>();try {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] + ",";}//乱码解决,这段代码在出现乱码时使用valueStr = new String(valueStr.getBytes("UTF-8"), "UTF-8");params.put(name, valueStr);}log.info("alipay支付回调:" + JSON.toJSONString(params));boolean flag = AlipaySignature.rsaCertCheckV1(params, properties.getPublicKeyFilePath(), properties.getCharset(), properties.getSignType());if (flag) {log.info("支付宝回调签名通过");//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("UTF-8"), "UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("UTF-8"), "UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("UTF-8"), "UTF-8");//订单的金额String total_amount = new String(request.getParameter("total_amount").getBytes("UTF-8"), "UTF-8");//商户idString sellerId = new String(request.getParameter("seller_id").getBytes("UTF-8"), "UTF-8");log.info("此次订单金额为==>> {}", total_amount);if ("TRADE_FINISHED".equals(trade_status)) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序log.info("交易finish非success");//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知} else if ("TRADE_SUCCESS".equals(trade_status)) {//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知log.info("交易成功,更新订单状态");OrderInfo orderInfo = orderInfoMapper.selectOrderInfoByOrderNum(out_trade_no);BigDecimal aliPrice = new BigDecimal(total_amount);if (aliPrice.compareTo(orderInfo.getPayPrice()) != 0) {log.info("支付宝返回成交额与当前订单金额不符,返回fail");map.put("status", "fail");return map;}if ("1".equals(orderInfo.getPayStatus())) {//首次回调成功更新订单状态,给学员开课orderInfoService.updateOrderPayStatus(out_trade_no);}map.put("status", "success");map.put("courseId", String.valueOf(orderInfo.getCourseId()));return map;}} else {log.info("异步签名校验有误,返回fail");map.put("status", "fail");return map;}} catch (Exception e) {e.printStackTrace();map.put("status", "fail");return map;}map.put("status", "fail");return map;}

5:同步回调

controller

@RequestMapping("/ali/return")public void aliReturn(HttpServletRequest request, HttpServletResponse response){aliPayService.aliReturn(request,response);}

service

public void aliReturn(HttpServletRequest request, HttpServletResponse response) {try {log.info("支付宝同步回调接收到请求");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] + ",";}//乱码解决,这段代码在出现乱码时使用valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}//调用SDK验证签名boolean flag = AlipaySignature.rsaCertCheckV1(params, properties.getPublicKeyFilePath(), properties.getCharset(), properties.getSignType());if (flag) {//商户订单号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");log.info("支付宝同步回调参数 out_trade_no: {} ,trade_no: {}, total_amount : {}", out_trade_no, trade_no, total_amount);response.sendRedirect(properties.getRequestUrl());} else {System.out.println("验签失败");response.sendRedirect(properties.getRequestUrl());}} catch (Exception e) {e.printStackTrace();try {response.sendRedirect(properties.getRequestUrl());} catch (IOException ex) {ex.printStackTrace();}}}

Java接入支付宝扫码支付相关推荐

  1. java实现支付宝扫码支付和回调的Demo源码

    java实现支付宝扫码支付Demo源码 扫码效果图 需要现成源码的朋友,可以加Q76949433,提供技术支持! 项目结构截图: package com.pay.common; public clas ...

  2. java调用支付宝扫码支付接口

    说明: 由于没有商户账号,所以本文使用的是沙箱账号,本质跟真实账号是一样的,是支付宝为了方便开发人员开发调试而推出的策略.在真实开发中将商户公钥等修改为真实的商户即可. 支付基本流程 用户下单 商户账 ...

  3. java实现支付宝扫码支付详细步骤

    支付宝扫码支付API文档地址:https://opendocs.alipay.com/open/194/106078         , 先配置好public_lkey和private_key 在支付 ...

  4. html扫码支付,WEB端第三方支付接入 - 支付宝 - 扫码支付

    需要接入支付宝支付了 支付宝支付相对于微信支付接入更麻烦一些,要配置密钥啥的 需要支付宝开放平台账号,并开通网站支付相关权限,具体查看官方网站 上代码: 1 - 引入依赖 com.alipay.sdk ...

  5. .net 网站接入支付宝扫码支付

    一.下载电脑网站支付的demohttps://docs.open.alipay.com/270/106291/ 二.登录支付宝开发网站https://open.alipay.com/developme ...

  6. JAVA 接入微信扫码(Native)支付

    一:web网站接入微信扫码支付功能(NATIVE) 二:准备工作 微信支付配置参数 1:appId 商家平台ID 2:mchID 商户平台ID 3:machSecret 商户平台密钥 以上三个参数找老 ...

  7. Java PC端微信、支付宝扫码支付(二)

    Java PC端微信.支付宝扫码支付(二) 前几天写了微信支付,附上链接 https://blog.csdn.net/qq_43494610/article/details/90411391 ,今天抽 ...

  8. JAVA支付宝扫码支付开发流程

    近期工作遇到支付宝扫码支付,经开发研究与3年前相比  API调用与配置更加简单方便,整体开发流程如下(后期会有对应的支付宝APP支付) 登录支付宝开发平台 -->开发接入    链接:https ...

  9. 支付宝--扫码支付流程

    1.首次知道,原来(支付宝支付接口)需要去蚂蚁金服开发者帮助文档(尴尬). 附带链接地址:https://docs.open.alipay.com 2.创建自己的应用,我选的是[自研接入](这是一个坑 ...

最新文章

  1. UTF8转换为GB编码gb2312转换为utf-8
  2. 第3节 sqoop:3、sqoop的入门测试使用
  3. LibreOJ - 3083 与或和(单调栈+位运算)
  4. 腾讯的一笔画游戏--巧妙解法
  5. 【CodeForces - 1201C】Maximum Median(思维,水题)
  6. lesson3 一阶线性常微分方程解法
  7. redis数据结构存储Linked List设计细节(redis的设计与实现笔记)
  8. Linux_MySQL下(4) 未整理
  9. 迅捷路由器设置AP模式
  10. csv,tsv,txt文件类型区别
  11. Svelte 实现 keypress 快捷键功能
  12. php think addon,think-addons
  13. 一文搞定校验码(奇偶校验,海明,CRC 码)
  14. 采样模型外表面点云之曲线救国方法
  15. 基于SSM在线学习网站包含课程管理-错题-收藏-考试测试-学生教师管理员58198(idea-javaweb-javaee-j2ee-springboot)
  16. Linux操作系统之网络实战1
  17. 跑得快人工智能自动代打训练程序设计
  18. SSL证书(HTTPS)的加密算法
  19. 树莓派TF卡磁盘扩容 分区扩容
  20. GPU-BASED PROCEDURAL PLACEMENT IN HORIZON ZERO DAWN

热门文章

  1. Kubernetes 污点与容忍
  2. [乐意黎原创]向上取整⌈⌉和向下取整⌊⌋符号含义及应用
  3. 关于以太坊 雷电网络 的思考
  4. java 媒体框架_Java 媒体框架 之 JMF
  5. Javaweb酒店预约管理系统(框架SpringBoot+Vue)
  6. 一文彻底玩转Android通知栏消息通知
  7. html写出带有表格标题的三行三列表格
  8. 最长递增子序列的O(NlogN)算法
  9. 微信小程序setData不起作用
  10. Bi-LSTM原理及TensorFlow实现序列标注