Java手把手教你学会支付宝APP支付

1,阿里的APP支付相对来微信来说很简单,第一步我们需要获取以下几个参数

    // 商户appid-----h5支付的ID
    public static String        APPID             = "APPID";
    // 私钥 pkcs8格式的
    public static String        RSA_PRIVATE_KEY   =""
    // 服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String        notify_url        = "https://此处域名/faint-service/f/ali/alipayRechargeGoldNotify";
    // 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问       商户可以自定义同步跳转地址
    public static String        return_url        = "https://此处域名/faint-service/static/h5/app/successh5.html";
    // 请求网关地址
    public static String        URL               = "https://openapi.alipay.com/gateway.do";
    // 编码
    public static String        CHARSET           = "UTF-8";
    // 返回格式
    public static String        FORMAT            = "json";
    // 支付宝公钥
    public static String        ALIPAY_PUBLIC_KEY = ""
    // RSA2
    public static String        SIGNTYPE          = "RSA2";

APPID:怎样申请支付宝支付的整个流程我就不一一细说了,APPID在你申请APP支付的时候就可以得到此数据

RSA_PRIVATE_KEY 和ALIPAY_PUBLIC_KEY   :公钥私钥也是你申请APP支付会设置的数据

notify_url        :支付宝支付成功回调到服务器的地址,获得成功数据

return_url        如果是H5支付的话,需要填写,APP支付不需要,支付成功返回的页面.

URL              :此URL是把数据打包到支付宝  唤醒支付宝支付的地址

CHARSET            FORMAT            SIGNTYPE          :这三个是固定死的,填就完事

2,开始写代码了,前端请求支付,后端处理数据,打包到支付宝服务器

 @ResponseBody
    @RequestMapping(value = "openForAPP", method = RequestMethod.POST)
    public Result openForAPP(MdAppertain mdAppertain) {
        logger.info("AliController.openForAPP=======start");
        Result result = new Result();
        try {
            //实例化客户端
            AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APPIDFORAPP, AliPayConfig.RSA_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();
            String reaMoney = Constant.MDAPPERTAIN_PRICE.toString();
            model.setBody("付费认证");//商品名称
            model.setSubject("付费认证");//商品类型
            model.setOutTradeNo(str); //订单号
            model.setTimeoutExpress("30m");
            model.setTotalAmount(reaMoney); //真实金额
            model.setProductCode("QUICK_MSECURITY_PAY"); //表示APP支付
            request.setBizModel(model);
            request.setNotifyUrl(AliPayConfig.notify_appestationAttUrl);
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            Map payMap = new HashMap();
            payMap.put("orderStr", response.getBody());
            result.setMap(payMap);
            result.setCode(Constant.RETRUN_SUCCESS);
            result.setMsg(Constant.RETRUN_SUCCESS_MSG);
            //System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
        } catch (AlipayApiException e) {
            logger.error("CreatPayOrderForAPP", e);
            result.setCode(Constant.RETRUN_FAIL);
            result.setMsg(Constant.RETRUN_FAIL_MSG);
        }
        return result;
    }

3支付宝支付成功后返回服务器跟客户端数据

@ResponseBody
    @RequestMapping(value = "openForAPPNotify", method = RequestMethod.POST)
    public String openForAPPNotify(HttpServletRequest request, HttpServletResponse response) {
        logger.info("AliController.openForAPPNotify=======start");
        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);
        }
        //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
        //boolean AlipaySignature.rsaCheckV1(Map params, String publicKey, String charset, String sign_type)
        try {
            boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, "RSA2");
            if (flag) {
                if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
                    String orderId = params.get("out_trade_no"); //商家订单号
                    String moneyNumber = params.get("total_amount"); //实际支付金额
                    BigDecimal amountPay = new BigDecimal(moneyNumber);//将分转化为元的对象
                    Double rmb = amountPay.doubleValue();
                    //////此处处理自己的业务逻辑
                }
                response.getWriter().print("success");
                logger.info("flag签名验证成功");
            } else {
                // 验证失败
                response.getWriter().print("failure");
            }
        } catch (Exception e) {
            logger.error("openForAPPNotify", e);
            logger.info("flag签名获取订单信息异常");
        }
        logger.info("AliController.getNotify=======end");
        return null;
    }

支付宝支付到此成功了,有什么问题可以给我留言,

你可能感兴趣的:(Java手把手教你学会支付宝APP支付)