JAVA支付宝app端支付以及提现

写这个是因为刚做完,勉强能用,怕以后会忘 mark一下!大家多多指教

其实支付宝SDK弄得已经很清楚了,不像某些sdk连JAVA版本的都没有。注意注意:支付宝授权之后才能获取用户信息,但是想要授权就只能去掉用支付宝的接口,跳转到支付宝用户点击确定之后才能授权成功,但可惜的是,此时是无法跳转到自己的app产品中的,只能跳转到支付宝的某个界面中,如果想要跳回到自己的页面,只能使用支付宝登录那个接口。客服给我的建议是让用户自己去填写他们自己的支付宝账号,后来想出来一种办法,但是没去实验是否可以实现。

要进行支付,首先你的有公司的账号去申请权限或者使用沙箱环境。具体申请步骤略。我这里记录的是申请之后的具体代码

首先是支付宝授权的代码
最最重要的就是这几个参数,注意,要配置上
String APP_ID = "自己的appid";
String APP_PRIVATE_KEY = "自己的私钥";
//填写的是支付宝的公钥
String ALIPAY_PUBLIC_KEY =" 支付宝的公钥,注意,是支付宝公钥";
String CHARSET = "UTF-8";
String SIGN_TYPE = "RSA2";
String FORMAT = "json";
String URL = "https://openapi.alipay.com/gateway.do";

/********************可以配置成全局变量,以后就省的再去写一遍了********************************************/

这几个参数配置好了之后

/**
     * 支付接口
     * @param body 订单具体描述信息,可不传
     * @param subject 商品的标题
     * @param outTradeNo 唯一订单号
     * @param timeoutExpress 该笔订单允许的最晚付款时间,取值范围:1m~15d(m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)
     * @param totalAmount 订单总金额(单位元)
     * @param notifyUrl 支付宝服务器主动通知商户服务器里指定的页面http/https路径
* @throws UnsupportedEncodingException 
     */
@RequestMapping("pay")
@ResponseBody
    public String pay(/*String body,*/String subject,String outTradeNo,String timeoutExpress,String totalAmount,String notifyUrl,
    @RequestParam(value = "userid", required = false) String userid,
    @RequestParam(value = "commodityid", required = false) String commodityid,HttpServletResponse response2) throws UnsupportedEncodingException {
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
        //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        try {
        outTradeNo = usertoredbagService.selectnownow()+userid;
        totalAmount = alipayService.selectordermoney(commodityid);
subject = alipayService.selectsbuject(commodityid);
        timeoutExpress = "15m";
        notifyUrl="这个里面填写的是回调地址(一定要能访问到的回调地址)";
        } catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
       // model.setBody(body);
        model.setSubject(subject);
        model.setOutTradeNo(outTradeNo);
        model.setTimeoutExpress(timeoutExpress);
        model.setTotalAmount(totalAmount);
        model.setProductCode("QUICK_MSECURITY_PAY");
        String a = userid + "," + commodityid;
        model.setPassbackParams(URLEncoder.encode(a,"UTF-8"));
        request.setBizModel(model);
        request.setNotifyUrl(notifyUrl);
        try {
        //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
            return response.getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
return notifyUrl;

    }

然后我们需要支付宝支付的二次验证,此时需要注意几点,Android是我封装的一个类,其中无非就是返回给安卓的一些属性,可以换成自己需要的,我代码中的userid是从支付带过去的,具体写法,参考加粗红色字体

    /**
     * 支付回调接口
     * @param paramsMap 将异步通知中收到的待验证所有参数都存放到map中
     * @throws AlipayApiException
     * @throws UnsupportedEncodingException 
     */
@RequestMapping("payNotify")
@ResponseBody
    public String payNotify(/*Map paramsMap,*/HttpServletRequest request,HttpServletResponse response,Android ad) throws AlipayApiException, UnsupportedEncodingException {
Map params = new HashMap();
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);
}
        boolean signVerified = AlipaySignature.rsaCheckV1(params,ALIPAY_PUBLIC_KEY,CHARSET,"RSA2"); //调用SDK验证签名
