支付宝统一下单接口的接入(1)

因为公司需求所以就去看了一下支付宝的支付接入,在这里记录一下,也为了加深一下印象。
首先需要进入到支付宝的开放平台根据文档配置好相应的配置。

配置依赖



    com.alipay.sdk
    alipay-sdk-java
    4.9.9

下面就是下单的接口的代码,这里要说下最好是从数据库里面拿到你的订单信息。
有一些须要准备的参数
APPID(支付宝给的唯一id)、APP_PRIVATE_KEY(开发者秘钥通过支付宝的秘钥工具由开发者生成)、ALIPAY_PUBLIC_KEY(支付宝公钥,上传应用公钥支付宝生成的相应公钥)

 public void alipay(Order order, HttpServletResponse response) {
        //创建一个阿里支付的客户端,所有的支付、退款、查询等等相关的请求都是由这个对象发送的
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayConfig.gatewayUrl,//支付宝的网关,https://openapi.alipay.com/gateway.do
                AlipayConfig.app_id,//商户的appId
                AlipayConfig.merchant_private_key,//开发者秘钥
                "json",//参数返回格式,只支持JSON
                AlipayConfig.charset,//编码格式
                AlipayConfig.alipay_public_key,//支付宝公钥
                AlipayConfig.sign_type   //生成签名的加密类型
                ); //获得初始化的AlipayClient

        //申请支付页面的请求对象
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的request
        //设置同步返回的url - 用户支付完成后跳转到哪里页面 GET
        alipayRequest.setReturnUrl("http://localhost:8080/login");
        //设置异步返回的0url - 用户支付结果的通知url POST
        alipayRequest.setNotifyUrl("http://localhost:8080/pay/alipaypayment");//在公共参数中设置回跳和通知地址
        //支付请求体
        alipayRequest.setBizContent("{" +
                "    \"out_trade_no\":\""+order.getOrderId()+"\"," +	//订单号
                "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +//这个是销售产品码这个不用改
                "    \"total_amount\":"+order.getPrice().doubleValue()+"," +//订单价格
                "    \"subject\":\""+order.getSubject()+"\"," +//订单标题
                "    \"body\":\""+order.getBody()+"\"," +//订单内容
//                "    \"timeout_express\":\"3h\"," +//订单有效期
                "    \"extend_params\":{" +//业务扩展参数可甜可不填根据需要
                "    \"sys_service_provider_id\":\"2088511833207846\"" +
                "    }"+
                "  }");//填充业务参数
        //生成支付的表单页面 - 一串HTML文本
        String form="";
        try {
            form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单
            AlipayTradePagePayResponse alipayTradePagePayResponse = alipayClient.pageExecute(alipayRequest);
            if(alipayTradePagePayResponse.isSuccess()){
                System.out.println("调用成功");
            } else {
                System.out.println("调用失败");
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        response.setContentType("text/html;charset=UTF-8" );
        try {
            response.getWriter().write(form);//直接将完整的表单html输出到页面
            response.getWriter().flush();
            response.getWriter().close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

到这里支付宝的下单接口就完成了
这里说下我碰到的一些问题:
1、支付页面没有展示出来-----因为当时是用ajax异步直接请求支付接口的,但是因为异步会堵塞导致支付宝的页面不能异步跳转展示。(这个不知道是不是这样我是听别人说的),用form表单提交或者直接请求不通过异步是没有问题的。
2、进入之后报错

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence

这是因为你的私钥格式错了,我是使用java是需要PKCS8格式的但是公司给的是PKCS1非java格式的,后面把格式转换成java适用的PKCS8就可以了

支付异步回调处理:https://blog.csdn.net/weixin_45589505/article/details/105009084

你可能感兴趣的:(支付宝统一下单接口的接入(1))