1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Java 支付宝手机网站支付下单 支付回调 及订单查询实现

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

时间:2021-01-25 00:39:55

相关推荐

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

首先,参考官方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 "/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);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。