支付宝扫码支付功能对接
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();}
支付宝扫码支付功能对接相关推荐
- Spring MVC+Spring+MyBatis实现支付宝扫码支付功能(图文详解)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者 | 思海(公众号:好好学java) 链接 | blog.cs ...
- Java代码实现支付宝扫码支付功能(配置沙箱环境)
支付宝沙箱配置环境 什么是沙箱呢? 协助开发者进行接口功能,独立于线上环境的配置. 支付接口需要签约生效后才能使用,有些签约几天才能通过,比如资料不全,导致无法立刻签约:沙箱环境提供了测试环境,解决了 ...
- 支付宝扫码支付-PC版(沙箱环境)
前言 最近开发了PC端支付宝扫码支付的功能,使用的是沙箱环境.所谓的沙箱环境,其实就是支付宝提供的测试环境(毕竟正式环境需要营业执照等信息进行注册,注册通过后还有一些流程,才能进行正式的扫码支付.对于 ...
- C# Winform窗体实现支付宝扫码支付
C# Winform窗体项目实现支付宝扫码支付 一.内容介绍 啪嗒!( 搬好小板凳 ) 大家好,本次学习的内容是在博主大一winform窗体项目中实现的一个功能--支付宝扫码支付: 主要功能通过支付宝 ...
- 支付宝扫码支付模式平台介绍
互联网在逐渐普及过程中,智能手机逐渐成为人们日常生活内主要电子设备.互联网支付在逐渐普及过程中,移动支付也逐渐出现在人们日常生活工作内,互联网支付企业也逐渐参与到线下支付行列内.第三方支付企业在为社会 ...
- Java-Spring Boot支付宝扫码支付以及支付回调
前言:最近开发支付宝支付功能,总结一下做个分享 官方文档:https://opendocs.alipay.com/apis 支付宝沙箱地址: https://openhome.alipay.com/p ...
- 微信支付宝扫码支付聚合系统
一.简介 微信支付宝扫码支付聚合系统,聚合了微信支付和支付宝的所有扫码支付模式.并支持微信支付服务商子商户模式.支持五种扫码技术. 二.主要功能 1. 微信扫码支付:包括扫码支付模式一.扫码支付模式二 ...
- Java PC端微信、支付宝扫码支付(二)
Java PC端微信.支付宝扫码支付(二) 前几天写了微信支付,附上链接 https://blog.csdn.net/qq_43494610/article/details/90411391 ,今天抽 ...
- 支付宝扫码支付,回调和退款(沙箱环境配置和完整代码)
支付宝扫码支付 最近重构项目时,负责了支付模块,微信扫码支付(NATIVE)和 支付宝扫码支付,也是第一次接触,虽然根据官方文档和一些博客写出来了,但是遇到的问题却很多,走了很多弯路,浪费了很多精力和 ...
最新文章
- .NET中可空值类型实现原理
- 自反访问控制列表(ACL)
- rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列
- ROS配置分布式通信
- 升级鸿蒙3.0需要备份吗,升级鸿蒙OS3.0机型曝光!大哥,你是认真的吗?
- 用神经网络例子讲解TF运行方式~人工智能入门编程例子讲解
- Linux中shell提示符定制
- C#中使用DLL文件
- 【Python】闭包Closure
- 局域网内window10和Windows7共享只有USB接口打印机的方法——以sharp2048D为例子
- 思维导图的绘制要点及使用GitMind工具快速制作思维导图
- Anaconda更换字体及字号
- HDU6411 带劲的and和
- 深度学习论文: Computer Vision for Road Imaging and Pothole Detection: A State-of-the-Art Review
- 基于QT实现的职工住房管理系统
- Unity初学:制作2D小游戏Sunny Land 1.游戏背景场景添加
- release版本和debug版本
- 全栈修炼:如何从Web前端迈向全栈开发
- cnc程序加工中心_cnc加工自动可制造性评估的可制造性设计
- 学习笔记:发布自己的python模块安装包