App支付寶支付


1.調起支付流程:

第一步:創建應用並獲取APPID

去螞蟻金服開放平台(open.alipay.com),在開發者中心中創建應用,會生成應用唯一標識(APPID),申請開通支付功能。。

第二步:配置密鑰

  1. 支付寶公鑰:支付寶的RSA公鑰,商戶使用該公鑰驗證該結果是否是支付寶返回的。

  

第三步:集成和開發

 

1:導入jar包

   

 <!-- 阿里雲支付寶支付的jar -->
    <dependency>
      <groupId>com.alipay.sdk</groupId>
      <artifactId>alipay-sdk-java</artifactId>
      <version>3.3.87.ALL</version>
    </dependency>

 

 

2:具體demo

a:阿里雲基本參數類:

public interface AliPayConfig {

        /** 支付寶支付的appid */
        String APP_ID = "";

        /** 應用私鑰 */
        String PRIVATE_KEY = "";

        //應用公鑰
        String APP_PUBLIC_KEY = "";

        //支付寶公鑰
        String ALI_PUBLIC_KEY ="";

        //字符集
        String CHARSET = "utf-8";

        //數據格式
        String FORMAT = "json";

        //加密方式
        String SIGN_TYPE = "RSA2";


        /**    以下參數為調用地址   */

        //接收支付寶回調地址notify_url
     //測試時候可以映射到本地地址可測試,不一定非要部署到線上
        String NOTIFY_URL = "";

        String GATEWAY_URL  = "https://openapi.alipay.com/gateway.do";



}
    

 

 

b:統一下單接口

 @ResponseBody
    @RequestMapping("/aliPayOrder")
    public JSONObject aliPayOrder(String outtradeno) {
        JSONObject returnValue = null;
        //實例化客戶端
        AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);
        //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.app.pay
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
        outtradeno = WeixinPayUtil.getOrderIdByTime();
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
        model.setBody("測試");
        model.setSubject("App支付測試");
        model.setOutTradeNo(outtradeno);
        model.setTimeoutExpress("30m");
        model.setTotalAmount("0.01");
        model.setProductCode("QUICK_MSECURITY_PAY");
        request.setBizModel(model);
        request.setNotifyUrl(AliPayConfig.NOTIFY_URL);
        try {
            //這里和普通的接口調用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            //就是orderString 可以直接給客戶端請求,無需再做處理。
            returnValue = new JSONObject();
            returnValue.put("errCode", ErrorCode.SUCCESS_RETRUN);
            returnValue.put("errMsg", "ok");
            returnValue.put("data", response.getBody());
            logger.info("【支付寶統一下單 --- 成功 】,訂單號為:{}",outtradeno);
            return returnValue;
        } catch (AlipayApiException e) {
            logger.info("【支付寶統一下單 --- 失敗 】,訂單號為:{},原因為:{}",outtradeno,e.getErrMsg().toString());
            returnValue = ErrorCodeUtil.ERROR_FAILED("下單失敗");
            return returnValue;
        }
    }

 

 

c:支付回調接口

 @RequestMapping("aliPay_notify")
    public void aliPay_notify(HttpServletRequest request, HttpServletResponse response) {
        //獲取支付寶POST過來反饋信息
        Map<String, String> 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] + ",";
            }
            params.put(name, valueStr);
        }
        try {
            //驗證簽名
            boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);

            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 = params.get("passback_params");

                    response.getWriter().write("success");

                }
            }else {
                logger.info("【支付寶支付--異步回調】回調失敗,簽名驗證失敗");
            }

        } catch (AlipayApiException e) {
            logger.error("【支付寶支付--異步回調】回調失敗,阿里雲接口調用錯誤,原因為:{}",e.getMessage());
        } catch (Exception e) {
            logger.error("【支付寶支付--異步回調】回調失敗,原因為:{}",e.getMessage());
        }
    }

 d:退款接口

   @RequestMapping("aliPay_refund")
    @ResponseBody
    public JSONObject aliPay_refund(final String outTradeNo,final String transactionId){
        JSONObject returnValue = null ;
        try {
            //實例化客戶端
            AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);

            //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.refund
            AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();

            //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
            AlipayTradeRefundModel model = new AlipayTradeRefundModel();

            //優先使用支付寶的訂單id
            if(transactionId == null || transactionId.length() == 0){
                model.setOutTradeNo(outTradeNo);
            }else {
                model.setTradeNo(transactionId);
            }
            //測試金額1分錢
            String price = "0.01";
            //測試退款理由
            model.setRefundReason("測試退款");

            //退款金額
            model.setRefundAmount(price);

            request.setBizModel(model);

            AlipayTradeRefundResponse response = alipayClient.execute(request);

            if(response.isSuccess()){
                returnValue = ErrorCodeUtil.ERROR_FAILED("退款成功");
                return returnValue ;

            } else {
                returnValue = ErrorCodeUtil.ERROR_FAILED(response.getSubMsg());
                return returnValue ;
            }
        }catch (AlipayApiException e) {
            logger.error("【支付寶支付 -- 退款失敗】原因為:{}",e.getMessage());
            returnValue = ErrorCodeUtil.ERROR_FAILED("退款失敗");
            return returnValue ;
        }
    }

 