System.out.println(signVerified);
        if(signVerified){

            // TODO 验签成功后
            //按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure

//注意这句话  ↑ ↑ ↑ 这句话说的是,要返回fail 或者是success这样才能知道是否已经结束,不然会一次次请求的
            String tradeStatus = params.get("trade_status");
            // 交易创建
            if (StringUtils.equals(tradeStatus, "WAIT_BUYER_PAY")) {
           
            }
            // 交易成功
            if (StringUtils.equals(tradeStatus, "TRADE_SUCCESS")) {
            String passback_params = params.get("passback_params");
            passback_params = URLDecoder.decode(passback_params);
            String[] ar = passback_params.split(",");
            String userid = ar[0];
            String commodityid = ar[1];

            System.out.println(commodityid);
            System.err.println(userid);
              if(commodityid.equals("100000001")){  

            /************加入自己的业务逻辑,此时的订单id(commodityid)可以改成自己的此处只是个例子,首先需要在支付宝中设定,如果有逻辑的体现,还需要再数据库中自己添加***************/
            }
            return "success";
            }
            // 未付款交易超时关闭,或支付完成后全额退款
            if (StringUtils.equals(tradeStatus, "TRADE_CLOSED")) {
            ad.setCode(0);
            ad.setMessage("交易超时");
            return "fail";
            }
            // 交易结束,不可退款
            if (StringUtils.equals(tradeStatus, "TRADE_FINISHED")) {
            ad.setCode(1);
            ad.setMessage("交易结束");
            return "fail";
            }
        }else{
            // TODO 验签失败则记录异常日志,并在response中返回failure.
        System.out.println("验签失败");
        //System.out.println("成功"+requestParams.get(req).toString());
        ad.setCode(0);
        ad.setMessage("验签失败");
        return "failure";
        }
return "完成";
    }


至此,支付宝的app端支付就可以使用了

下面我们来记录一下提现接口 里面的Withdraw也是封装的一个类,为了json嘛,写了一个,也就是返回给前端的各种数据,可以自行更改

@RequestMapping("withdraw")
@ResponseBody
public Withdraw withdraw(@RequestParam(value = "userid", required = false) String userid,String orderNo,String payeeAccount,String amount,String payerShowName,String payeeRealName,String remark,
@RequestParam(value = "alipayid", required = false) String alipayid,Withdraw ww) throws AlipayApiException {
        
/* //提现次数
Integer wnum=alipayService.selectnum(userid);
if(wnum==1){
ww.setCode(0);
ww.setMessage("您今天已经提现过了");
ww.setMoney("0");
ww.setOrderNo("0");
}else if (wnum==0){  */ //此处限制了提现次数
        AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);


        AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest();
        Listlist = userService.selectuseralipayid(userid);
        if(list.get(0).getAlipayid()==null){
        ww.setCode(0);
        ww.setMessage("请先绑定支付宝账号");
        ww.setMoney("0");
        ww.setOrderNo("0");
        }else if(list.get(0).getAlipayid()!=null){
        alipayid=userService.selectalipayid(userid);
        orderNo = usertoredbagService.selectnownow()+userid;
        payeeAccount = alipayService.selectalipayid(userid);
        payerShowName="支付宝显示的付款方姓名";
       // payeeRealName=alipayService.selectalipayid(userid);
        System.out.println(orderNo);
        request.setBizContent("{" +
                "    \"out_biz_no\":\""+orderNo+"\"," + // 订单号唯一
                "    \"payee_type\":\"ALIPAY_LOGONID\"," +
                "    \"payee_account\":\""+payeeAccount+"\"," +
                "    \"amount\":\""+amount+"\"," +
                "    \"payee_account\":\""+alipayid+"\","+
                 "    \"payer_show_name\":\""+payerShowName+"\"," + // 付款方姓名
                 /*  "    \"payee_real_name\":\""+payeeRealName+"\"," + // 收款方姓名
                   "    \"remark\":\""+remark+"\"," +*/
                "  }");

    /*   Integer gold = alipayService.selectusergold(userid);//此步骤查询出来用户现有的宝石数量
       Integer num = (int) (Double.parseDouble(amount)*10);//此处查询出来用户提现的时候需要多少宝石
        if(gold         ww.setCode(0);
        ww.setMessage("您的宝石数量不足");
        ww.setMoney("0");
        ww.setOrderNo("0");
        }
        else if(gold>=num){ */ //此处是自己的业务逻辑,可以改成自己的
        AlipayFundTransToaccountTransferResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
            System.out.println("调用成功");
            alipayService.insertwithdraw(orderNo,userid,amount);
            alipayService.updateusermoney(userid,amount);
            ww.setCode(1);
            ww.setMessage("提现成功");
            ww.setMoney(amount);
            ww.setOrderNo(orderNo);
            alipayService.updategold(userid,amount);
            return ww;
        } else {
            System.out.println("调用失败");
            ww.setCode(0);
            ww.setMessage("提现失败");
            ww.setMoney("0");
            ww.setOrderNo("");
            return ww;
        }
        }
        /*}*/
/*}*/
return ww;
    }

至此,支付宝app端的提现也做完了

欢迎大家指导出不对的地方,直接私信我就好

你可能感兴趣的:(支付宝)