支付宝如何开发APP支付功能

主流程如下:

1、建支付宝账号

2、申请权限功能(APP支付、开发权限等)

3、用阿里给的工具生成密钥和证书,并且上传到阿里,然后他会生成三个文件(支付宝公钥、ROOTCERT、公钥证书)

4、最后就是代码(这里也用阿里封装好的代码,加签解签)

 

 

 

1、创建企业用户且登录

https://auth.alipay.com/login/index.htm

 

2、选择你想要开发的功能(比如APP支付)

 

3、这里会有相应的文档

https://b.alipay.com/signing/productDetailV2.htm?productId=I1011000290000001002

这里主要看接入指引和申请条件

 

参考一下申请条件,看看自己是否符合。一般都没啥问题

1)然后点击”立即接入" 企业证书什么的填写好,经过审批(大概一个工作日)

2)入驻成为开发者——又是一系列傻瓜操作

3)基本进入开发

 

4、开发流程

创建APPID——配置密钥——开发(加签、验签)

第一次做,总会有点迷糊,这里最麻烦就是配置密钥

https://open.alipay.com/platform/keyManage.htm

这是主要是配置接口加签方式,点击加签方式(我这里已经配置好了,所以有一些不一样)

流程是,下载支付宝提供的密钥(证书)软件——生成密钥——上传生成好的密钥文件——下载支付宝公钥、RootCert、自己的公钥证书,操作如下:

1)点击查看接口文档

https://docs.open.alipay.com/291/105971#Krqvg

其实文档说得很明白了,我这里简单说明

密钥长度选择RSA2(更安全)

密钥格式PKCS8(JAVA适用)

点击生成密钥

点击获取CSR文件 (点击后在硬盘将生成csr文件和两个密钥,csr用于上传到支付宝)

点击打开文件位置,查看自己生成的文件

 

5、回到网站配置密钥

选择公钥证书——上传刚刚生成的CSR文件

此时,这里有三个下载证书连接,全部下载下来,放到硬盘中,开发需要用到

6、进入代码开发

https://docs.open.alipay.com/204/105297/ 快速接入文档

 

我们可以看到流程,按照一个电商平台的流程,我理解如下

1、用户选择好商品后,提交

2、服务端生成订单返回(这里还没关联到支付宝)

3、用户选择支付方式(这里选支付宝),点击支付按钮(发送订单信息到服务器)

4、将订单生成支付需要的信息(拼参数,加密,加签),返回到前端

5、前端调支付宝封装好的接口,将参数传递(这时候会跳转到支付宝支付界面,后面用户在支付宝支付后就完事儿了)

6、支付宝返回到用户界面。

7、同时后台会异步收到交易信息

8、有时候,我们也会发起查询,主动获取支付状态

后台代码操作如下:

 

点击 开放平台服务端DEMO&SDK

点击MAVEN项目依赖,这个JAR包里,可以用到支付宝提供的加签解签接口。相当方便

 

配置在pom.xml项目中

<dependency>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-sdk-java</artifactId>
   <version>4.9.13.ALL</version>
</dependency>

 

这里我们先做支付接口(支付宝提供了两种方式,一种不用证书,一种用证书方式。我们肯定是需要用证书的)

刚刚进入的网页,拉到下边,就是证书的DEMO

我的参考代码如下

    private AlipayClient constractCertAlipayClient() throws AlipayApiException {
        //构造client
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        //设置网关地址
        certAlipayRequest.setServerUrl(ServerUrl);
        //设置应用Id
        certAlipayRequest.setAppId(appid);
        //设置应用私钥
        certAlipayRequest.setPrivateKey(appprivatekey);
        //设置请求格式,固定值json
        certAlipayRequest.setFormat(format);
        //设置字符集
        certAlipayRequest.setCharset(charset);
        //设置签名类型
        certAlipayRequest.setSignType(signType);
        //设置应用公钥证书路径
        certAlipayRequest.setCertPath(certpath);
        //设置支付宝公钥证书路径
        certAlipayRequest.setAlipayPublicCertPath(alipaypubliccertpath);
        //设置支付宝根证书路径
        certAlipayRequest.setRootCertPath(rootcertpath);
        //构造client
        return new DefaultAlipayClient(certAlipayRequest);
    }


    @Override
    public String paymentWithApp(Orders orders) throws AlipayApiException {

        String returnStr = null;
        AlipayClient alipayClient = this.constractCertAlipayClient();
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody(orders.getDescription());
        model.setSubject(orders.getDescription());
        model.setOutTradeNo(String.valueOf(orders.getId()));
        model.setTimeoutExpress(timeoutExpress);
        model.setTotalAmount(String.valueOf(orders.getAmount()));
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(otifyUrl);
        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
            returnStr = response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return returnStr;
    }

 

这里主要就是把刚刚的证书,传给支付宝,调用他们提供的接口,就会自动加签。接口返回的字符串可以直接返回给前端

otifyUrl是支付保返回时候,你接收的地方接口

   /**
     * 把request转为map
     *
     * @param request
     * @return
     */
    private Map<String, String> getParameterMap(HttpServletRequest request) {
        // 参数Map
        //获取支付宝POST过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }
        return params;
    }

    @Override
    public Map<String, String> callBack(HttpServletRequest request) throws AlipayApiException {
        Map<String, String> paramMap = this.getParameterMap(request);
        log.info("请求回调 ========> " + JSONObject.toJSON(paramMap).toString());
        boolean signVerified = AlipaySignature.rsaCertCheckV1(paramMap, alipaypubliccertpath, charset, "RSA2");//调用SDK验证签名
        if(signVerified) {
            return paramMap;
        } else {
            return null;
        }
    }

 

AlipaySignature.rsaCertCheckV1 这个阿里提供的解签,调用一下,就搞定了。整个流程基本如些

查询接口参考如下:

    @Override
    public String queryOrder(String orgOrderId, Integer orderId) throws AlipayApiException {
        //构造client
        AlipayClient alipayClient = this.constractCertAlipayClient();
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();//创建API对应的request类
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("out_trade_no", orderId);
        jsonObject.put("trade_no", orgOrderId);
        request.setBizContent(jsonObject.toJSONString());
        AlipayTradeQueryResponse response = alipayClient.certificateExecute(request);//通过alipayClient调用API,获得对应的response类
        System.out.print(response.getBody());
        log.info("查询返回信息 ========> " + response.getBody());
        String returnStr = response.getBody();
        return returnStr;
    }

退款接口参考如下:

    @Override
    public Boolean refundOrder(String orgOrderId, Integer orderId, BigDecimal refundAmount) throws AlipayApiException {
        AlipayClient alipayClient = this.constractCertAlipayClient();
        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("out_trade_no", String.valueOf(orderId));
        jsonObject.put("trade_no", orgOrderId);
        jsonObject.put("refund_amount", String.format("%.2f", refundAmount.doubleValue()));
        request.setBizContent(jsonObject.toJSONString());

        AlipayTradeRefundResponse response = alipayClient.certificateExecute(request);
        if(response.isSuccess()){
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return true;
    }

(大家看这几个接口,他们的request分别如下:AlipayTradeAppPayRequest 、AlipayTradeQueryRequest 、AlipayTradeRefundRequest 。阿里就是从这个传弟的参数,判断调用的接口)

 

其它接口大致如上,我们可以点击

https://docs.open.alipay.com/204/105303/

 

去开发自己需要接口去吧,孩子们!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章