首先,参考官方api:
alipay.trade.wap.pay(手机网站支付接口2.0)
官方提供DEMO下载,不过是jsp的
准备工作:平台入驻,签约功能,应用上线,配置秘钥等

使用Alipay SDK:

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

固定参数配置类:

// 由于部分数据来自数据库,这里用到了我自己写的service,不需要查询的话也可以直接在config中写一个固定值
import com.tb.service.ShopDeviceService;public class AlipayConfig {private ShopDeviceService shopDeviceService;// 为了传递service,只能使用new的形式创建public AlipayConfig(ShopDeviceService shopDeviceService) {this.shopDeviceService = shopDeviceService;}// 商户appidpublic String getAppId() {return shopDeviceService.getDictDetailByNameAndLabel("PAY-INFO", "AlipayAppid");}// 支付宝公钥public String getAliPayPublicKey() {return shopDeviceService.getDictDetailByNameAndLabel("KEY", "支付宝公钥");}// 私钥 pkcs8格式的public String getRSAPrivateKey() {return shopDeviceService.getDictDetailByNameAndLabel("KEY", "支付宝应用私钥");}// 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public String getNotifyUrl() {return shopDeviceService.getDictDetailByNameAndLabel("URL", "AliPayNotify");}// 请求网关地址public String getUrl() {return "https://openapi.alipay.com/gateway.do";}// 编码public String getCharset() {return "UTF-8";}// 返回格式public String getFormat() {return "json";}// RSA2public String getSignType() {return "RSA2";}public String getProductCode() {return "QUICK_WAP_WAY";}// subjectpublic String getSubject() {return "WASHER";}
}

手机网站支付接口:

    // ALIPay 下单 跳转至付款界面@PreAuthorize("@el.check('anonymous')")// 匿名访问@PostMapping("/aliPrePay")public void alipayPlaceOrder(@RequestBody Map params, HttpServletResponse response) throws AlipayApiException {// 创建订单并返回订单idShopOrderDTO shopOrderDTO = createOrder(params); //new配置类,传入需要的serviceAlipayConfig alipayConfig = new AlipayConfig(shopDeviceService);//支付固定写法从这里开始了!AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),alipayConfig.getRSAPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAliPayPublicKey(), alipayConfig.getSignType());AlipayTradeWapPayRequest req = new AlipayTradeWapPayRequest();AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();model.setOutTradeNo(shopOrderDTO.getId().toString());model.setSubject(alipayConfig.getSubject());String amount = String.valueOf(shopOrderDTO.getAmount().floatValue() / 100);model.setTotalAmount(amount);model.setProductCode(alipayConfig.getProductCode());req.setBizModel(model);req.setNotifyUrl(alipayConfig.getNotifyUrl());logger.info("发起AliPay下单请求");String form = alipayClient.pageExecute(req).getBody();response.setContentType("text/html;charset=" + alipayConfig.getCharset());try {//直接将完整的表单html输出到页面response.getWriter().write(form);response.getWriter().flush();response.getWriter().close();} catch (IOException e) {logger.info("AliPay 界面跳转失败");}}