e:關閉訂單

 @ResponseBody
    @RequestMapping("aliPay_close")
    public JSONObject aliPay_close(final String outTradeNo,final String transactionId){
        JSONObject returnValue = null ;
        try {
            //實例化客戶端
            AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);

            //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.close
            AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();

            //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
            AlipayTradeCloseModel model = new AlipayTradeCloseModel();

            //優先使用支付寶的訂單id
            if(transactionId == null || transactionId.length() == 0){
                model.setOutTradeNo(outTradeNo);
            }else {
                model.setTradeNo(transactionId);
            }

            request.setBizModel(model);

            AlipayTradeCloseResponse response = alipayClient.execute(request);

            if(response.isSuccess()){
                returnValue = ErrorCodeUtil.ERROR_FAILED("訂單關閉成功");
                return returnValue ;

            } else {
                returnValue = ErrorCodeUtil.ERROR_FAILED(response.getSubMsg());
                return returnValue ;
            }
        }catch (AlipayApiException e) {
            logger.error("【支付寶支付 -- 關閉訂單】關閉訂單失敗,原因為:{}",e.getMessage());
            returnValue = ErrorCodeUtil.ERROR_FAILED("訂單關閉失敗");
            return returnValue ;
        }

    }

f:查詢訂單狀態

    @ResponseBody
    @RequestMapping("aliPay_query")
    public JSONObject aliPay_query(final String outTradeNo,final String transactionId){
        JSONObject returnValue = null ;
        try {
            //實例化客戶端
            AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.GATEWAY_URL, AliPayConfig.APP_ID, AliPayConfig.PRIVATE_KEY, AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALI_PUBLIC_KEY, AliPayConfig.SIGN_TYPE);

            //實例化具體API對應的request類,類名稱和接口名稱對應,當前調用接口名稱:alipay.trade.query
            AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();

            //SDK已經封裝掉了公共參數,這里只需要傳入業務參數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
            AlipayTradeQueryModel model = new AlipayTradeQueryModel();

            //優先使用支付寶的訂單id
            if(transactionId == null || transactionId.length() == 0){
                model.setOutTradeNo(outTradeNo);
            }else {
                model.setTradeNo(transactionId);
            }

            request.setBizModel(model);

            AlipayTradeQueryResponse response = alipayClient.execute(request);

            if(response.isSuccess()){
                if("WAIT_BUYER_PAY".equals(response.getTradeStatus())){
                    returnValue = ErrorCodeUtil.ERROR_FAILED("交易創建,等待買家付款");
                    return returnValue ;
                }else if("TRADE_CLOSED".equals(response.getTradeStatus())){
                    returnValue = ErrorCodeUtil.ERROR_FAILED("未付款交易超時關閉,或支付完成后全額退款");
                    return returnValue ;
                }else if("TRADE_SUCCESS".equals(response.getTradeStatus())){
                    returnValue = ErrorCodeUtil.ERROR_FAILED("交易支付成功");
                    return returnValue ;
                }else if("TRADE_FINISHED".equals(response.getTradeStatus())){
                    returnValue = ErrorCodeUtil.ERROR_FAILED("交易結束,不可退款");
                    return returnValue ;
                }else {
                    returnValue = ErrorCodeUtil.ERROR_FAILED("未知狀態");
                    return returnValue ;
                }
            } else {
                returnValue = ErrorCodeUtil.ERROR_FAILED(response.getSubMsg());
                return returnValue ;
            }
        }catch (AlipayApiException e) {
            logger.error("【支付寶支付 -- 查詢訂單】查詢訂單失敗,原因為:{}",e.getMessage());
            returnValue = ErrorCodeUtil.ERROR_FAILED("訂單查詢失敗");
            return returnValue ;
        }

    }

 3:最后可去 螞蟻金服商家平台  查看金額!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM