java学习之路第三方接入

用支付宝实现支付和提现

2019-10-25  本文已影响0人  唯有努力不欺人丶

昨天做了 支付宝的支付和提现功能,讲真,简单的我都有点不想总结了。但是为了以后做起来方便还是决定现在费时间点,我写给未来的自己。

必要参数

这个是支付宝方商家要配置的参数

public static final String ALIPAY_PUBLIC_KEY = "公钥";        
    public static final String APPID="appid";       
    // 司机版
    public static final String APP_PRIVATE_KEY ="秘钥";       
    public static final String FORMAT = "json";
    public static final String SX_SERVER_URL = "https://openapi.alipaydev.com/gateway.do";
    public static final String SERVER_URL = "https://openapi.alipay.com/gateway.do";
    public static final String CHARSET = "utf-8";
    public static final String ALIPAY_NOTIFY_URL="支付宝回复的接口地址(必须对外的)";
    public static final String SIGN_TYPE="RSA2";

然后就可以使用了.

APP支付

这里的AlipayConfig是我常量定义的类,照抄的话改成你们自己的配置类

    public String aliPay(String no,String money,String remark) {        
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.SERVER_URL, AlipayConfig.APPID,
                AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, "RSA2");
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody(remark);
        model.setSubject("支付");
        model.setOutTradeNo(no);
        model.setTimeoutExpress("30m");
        if(money!=null) {
            model.setTotalAmount(money);
        }else {
            model.setTotalAmount("0.01");
        }       
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(AlipayConfig.ALIPAY_NOTIFY_URL);
        try {
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
            return response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return null;
    }

这里三个参数no是交易单号,money是钱数,remark是备注。备注可有可无。

提现(就是平台对外转账)

    public String driverCash(String no, String amount, String aliAccount, String remark) {
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.SERVER_URL, AlipayConfig.APPID,
                AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, "RSA2");
        AlipayFundTransToaccountTransferRequest aliRequest = new AlipayFundTransToaccountTransferRequest();
        aliRequest.setBizContent("{" + "\"out_biz_no\":\"" + no + "\"," + "\"payee_type\":\"ALIPAY_LOGONID\","
                + "\"payee_account\":\"" + aliAccount + "\"," + "\"amount\":\"" + amount + "\"," + "\"remark\":\""
                + remark + "\"" + "}");
        try {
            AlipayFundTransToaccountTransferResponse aliResponse = alipayClient.execute(aliRequest);
            if (aliResponse.isSuccess()) {
                return "提现成功";
            } else {
                String msgCode = aliResponse.getSubCode();
                if (msgCode.equals("SYSTEM_ERROR")) {
                    return "系统错误";
                } else if (msgCode.equalsIgnoreCase("PAYEE_NOT_EXIST")) {
                    return "收款账户不存在";
                } else if (msgCode.equalsIgnoreCase("PAYER_BALANCE_NOT_ENOUGH")) {
                    return "付款方余额不足";
                } else {
                    return "提现失败" + aliResponse.getBody();
                }
            }

        } catch (AlipayApiException e) {
            e.printStackTrace();
            return "方法运行错误";
        }
    }

上面三个参数:no是订单号,aliAccount是支付宝账号,amount是钱数,remark是备注。
这其实错误的可能其实很多,但是我这里只写了几种经典的。还有一种isv错误,这个是权限问题,因为现在设置支付宝商家账户开通90天才可以使用这个转账功能(我就遇到了这个问题,现在目前是手动转账的。)。
这个90天也不知道以后会不会改,反正感觉支付宝的接口报错做的挺好的,遇到新的自己去看看为什么错就行了。

web端支付

这个和官网有点不一样,因为官网适合前后端一起的项目,直接返回个页面,但是我们这个是前后端分离的,所以我直接把form的页面代码发给了前端,剩下爱咋咋地吧。

        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.SERVER_URL, AlipayConfig.CARR_ID,
                AlipayConfig.CARR_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.CARR_PUBLIC_KEY, "RSA2");
        // 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.ALIPAY_NOTIFY_URL);
        alipayRequest.setNotifyUrl(AlipayConfig.ALIPAY_NOTIFY_URL);// 在公共参数中设置回跳和通知地址
        alipayRequest.setBizContent("{" + "    \"out_trade_no\":\"20150320010101001\","
                + "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + "    \"total_amount\":"+money+","
                + "    \"subject\":\"Iphone6 16G\"," + "    \"body\":\"Iphone6 16G\","
                + "    \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\","
                + "    \"extend_params\":{" + "    \"sys_service_provider_id\":\"2088511833207846\"" + "    }" + "  }");// 填充业务参数
        try {
            String  form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
            return R.ok().put("data", form);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return R.error();
        }

反正目前这三个方法都实测可用了,然后就这样吧。以后项目中再遇到了会继续续写的。

上一篇下一篇

猜你喜欢

热点阅读