异步通知接口:

    // AliPay 支付异步通知@PreAuthorize("@el.check('anonymous')")@PostMapping("/aliPayNotify")public void alipayReturn(HttpServletRequest request) {logger.info("AliPay 支付回调:");Map<String,String> params = new HashMap();Map requestParams = request.getParameterMap();for (Iterator 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] + ",";}//乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");params.put(name, valueStr);}String out_trade_no = request.getParameter("out_trade_no");ShopOrderDTO orderDto = shopOrderService.findById(Long.valueOf(out_trade_no));String trade_no = request.getParameter("trade_no");String trade_status = request.getParameter("trade_status");Float amount = Float.valueOf(request.getParameter("total_amount"));AlipayConfig alipayConfig = new AlipayConfig(shopDeviceService);try {boolean verify_result = AlipaySignature.rsaCheckV1(params, alipayConfig.getAliPayPublicKey(), alipayConfig.getCharset(), alipayConfig.getSignType());if(verify_result) { // 签名校验if (trade_status.equals("TRADE_SUCCESS") && !StringUtils.isBlank(trade_no) ) {// 支付成功// 一些自己的判断,比如金额,订单支付状态等等,自行修改if (amount == Float.valueOf(orderDto.getAmount())/100 && orderDto.getState() == 1) {onSuccess(orderDto, trade_no);return "success";} else if (orderDto.getState() == 0) {// 日志保存shopLogService.anonymousCreate(shopLogService.getShopLog(orderDto.getStoreId(), orderDto.getDeviceId(), "订单支付状态有误","订单支付状态为已支付 : " + orderDto.getId()));} else if (amount != Float.valueOf(orderDto.getAmount())/100){shopLogService.anonymousCreate(shopLogService.getShopLog(orderDto.getStoreId(), orderDto.getDeviceId(), "AliPay支付金额有误","金额有误 : " + orderDto.getId()));}} else {shopLogService.anonymousCreate(shopLogService.getShopLog(orderDto.getStoreId(), orderDto.getDeviceId(), "AliPay支付失败",orderDto.getId()+""));}} else {logger.info("AliPay 签名校验失败");}} catch (AlipayApiException e) {logger.info("AliPay 签名校验失败");e.printStackTrace();}return "fail";}

订单查询接口:

    // AliPay 订单查询@PreAuthorize("@el.check('anonymous')")@GetMapping("/aliPayQuery")public ResponseEntity AliPayQuery(String id) {ShopOrderDTO orderDTO = shopOrderService.findById(Long.valueOf(id));// 这里可以加一层判断,如果订单是已支付且已有支付id直接返回成功就好,不必再调支付宝查询接口try {AlipayConfig alipayConfig = new AlipayConfig(shopDeviceService);AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig.getUrl(), alipayConfig.getAppId(),alipayConfig.getRSAPrivateKey(), alipayConfig.getFormat(), alipayConfig.getCharset(),alipayConfig.getAliPayPublicKey(), alipayConfig.getSignType());AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();AlipayTradeQueryModel model = new AlipayTradeQueryModel();model.setOutTradeNo(id);request.setBizModel(model);logger.info("发起 AliPay 查询请求:");AlipayTradeQueryResponse response = alipayClient.execute(request);Map map = JSON.parseObject(response.getBody(), Map.class);Map result = JSON.parseObject(map.get("alipay_trade_query_response").toString(), Map.class);if (result.get("code").toString().equals("10000") && result.get("trade_status").toString().equals("TRADE_SUCCESS") // 支付成功&& Float.valueOf(result.get("total_amount").toString()) == Float.valueOf(orderDTO.getAmount())) {  // 金额与订单金额相等// TODO 支付成功后回调已经做了一些事 查询的时候要做什么有待思考ShopOrder order = new ShopOrder();order.setId(orderDTO.getId());order.setState(0);order.setPayId(result.get("trade_no").toString());shopOrderService.update(order);}return new ResponseEntity<>(result, HttpStatus.OK);} catch (AlipayApiException e) {logger.info("AliPay 查询失败");return new ResponseEntity(HttpStatus.OK);}}

