1. 程式人生 > >阿里支付寶支付開發詳細

阿里支付寶支付開發詳細

無論在web開發、移動開發中,使用支付寶支付是必不可少的技能,本文將收集本人在開發中遇到的問題,也可以加入交流群244284555 和博主進行溝通

建立支付寶應用前提必須使用企業認證的支付寶賬號,否則將無法建立應用

登入後進入開發者中心選擇網頁移動應用

選擇支付接入

建立好應用後,需開通簽約app支付或者網頁支付功能,根據開發需求選擇簽約,這裡會收取手續費,按每筆交易收取不同比例費用,提交後需等待稽核完成,這個階段使用支付功能將會報insufficient-isv-permissions錯誤。遇到此錯誤等待稽核通過即可

上傳支付寶祕鑰,下載地址:https://docs.open.alipay.com/291/105971

下載好後開啟這個檔案:

生成成功開啟rsa_private_key_pkcs8.pem這個檔案,進行應用公鑰的上傳,會自動生成支付寶公鑰。

此時設定加密方式:如果沒有設定加密方式,你將會遇到app支付成功後,介面並不會呼叫回撥函式,這個地方一定要注意

接下來進入編碼階段:

/**
 * 支付寶支付配置
 */
public class AlipayConfig {

   // 商戶appid
   public static String APP_ID = "";
   // 支付寶公鑰
   public static String ALIPAY_PUBLIC_KEY = "";
   //應用私鑰
   public static String APP_PRIVATE_KEY = "";

   /**
    * 5.伺服器非同步通知頁面路徑 需http://或者https://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
    */
   public static String notify_url = "http://www.xxx.com/alipay/notify_url.do";

   /**
    * 6.請求閘道器地址
    */
   public static String URL = "https://openapi.alipay.com/gateway.do";

   /**
    * 7.編碼
    */
   public static String CHARSET = "UTF-8";

   /**
    *  8.返回格式
    */
   public static String FORMAT = "json";

   /**
    * 9.加密型別
    */
   public static String SIGNTYPE = "RSA2";

   /**
    * 10.訂單有效日期
    */
   public static String TIMEOUT_EXPRESS = "7d";

   public static String PRODUCT_CODE = "QUICK_MSECURITY_PAY";

   /**
    * 支付回撥介面&充值餘額支付回撥介面
    * 支付回撥地址只有一個
    */
   public static String NOTIFY_URL = "";

   /**
    *  獲取訂單號的 key
    */
   public static String OUT_TRADE_NO = "out_trade_no";

   /**
    * 獲取交易狀態碼的 key
    */
   public static String TRADE_STATUS = "trade_status";


   /**
    * 字元常量 “TRADE_SUCCESS”
    */
   public static String TRADE_SUCCESS = "TRADE_SUCCESS";

   /**
    *  字元常量 “TRADE_FINISHED”
    */
   public static String TRADE_FINISHED = "TRADE_FINISHED";


   /**
    * 字元常量 “app_id”
    */
   public static String APP_ID_NOTIFY = "app_id";


   /**
    *  字元常量 “total_amount”
    */
   public static String TOTAL_AMOUNT_NOTIFY = "total_amount";


   /**
    * 字元常量 “total_amount”
    */
   public static String SELLER_EMAIL_NOTIFY = "seller_email";

   /**
    * 字元常量 “元”
    */
   public static String YUAN = "元";



}

 @RequestMapping(value="/alipay", method={RequestMethod.POST})
    public Result alipay(@Valid OrderAlipayReq orderAlipayReq, HttpSession session,HttpServletRequest httpRequest){
        Result result = new Result();

        if(orderAlipayReq.getOrderId()==null){
            logger.info("引數訂單號OrderId為空");
            result.setCode(MessageContants.FAIL);
            result.setMessage("引數訂單號OrderId為空");
            return result;
        }
        if(orderAlipayReq.getPrice()==null){
            logger.info("引數訂單號Price為空");
            result.setCode(MessageContants.FAIL);
            result.setMessage("引數訂單號Price為空");
            return result;
        }
       
        MwOrder mwOrder = mwOrderRepository.findOne(orderAlipayReq.getOrderId());
        if(mwOrder==null){
            logger.info("根據OrderId查詢訂單資訊為空,此訂單不存在");
            result.setMessage("此訂單不存在"+orderAlipayReq.getOrderId());
            result.setCode(MessageContants.FAIL);
            return result;
        }
       

        //訂單ID   商品名稱   價格
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APP_ID,
                AlipayConfig.APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
                AlipayConfig.SIGNTYPE);
        /**
         * 建立web請求訊息
         */
    //    AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
        /**
         * 建立app請求訊息
         */
        AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
        /**
         * 封裝業務引數
         * SDK已經封裝掉了公共引數,這裡只需要傳入業務引數。以下方法為sdk的model入參方式(model和biz_content同時存在的情況下取biz_content)。
         */
        AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

        String subject = orderAlipayReq.getMediaName();

        String orderNo = mwOrder.getOrderNo();
        String body = mwOrder.getOrderName();

        /**
         * 查詢訂單資訊
         */
        // 支付訂單詳情
        model.setBody(body);
        // 支付訂單標題
        model.setSubject(subject);
        // 支付訂單編號
        model.setOutTradeNo(orderNo);
        // 訂單超時時間
        model.setTimeoutExpress(AlipayConfig.TIMEOUT_EXPRESS);
        // 支付訂單金額
        model.setTotalAmount("0.01");
       // model.setTotalAmount(createOrder.getTotalAmount());
        // 訂單程式碼
        model.setProductCode(AlipayConfig.PRODUCT_CODE);

        request.setBizModel(model);

        logger.info("發起支付寶app成功,開始回撥");

        //支付成功了,把訂單編號快取
   //     session.setAttribute("orderId",mwOrder.getOrderId());
        // 回撥地址
        request.setNotifyUrl(AlipayConfig.NOTIFY_URL);

        /**
         * 支付寶響應體
         */
        AlipayTradeAppPayResponse response = null;
        //這裡和普通的介面呼叫不同,使用的是sdkExecute
        try {
            response = alipayClient.sdkExecute(request);
            //處理支付後訂單資訊,上線後需放在回撥介面中
/*
            mwOrder.setOrderId(mwOrder.getOrderId());
            //支付成功 "1",更新時間
            //未支付狀態
            mwOrder.setStatus("0");
            mwOrder.setMediaOrderStatus("5");
            mwOrder.setUpdateTime(DateUtils.getNowDate());
            mwOrderRepository.save(mwOrder);
*/

            //支付後向賬單表裡新增記錄
/*            MwBill mwBill = new MwBill();
            mwBill.setBillDescribe("支付寶消費"+orderAlipayReq.getPrice());
            mwBill.setConsumeAmount("0.01");
            mwBill.setConsumeTime(DateUtils.getNowDate());
            mwBill.setUserId(mwOrder.getUserId());
            mwBillRepository.save(mwBill);*/

        } catch (AlipayApiException e) {
            //如果回撥失敗了
            logger.info("支付失敗");
            result.setCode(MessageContants.FAIL);
            result.setMessage("支付失敗");
            logger.info(response.getBody());
            result.setData(response.getBody());
            e.printStackTrace();
            return  result;
        }
        logger.info("支付寶響應內容:{}",response.getBody());
        result.setData(response.getBody());
        result.setMessage("支付成功");
        result.setCode(MessageContants.SUCCESS);
        return result;
    }

只要賬號資訊無誤,就能完成支付寶支付