SSM如何实现支付宝支付

最近空闲时间做了一个关于交易的小项目,还是基于SSM框架,大部分都是一些基础功能,只得说一下的就是支付功能的实现。

从项目一开始,我就没有想其他业务怎么实现,心中一直在想支付功能的实现,就是用户点击结算后生成订单,然后跳转到支付宝支付页面,用户扫码支付,支付成功后,页面进行刷新,就这么一个流程。

昨天,我认真阅读了一下支付宝支付的官方文档,阅读之后,便开始整合。

第一步:登陆支付宝开放平台-开发文档
在这里插入图片描述

登陆成功后点击导航栏【开发者中心】
在这里插入图片描述
接着点击【沙箱】
在这里插入图片描述

我们看到下面界面
在这里插入图片描述

这里我们需要注意四个参数

1.APPID:直接使用就可以,这个参数不需要你特意生成,沙箱应用会自动给用户创建好。

2.支付宝网关:直接使用就可以,这里有一个小知识点,需要注意,就是上图中的网关直接拿去用就可以,所有用户的都一样。仔细观察发现,该网关中alipay后面有dev,表明这是开发环境网关。

3.RSA2(SHA256)密钥:需要开发者手动生成密钥(也就是应用私钥)

直接告诉你这个需要用工具生成,很简单,我直接给大家贴上软件网址。

WINDOWS(windows版本工具请不要安装在含有空格的目录路径下)

MAC_OSX

(1)下载相应环境工具并安装后即可使用,本步骤指引以 MAC_OSX 界面为例,如下图所示:
在这里插入图片描述

(2).开发者根据开发语言选择密钥格式和密钥长度,新建应用请务必使用 RSA2密钥长度 即2048 位(目前已使用 RSA 密钥长度即1024 位密钥长度的应用仍然可以正常调用接口)。点击 生成密钥 后,工具会自动生成商户应用公钥(public key)和应用私钥(private key),如下图所示:
在这里插入图片描述

通过上面生成密钥的方法就可以生成,应用的私钥和公钥。

复制公钥—点击设置,进行设置就行了。
在这里插入图片描述

在这里插入图片描述

生成的私钥需妥善保管,避免遗失,不要泄露。应用私钥需填写到代码中供签名时使用。应用公钥需提供给支付宝账号管理者上传到支付宝开放平台。(私钥自己先留着,代码中使用)

4.RSA密钥:分为 【应用公钥】 和 【支付宝公钥】

应用公钥已经设置好了,支付宝公钥直接点击查看就可以了。

上面就是整个的设置过程。下面开始整合。

准备支付宝支付需要的架包。

集成支付宝接口需要引入的文件是:
alipay-sdk-java*.jar
commons-logging-1.1.1.jar

下载地址https://docs.open.alipay.com/54/103419/

首先编写一个支付宝配置类,需要写入上面设置好的一些数据。

AlipayConfig类

import java.io.FileWriter;
import java.io.IOException;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    public static String app_id = "";

    // 商户私钥,您的PKCS8格式RSA2私钥,就是我们用工具生成的,我让你先保存起来的
    public static String merchant_private_key = "";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

}

前端选好物品,生成订单,选择支付后的拦截器

@RequestMapping(value ="/buyshopping",method = RequestMethod.GET)
    public void  buyshopping(@RequestParam String sumPrice, @RequestParam int[] ids, @RequestParam Integer client, HttpServletResponse response) throws IOException {
        //跳转到支付宝付款页面
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id,AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

//      订单号
        String out_trade_no = OrderCodeFactory.getOrderIdByUUID();
        out_trade_no  = URLDecoder.decode(out_trade_no,"UTF-8");
//      总金额
        String total_amount = sumPrice;
        total_amount = URLDecoder.decode(total_amount,"UTF-8");
//      商品名称,我这里只获取是第一个商品的信息,读者按照实际情况进行编写逻辑
        Shopping shoppings = shoppingDao.queryShoppingById(ids[0]);
        String subject = shoppings.getTitle();
        subject = URLDecoder.decode(subject,"UTF-8");
//      商品描述
        String body = subject;
        body = URLDecoder.decode(body,"UTF-8");

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest(); ///创建API对应的request
      //回调函数
        alipayRequest.setReturnUrl("success");
        alipayRequest.setBizContent("{" +
                "    \"out_trade_no\":\""+ out_trade_no +"\"," +
                "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
                "    \"total_amount\":"+ total_amount +"," +
                "    \"subject\":\""+ subject +"\"," +
                "    \"body\":\""+ body +"\"" +
                "    }"+
                "  }");

        String form="";
        try {
            form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println(form);//直接将完整的表单html输出到页面
        response.getWriter().close();
    }

回调函数success,支付成功后做的逻辑,我这个是个例子。

@RequestMapping("/success")
    public ModelAndView success(String out_trade_no,Double total_amount){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("success");
        modelAndView.addObject("money",total_amount);
        modelAndView.addObject("no",out_trade_no);
        return modelAndView;
    }

对了,记得下载沙箱版的支付宝,你如果用正式版扫描二维码会提示无效。

发布了32 篇原创文章 · 获赞 4 · 访问量 2358

猜你喜欢

转载自blog.csdn.net/weixin_44644403/article/details/104027375