Java 支付宝手机网站支付下单 支付回调 及订单查询实现相关推荐

  1. PHP对微信支付V2版本回调以及订单查询(逻辑重制版)

    PS:v2版本支付的回调以及订单的查询都已经写过了,昨天在和别人讨论时,对相关的逻辑做出了较大的修改,回调配合订单查询共同使用,提高安全防护; 小程序端JS代码: getData(){var open ...

  2. 支付宝手机网页唤醒app支付

    请直接看原文 下面链接是新版本的RSA2加密方式,这篇介绍的是老版本的手机网站唤醒app支付 新版支付宝手机网站唤醒app支付.支付宝pc支付.支付宝无密退款实现 http://blog.csdn.n ...

  3. 支付宝手机网站支付,app支付,PC端支付流程以及服务端php支付下单,回调流程详解

    一.支付宝支付相关文档地址: 支付宝支付相关的文档地址:https://open.alipay.com/api 电脑网站支付:https://opendocs.alipay.com/open/270/ ...

  4. 【支付宝支付】Java实现支付宝手机网站支付流程

    前言 微信登录网页授权与APP授权 微信JSAPI支付 微信APP支付 微信APP和JSAPI退款 支付宝手机网站支付 支付宝APP支付 支付宝退款 以上我都放到个人公众号,搜一搜:JAVA大贼船,文 ...

  5. java接入支付宝手机网站支付

    适用范围:申请支付宝手机网站支付接口并完成认证,适用于手机wap网页,微信默认不支持可通过引导用户至浏览器支付,发送请求后调用支付宝客服端完成支付,如果没有安装APP则使用网页支付. 支付宝其他支付方 ...

  6. django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...

    一.前言 本文主要针对 Python for Django 在对接支付宝电脑网站.手机网站.App支付过程中具体实现步骤进行详解: 相信大家支付功能也写了不少,但时间一长,再次用到的时候有些细节难免会 ...

  7. 支付--支付宝手机网站支付(WAP)

    介绍: 这是放在微信供公众号内的一个项目,支付模块设计到微信公众号支付和支付宝手机网站支付,这次把支付宝手机网站支付整理下来. 文档: 支付宝手机网站支付的开发文档: https://docs.ope ...

  8. Laravel 集成支付宝手机网站支付

    前期准备: 1.下载SDK,里面还有Demo,可以参照Demo里面的内容快速接入 支付宝 手机网站支付SDK&Demo 2.把下载的zip文件解压,放到项目目录里,这里作者放在app文件夹里, ...

  9. PHP接入支付宝手机网站支付、移动支付接口

    payment 项目2.0版本 前面已经说完了 PHP接入支付宝 即时到帐接口 回调接口也已经完成.这篇主要讲 手机网站支付 . 移动支付 接口的调用.调用方式与即时到帐 基本一样. 关于代码部分的详 ...

最新文章

  1. [转]你在修佛,还是在修魔
  2. 仿真环境Mininet的搭建
  3. 人脸识别及对比_没有“色彩对比可及性的神话”
  4. C++ 使用extern C简单使用
  5. LeetCode 1674. 使数组互补的最少操作次数(差分思想)
  6. postgresql 9.1 下的 pg_dump 的初步研究
  7. 介绍一个小技巧,如何实现ssh免密登录
  8. 【机器学习】Tensorflow基本使用
  9. jvm学习--类加载器
  10. oracle删除导入库,oracle数据库删除和导入方法
  11. 使用npm安装yarn
  12. 前期需求分析以及原型图设计
  13. BK7256,上海博通-音视频Wi-Fi6combo-soc,内置Flash,RGB屏驱\720P
  14. 虚拟机配置及系统加固
  15. 2014年3月份第3周51Aspx源码发布详情
  16. 百度地图绘制实时路线以及最短线路规划
  17. Mac - Android Studio 模拟器突然打不开了解决方法,亲测有用
  18. ThreeJS程序员兼职副业平台推荐
  19. Linux下的自动化工具xdotool
  20. Android 之Loader(加载器)

热门文章

  1. RK3399 HDCP 2.2key
  2. Netty的断线重连
  3. 入坑百度飞浆PP深度学习(一)
  4. MySQL之数据查询(多表查询)
  5. ASP.Net请求处理机制初步探索之旅 - Part 2 核心(转)
  6. 爬取前程无忧数据,并存入数据库
  7. XTF文件的数据结构解析完成
  8. Win7 64位系统USB免驱设备驱动识别失败解决方法
  9. 8个你不使用的数据科学R包(但绝对应该使用)
  10. Linux运维学习笔记之二:常用命令