支付宝支付接口沙箱环境测试以及整合到一个ssm电商项目中

准备工作

  • 官方demo
  • 支付宝账号
  • eclipse/idea
  • tomcat

具体步骤

  1. 先下载官方给的demo
    https://docs.open.alipay.com/270/106291/
  2. 导入到eclipse中
    注意:因为此demo不是maven项目所以得配置本地的tomcat
    在这里插入图片描述
  3. 到支付宝开放平台注册开发者账号,进入沙箱
    在这里插入图片描述
  4. 进入沙箱会看到给的一个appid和测试用的支付宝网关,这个用于配置我们的工程的配置文件,后面会用到
  5. 生成应用密钥和应用公钥
    在这里插入图片描述
    根据说明的步骤下载支付宝开放平台开发助手,生成应用密钥和应用公钥即可
    在这里插入图片描述
    并且在沙箱环境中进行配置应用公钥
    在这里插入图片描述
    配置完之后会有一个支付宝公钥,这个也需要配置到配置文件中的
  6. 关于demo
    有一堆jsp文件和一个config类,其实jsp文件中也是写的java代码
    config类:需要配置的参数
    app_id: 就是你的沙箱中的appid,如果申请到正式的了也会有一个appid
    merchant_private_key: 应用私钥,就是刚刚生成的应用私钥
    alipay_public_key: 支付宝公钥,这个就是刚刚配置在沙箱中的应用公钥配置后生成的支付宝公钥,注意这里不是配置应用公钥!
    notify_url:这个是支付宝服务器异步通知页面路径,具体如何处理的代码在notify_url.jsp中
    return_url:这个是支付宝服务器同步通知页面的路径,支付完成后会提示跳转到商户页面也就是此页面,具体代码可以看demo中的return_url.jsp
    gatewayUrl:这个很重要,是支付宝网关,因为我们是沙箱环境所以一定要配置测试用的网关
  7. 运行测试
    运行index.jsp
    在这里插入图片描述
    点击付款,就会成功跳转到扫码页面(如果提示钓鱼网站,建议换浏览器或者把此浏览器关于支付宝的页面都关闭再付款)
    在这里插入图片描述
    如何付款?
    此时注意沙箱中提供了测试账号,可以下载沙箱版支付宝app登录测试账号进行支付,也可以,点击右侧的登录账户付款进行支付
    沙箱账号:
    在这里插入图片描述
    付款之后
    在这里插入图片描述
    也是跳转到了同步通知页面
    基本流程也是这样。

整合到ssm项目中

大体思路:在项目中有一个购物车结算页面,点击提交订单,controller中处理,查看此订单的付款方式,如果是在线支付就跳转到另一个controller中,这个controller也就是demo中的处理支付跳转的jsp中的代码,还要配置一个return_url用来同步页面通知,这个配置同样也是一个controller来处理跳转到一个success.jsp支付成功的页面,这个controller除了跳转到支付成功页面还可以在里面处理订单状态改为已支付一类的业务逻辑
首先是点击提交订单,需要创建一个订单,然后判断订单状态,是货到付款还是在线支付

@RequestMapping("/create")
    public String orderCreate(Order order, Model model,HttpServletRequest request){
        try {
            System.out.println("支付方式为:"+order.getPaymentType());

            //获取用户信息,因为order下都是拦截器拦截过的,拦截器把用户信息存入了请求中
            TbUser user = (TbUser) request.getAttribute("user");
            //设置用户信息,提交订单之前补全用户信息
            order.setBuyerNick(user.getUsername());
            order.setUserId(user.getId());
            String orderId = orderService.createOrder(order);
            //创建完订单之后,如果订单的支付方式为4,代表在线支付,我们要将其跳转到在线支付页面
            if(order.getPaymentType() == 4){
                return "redirect:/order/goAliPay/"+orderId+".html";
            }
            model.addAttribute("paymentType",order.getPaymentType());
            model.addAttribute("orderId",orderId);
            model.addAttribute("payment",order.getPayment());
            model.addAttribute("date",new DateTime().plusDays(3).toString("yyyy-MM-dd"));
            return "success";
        } catch (Exception e) {
            e.printStackTrace();
            model.addAttribute("message","出现了一点问题...");
            return "/error/exception";
        }
    }

在线支付,跳转到另一个controller,注意这里有一个编码设置,如果不设置为UTF-8的话会出现验签失败,而且界面的css样式消失的问题。

