手把手教你完成App支付JAVA后台-支付宝支付JAVA

  • Post author:
  • Post category:java


转自:http://blog.csdn.net/u012552275/article/details/78320051

后台基本需要到以下几个参数,我都将他们写在了properties文件中:



支付宝参数

AliPay.payURL =

https://openapi.alipay.com/gateway.do



商户公钥


AliPay.publicKey = xxx


AliPay.appId = xxx APPid


AliPay.timeoutExpress = xxx 超时时间


AliPay.notifyUrl =

http://xxx

异步通知



获取支付宝预付单

    /**
     * 拉取支付宝预付单
     */
    @ValidatePermission(value = PermissionValidateType.Validate)
    @Override
    public BaseResult<Orders> getAliPay(BaseRequest<Orders> baseRequest)
    {
        LogUtil.debugLog(logger, baseRequest);
        BaseResult<Orders> baseResult = new BaseResult<>();
        Orders orders = baseRequest.getData(); // 订单的实体
        try
        {
            AlipayClient alipayClient = PayCommonUtil.getAliClient();
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            model.setOutTradeNo(orders.getId() + "");// 订单号。
            model.setTimeoutExpress(PropertyUtil.getInstance().getProperty("AliPay.timeoutExpress"));// 设置未付款支付宝交易的超时时间,一旦超时,该笔交易就会自动被关闭。当用户进入支付宝收银台页面(不包括登录页面),会触发即刻创建支付宝交易,此时开始计时。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。
            // 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
            model.setTotalAmount("0.01");// 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]这里调试每次支付1分钱,在项目上线前应将此处改为订单的总金额
            model.setProductCode("QUICK_MSECURITY_PAY");// 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
            request.setBizModel(model);
            request.setNotifyUrl(PropertyUtil.getInstance().getProperty("AliPay.notifyUrl")); // 设置后台异步通知的地址,在手机端支付成功后支付宝会通知后台,手机端的真实支付结果依赖于此地址
            // 根据不同的产品

                model.setBody(xxx);// 对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
                model.setSubject("商品的标题/交易标题/订单标题/订单关键字等");
                break;
            // 这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            // 可以直接给客户端请求,无需再做处理。
            orders.setAliPayOrderString(response.getBody());
            baseResult.setData(orders);
        } catch (Exception e)
        {
            e.printStackTrace();
            baseResult.setState(-999);
            baseResult.setMsg("程序异常!");
            baseResult.setSuccess(false);
            logger.error(e.getMessage());
        }
        return baseResult;
    }

在上面一段代码中,我们已经将支付宝服务端生成的预付单信息返回给了客户端,至此,客户端已经可以支付。支付结果支付宝将会异步给后台通知,下面是异步通知的代码:

/**
     * 支付宝异步通知
     */
    @ValidatePermission
    @RequestMapping(value = "/notify/ali", method = RequestMethod.POST, consumes = "application/json", produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String aLiNotify(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        logger.debug("支付宝回调");
        // 获取支付宝POST过来反馈信息
        Map requestParams = request.getParameterMap();
        logger.debug("支付宝回调结果:" + requestParams.toString());
        Map<String, String> params = new HashMap<String, String>();
        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);
        }
        // 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//      boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
        try
        {
            //验证签名
            String alipay_public_key = PropertyUtil.getInstance().getProperty("AliPay.AliPay.publicKey");
            boolean flag = AlipaySignature.rsaCheckV1(params, alipay_public_key, "utf-8", "RSA2");
            if(flag){ // 签名验证成功
                if("TRADE_SUCCESS".equals(params.get("trade_status"))){
                    //付款金额
                    String amount = params.get("buyer_pay_amount");
                    //商户订单号
                    String out_trade_no = params.get("out_trade_no");
                    //支付宝交易号
                    String trade_no = params.get("trade_no");
                    //附加数据
                    String passback_params = URLDecoder.decode(params.get("passback_params"));
                    // 再做数据库修改支付状态的操作。。。
                }
            } else {
                logger.debug("签名验证失败!");
            }
        } catch (AlipayApiException  e)
        {
            e.printStackTrace();
        }
        return "success";
    }

至此,支付宝支付的核心代码已完成。

本文用到的工具类地址: