1、官方文档

沙箱环境使用说明:https://docs.open.alipay.com/200/105311。

开放平台--沙箱环境:https://openhome.alipay.com/platform/appDaily.htm?tab=info。

rsa签名验签工具:https://docs.open.alipay.com/291/106097。

2、沙箱调试环境(买家账号测试、商家账号测试)

open_api_domain(支付宝网关):沙箱环境支付宝网关。

mcloud_api_domain使用demo提供默认配置。

pid(商户uid):沙箱环境商户uid。

appid(当面付的APPID) :沙箱环境的APPID。

private_key:此处请填写你的商户私钥且转PKCS8格式。

public_key :此处请填写你的商户公钥。

alipay_public_key (SHA256withRsa对应支付宝公钥) :沙箱环境复制生成的支付宝公钥。

3、支付宝demo整合到项目中

标红的两个java文件

②引入阿里的jar包

idea里引入第三方jar包

标红的jar包直接在pom文件里引入依赖,版本号一定要保持一致

pom文件里这样设置可把第三方jar包打到target里面。

 <plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><verbose>true</verbose><overwrite>true</overwrite></configuration></plugin><!-- geelynote maven的核心插件之-complier插件默认只支持编译Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding><compilerArguments><extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs></compilerArguments></configuration></plugin></plugins>

4、支付宝扫码和查询订单支付状态