@RequestMapping(value = "/goAliPay/{orderId}",produces = "text/html; charset=UTF-8")
    @ResponseBody
    public String goAlipay(@PathVariable String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {

        //根据orderId获取订单信息
        Order order = orderService.getOrderByOrderId(orderId);

        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        String out_trade_no = orderId;
        //付款金额,必填
        String total_amount = order.getPayment();
        //订单名称,必填

        String subject = order.getOrderItems().get(0).getTitle();
        //商品描述,可空
        String body = order.getOrderItems().get(0).getTitle();

        // 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
        String timeout_express = "1c";

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"timeout_express\":\""+ timeout_express +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();

        return result;
    }

支付成功同步通知页面controller

@RequestMapping("/paySuccess")
    public String paySuccess(HttpServletRequest request, HttpServletResponse response,Model model) throws Exception {
        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

        if(signVerified) {
            //商户订单号
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //支付宝交易号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //付款金额
            String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
            Order order = orderService.getOrderByOrderId(out_trade_no);
            order.setStatus(2);
            //修改订单状态
            Integer integer = orderService.changeStatus(order);
            //返回正常修改成功
            if (integer == 200){
                //还要额外加订单支付方式
                model.addAttribute("paymentType",order.getPaymentType());
                model.addAttribute("orderId",order.getOrderId());
                model.addAttribute("payment",order.getPayment());
                model.addAttribute("date",new DateTime().plusDays(3).toString("yyyy-MM-dd"));
                return "success";
            }else{
                return "/error/exception";
            }
        }else {
            System.out.println("验签失败");
        }
        return "/error/exception";
    }

这个也是复制的demo中的代码稍作修改即可
整体整合流程就这样,整合的关键是分析一下demo中的alipay.trade.page.pay.jsp和return_url.jsp和notify_url.jsp,里面都有很详细的说明!
支付接口与项目整合到此结束了

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SSM的Maven项目加入支付沙箱支付,可以按照以下步骤进行操作: 1. 注册支付开发者账号,并创建应用:首先,你需要注册一个支付开发者账号(https://open.alipay.com),然后创建一个应用,获取对应的AppID、支付公钥和私钥等信息。 2. 导入Alipay SDK:在你的Maven项目,添加Alipay SDK的依赖。你可以在pom.xml文件添加以下依赖: ```xml <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>3.7.110.ALL</version> </dependency> ``` 3. 配置支付参数:在项目的配置文件,配置支付的相关参数。你可以在`src/main/resources`目录下创建一个名为`alipay.properties`的文件,并添加以下内容: ``` alipay.appId=你的AppID alipay.gatewayUrl=https://openapi.alipaydev.com/gateway.do alipay.signType=RSA2 alipay.charset=UTF-8 alipay.format=json alipay.publicKey=支付公钥 alipay.privateKey=户私钥 ``` 注意替换`你的AppID`、`支付公钥`和`户私钥`为你自己的实际值。 4. 创建支付服务类:在项目创建一个支付服务类,用于处理支付相关的逻辑。你可以参考以下代码示例: ```java import java.util.Map; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradePagePayRequest; import com.alipay.api.response.AlipayTradePagePayResponse; public class AlipayService { private AlipayClient alipayClient; public AlipayService() { alipayClient = new DefaultAlipayClient( ConfigUtil.getProperty("alipay.gatewayUrl"), ConfigUtil.getProperty("alipay.appId"), ConfigUtil.getProperty("alipay.privateKey"), "json", ConfigUtil.getProperty("alipay.charset"), ConfigUtil.getProperty("alipay.publicKey"), ConfigUtil.getProperty("alipay.signType") ); } public String createOrder(String outTradeNo, String totalAmount, String subject, String returnUrl) throws AlipayApiException { AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); request.setReturnUrl(returnUrl); request.setNotifyUrl(ConfigUtil.getProperty("alipay.notifyUrl")); request.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\"," + "\"total_amount\":\"" + totalAmount + "\"," + "\"subject\":\"" + subject + "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}"); AlipayTradePagePayResponse response = alipayClient.pageExecute(request); if (response.isSuccess()) { return response.getBody(); } else { throw new AlipayApiException(response.getSubMsg()); } } public boolean verifyCallback(Map<String, String> params) throws AlipayApiException { return alipayClient.verify(params); } } ``` 这里的`ConfigUtil`是一个读取配置文件的工具类,你可以自己实现或使用第三方库。 5. 创建支付页面:在你的项目创建一个支付页面,用于展示支付支付的界面。这个页面可以包含一个表单,用户填写支付相关信息。提交表单后,调用支付服务类的`createOrder`方法生成支付链接,并跳转到支付页面。 这样,你就可以在SSM的Maven项目加入支付沙箱支付了。记得在开发环境使用沙箱环境,确保支付功能正常后再切换到生产环境

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值