SpringBoot整合支付宝APP支付

时间:2021-05-20

前言

现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付,老习惯,功能做完之后做个复盘记录,这边主要讲解支付宝APP支付

所需条件

1、创建蚂蚁金服开放平台公司账号

2、选择开发中心---->移动应用

3、选择支付接入

4、创建应用

5、查看应用appId

6、添加功能

两个功能:支付宝授权功能和APP支付功能

7、功能签约

开发流程

引入支付宝支付SDK

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

1、支付宝参数配置类

/** * AlipayConfig.java * com.prereadweb.order.config * Copyright (c) 2019, 北京聚智未来科技有限公司版权所有. */package com.prereadweb.order.config; /** * @Description: 支付宝支付配置文件 * @author: Administrator * @date: 2019/6/11 17:01 */public class AlipayConfig { // APPID public static String app_id = "你应用的APPID"; // 生成公钥时对应的私钥(填自己的) public static String private_key = "你的秘钥"; //异步回调接口:得放到服务器上,且使用域名解析 IP public static String notify_url = "回调函数接口"; //支付宝网关(注意沙箱alipaydev,正式则为 alipay)不需要修改 public static String url = "https://openapi.alipay.com/gateway.do"; //编码类型 public static String charset = "UTF-8"; //数据类型 public static String format = "json"; // 公钥 public static String public_key = "你的公钥"; //签名类型 public static String signtype = "RSA2"; }

2、下单接口

controller层

/** * @Function: 去支付 * @author: YangXueFeng * @Date: 2019/6/11 16:10 */ @RequestMapping("/gotopay") public Object goToPay(@Param("orderId") Long orderId){ return alipayViewService.setGotoPayInfos(orderId); }

service层

/** * @Function: 去支付 * @author: YangXueFeng * @Date: 2019/6/11 16:11 */ @Override public Map<String, Object> setGotoPayInfos(Long orderId) { Map<String, Object> map = new HashMap<>(); if(Util.isEmpty(orderId)){ map.put("code", UserStatusEnum.EMPTY.intKey()); map.put("msg", UserStatusEnum.EMPTY.value()); return map; } PayParameterForm payParameter = orderMapper.getPayParameter(orderId); AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.url, AlipayConfig.app_id, AlipayConfig.private_key, AlipayConfig.format, AlipayConfig.charset, AlipayConfig.public_key, AlipayConfig.signtype);//支付宝需要的参数serverUrl、appId、private_key、format、charset、public_key、signType AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(payParameter.getTitle());//商品信息 model.setSubject(payParameter.getTitle());//商品名称 model.setOutTradeNo(String.valueOf(payParameter.getOrderId()));//订单号 model.setTimeoutExpress("30m");//支付超时时间 model.setTotalAmount(String.valueOf(0.01));// 支付金额 request.setBizModel(model); // 回调地址(充值订单) request.setNotifyUrl(AlipayConfig.notify_url);// 回调地址 //这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = null; try { response = alipayClient.sdkExecute(request); map.put("code", UserStatusEnum.SUCCESS.intKey()); map.put("msg", UserStatusEnum.SUCCESS.value()); Map<String, Object> dataMap = new HashMap<>(); dataMap.put("payPath", response.getBody()); map.put("data", dataMap); return map; } catch (AlipayApiException e) { e.printStackTrace(); } map.put("code", UserStatusEnum.ERROR.intKey()); map.put("msg", UserStatusEnum.ERROR.value()); return map; }

3、回调接口

controller层

/** * @Function: 支付宝异步通知回调 * @author: YangXueFeng * @Date: 2019/6/11 20:02 */ @ResponseBody @RequestMapping("/notify") public String notify(HttpServletRequest request, HttpServletResponse response) { return alipayViewService.notify(request, response); }

service层

/** * @Function: 支付宝异步回调接口 * @author: YangXueFeng * @Date: 2019/6/11 20:03 */ @Override public String notify(HttpServletRequest request, HttpServletResponse response) { Map<String, String> params = new HashMap<String, String>(); //从支付宝回调的request域中取值 Map<String, String[]> requestParams = request.getParameterMap(); for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = iter.next(); String[] values = 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"); // 商户订单号 // 当前交易状态 String tradeStatus = request.getParameter("trade_status"); //交易状态 // 支付金额 String totalAmount = request.getParameter("total_amount"); //交易状态 // 支付时间 String payDate = request.getParameter("gmt_payment"); //交易状态 //3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的) boolean signVerified = false; try { //3.1调用SDK验证签名 signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.public_key, AlipayConfig.charset, AlipayConfig.signtype); } catch (AlipayApiException e) { e.printStackTrace(); } //返回状态存入redis中 //对验签进行处理 if (signVerified) { //验签通过 if(tradeStatus.equals("TRADE_SUCCESS")) { //支付成功后的业务处理 OrderEntity order = orderMapper.getOrderInfo(Long.valueOf(out_trade_no)); if(!Util.isEmpty(order)){ order.setStatus(CalculatStaticConstant.CHECK_ONE); order.setCompleteTime(DateUtil.currentDate()); orderMapper.updateOrder(order); } OrderPayEntity orderPay = new OrderPayEntity(); orderPay.setId(Long.valueOf(IdUtils.getPrimaryKey())); orderPay.setOrderId(order.getId()); orderPay.setUserId(order.getUserId()); orderPay.setPayPrice(Double.valueOf(totalAmount)); orderPay.setPayType(PayTypeEnum.ALI_PAY.intKey()); orderPay.setStatus(CalculatStaticConstant.CHECK_ONE); orderPay.setPayTime(payDate); orderMapper.saveOrderPay(orderPay); RedisUtil.set("ali"+out_trade_no, tradeStatus,300); return "success"; } } else { //验签不通过 System.err.println("验签失败"); return "failure"; } return "failure"; }

此处回调函数接口要有返回值,成功后返回success(success是小写,别大写),此处如果没有返回值的话,支付宝会一直进行回调通知

至此,支付宝APP支付OK

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章