public ServerResponse pay(Long orderNo,Integer userId,String path){Map<String ,String> resultMap = Maps.newHashMap();Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用户没有该订单");}resultMap.put("orderNo",String.valueOf(order.getOrderNo()));// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,// 需保证商户系统端不能重复,建议通过数据库sequence生成,String outTradeNo = order.getOrderNo().toString();// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”String subject = new StringBuilder().append("happymmall扫码支付,订单号:").append(outTradeNo).toString();// (必填) 订单总金额,单位为元,不能超过1亿元// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】String totalAmount = order.getPayment().toString();// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】String undiscountableAmount = "0";// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PIDString sellerId = "";// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"String body = new StringBuilder().append("订单").append(outTradeNo).append("购买商品共").append(totalAmount).append("元").toString();// 商户操作员编号,添加此参数可以为商户操作员做销售统计String operatorId = "test_operator_id";// (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持String storeId = "test_store_id";// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持ExtendParams extendParams = new ExtendParams();extendParams.setSysServiceProviderId("2088100200300400500");// 支付超时,定义为120分钟String timeoutExpress = "120m";// 商品明细列表,需填写购买商品详细信息,List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();List<OrderItem> orderItemList = orderItemMapper.getByOrderNoUserId(orderNo,userId);for(OrderItem orderItem : orderItemList){GoodsDetail goods = GoodsDetail.newInstance(orderItem.getProductId().toString(), orderItem.getProductName(),BigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(),new Double(100).doubleValue()).longValue(),orderItem.getQuantity());goodsDetailList.add(goods);}// 创建扫码支付请求builder,设置请求参数AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams).setTimeoutExpress(timeoutExpress).setNotifyUrl(PropertiesUtil.getProperty("alipay.callback.url"))//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置.setGoodsDetailList(goodsDetailList);AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);switch (result.getTradeStatus()) {case SUCCESS:logger.info("支付宝预下单成功: )");AlipayTradePrecreateResponse response = result.getResponse();dumpResponse(response);File folder = new File(path);if(!folder.exists()){folder.setWritable(true);folder.mkdirs();}// 需要修改为运行机器上的路径//细节细节细节String qrPath = String.format(path+"/qr-%s.png",response.getOutTradeNo());String qrFileName = String.format("qr-%s.png",response.getOutTradeNo());ZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath);File targetFile = new File(path,qrFileName);try {FTPUtil.uploadFile(Lists.newArrayList(targetFile));} catch (IOException e) {logger.error("上传二维码异常",e);}logger.info("qrPath:" + qrPath);String qrUrl = PropertiesUtil.getProperty("ftp.server.http.prefix")+targetFile.getName();resultMap.put("qrUrl",qrUrl);return ServerResponse.createBySuccess(resultMap);case FAILED:logger.error("支付宝预下单失败!!!");return ServerResponse.createByErrorMessage("支付宝预下单失败!!!");case UNKNOWN:logger.error("系统异常,预下单状态未知!!!");return ServerResponse.createByErrorMessage("系统异常,预下单状态未知!!!");default:logger.error("不支持的交易状态,交易返回异常!!!");return ServerResponse.createByErrorMessage("不支持的交易状态,交易返回异常!!!");}}// 简单打印应答private void dumpResponse(AlipayResponse response) {if (response != null) {logger.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));if (StringUtils.isNotEmpty(response.getSubCode())) {logger.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),response.getSubMsg()));}logger.info("body:" + response.getBody());}}public ServerResponse aliCallback(Map<String,String> params){Long orderNo = Long.parseLong(params.get("out_trade_no"));String tradeNo = params.get("trade_no");String tradeStatus = params.get("trade_status");Order order = orderMapper.selectByOrderNo(orderNo);if(order == null){return ServerResponse.createByErrorMessage("非XXX的订单,回调忽略");}if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){return ServerResponse.createBySuccess("支付宝重复调用");}if(Const.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)){order.setPaymentTime(DateTimeUtil.strToDate(params.get("gmt_payment")));order.setStatus(Const.OrderStatusEnum.PAID.getCode());orderMapper.updateByPrimaryKeySelective(order);}PayInfo payInfo = new PayInfo();payInfo.setUserId(order.getUserId());payInfo.setOrderNo(order.getOrderNo());payInfo.setPayPlatform(Const.PayPlatformEnum.ALIPAY.getCode());payInfo.setPlatformNumber(tradeNo);payInfo.setPlatformStatus(tradeStatus);payInfoMapper.insert(payInfo);return ServerResponse.createBySuccess();}public ServerResponse queryOrderPayStatus(Integer userId,Long orderNo){Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用户没有该订单");}if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){return ServerResponse.createBySuccess();}return ServerResponse.createByError();}

支付宝扫码支付功能对接相关推荐

  1. Spring MVC+Spring+MyBatis实现支付宝扫码支付功能(图文详解)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | 思海(公众号:好好学java) 链接 | blog.cs ...

  2. Java代码实现支付宝扫码支付功能(配置沙箱环境)

    支付宝沙箱配置环境 什么是沙箱呢? 协助开发者进行接口功能,独立于线上环境的配置. 支付接口需要签约生效后才能使用,有些签约几天才能通过,比如资料不全,导致无法立刻签约:沙箱环境提供了测试环境,解决了 ...

  3. 支付宝扫码支付-PC版(沙箱环境)

    前言 最近开发了PC端支付宝扫码支付的功能,使用的是沙箱环境.所谓的沙箱环境,其实就是支付宝提供的测试环境(毕竟正式环境需要营业执照等信息进行注册,注册通过后还有一些流程,才能进行正式的扫码支付.对于 ...

  4. C# Winform窗体实现支付宝扫码支付

    C# Winform窗体项目实现支付宝扫码支付 一.内容介绍 啪嗒!( 搬好小板凳 ) 大家好,本次学习的内容是在博主大一winform窗体项目中实现的一个功能--支付宝扫码支付: 主要功能通过支付宝 ...

  5. 支付宝扫码支付模式平台介绍

    互联网在逐渐普及过程中,智能手机逐渐成为人们日常生活内主要电子设备.互联网支付在逐渐普及过程中,移动支付也逐渐出现在人们日常生活工作内,互联网支付企业也逐渐参与到线下支付行列内.第三方支付企业在为社会 ...

  6. Java-Spring Boot支付宝扫码支付以及支付回调

    前言:最近开发支付宝支付功能,总结一下做个分享 官方文档:https://opendocs.alipay.com/apis 支付宝沙箱地址: https://openhome.alipay.com/p ...

  7. 微信支付宝扫码支付聚合系统

    一.简介 微信支付宝扫码支付聚合系统,聚合了微信支付和支付宝的所有扫码支付模式.并支持微信支付服务商子商户模式.支持五种扫码技术. 二.主要功能 1. 微信扫码支付:包括扫码支付模式一.扫码支付模式二 ...

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

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

  9. 支付宝扫码支付,回调和退款(沙箱环境配置和完整代码)

    支付宝扫码支付 最近重构项目时,负责了支付模块,微信扫码支付(NATIVE)和 支付宝扫码支付,也是第一次接触,虽然根据官方文档和一些博客写出来了,但是遇到的问题却很多,走了很多弯路,浪费了很多精力和 ...

最新文章

  1. .NET中可空值类型实现原理
  2. 自反访问控制列表(ACL)
  3. rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列
  4. ROS配置分布式通信
  5. 升级鸿蒙3.0需要备份吗,升级鸿蒙OS3.0机型曝光!大哥,你是认真的吗?
  6. 用神经网络例子讲解TF运行方式~人工智能入门编程例子讲解
  7. Linux中shell提示符定制
  8. C#中使用DLL文件
  9. 【Python】闭包Closure
  10. 局域网内window10和Windows7共享只有USB接口打印机的方法——以sharp2048D为例子
  11. 思维导图的绘制要点及使用GitMind工具快速制作思维导图
  12. Anaconda更换字体及字号
  13. HDU6411 带劲的and和
  14. 深度学习论文: Computer Vision for Road Imaging and Pothole Detection: A State-of-the-Art Review
  15. 基于QT实现的职工住房管理系统
  16. Unity初学:制作2D小游戏Sunny Land 1.游戏背景场景添加
  17. release版本和debug版本
  18. 全栈修炼:如何从Web前端迈向全栈开发
  19. cnc程序加工中心_cnc加工自动可制造性评估的可制造性设计
  20. 学习笔记:发布自己的python模块安装包

热门文章

  1. 夺命雷公狗---linux NO:25 linux下的压缩和解压缩
  2. python实现简单的神经网络,python搭建神经网络模型
  3. 统计《三国演义》前15个人名
  4. squid二级代理配置
  5. 【雷达】SAR Chirp Scaling(CS)算法+MATLAB代码(转载请标注德雅村支书)
  6. c语言 printf分栏输出,Exce表格分栏打印输出的两种巧妙方法
  7. 被Win11系统恶心到了
  8. c语言中二进制转十进制详解
  9. 计算机 精度,精度计算器
  10. STM32CubeMX学习系列教程目录