美文网首页java学习之路第三方接入
用支付宝实现支付和提现

用支付宝实现支付和提现

作者: 唯有努力不欺人丶 | 来源:发表于2019-10-25 16:33 被阅读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();
            }
    

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

    相关文章

      网友评论

        本文标题:用支付宝实现支付和提现

        本文链接:https://www.haomeiwen.com/subject/ochdvctx.html