商家 APP 如何接入新版支付寶支付,老版本商家如何升級


代碼地址如下:
http://www.demodashi.com/demo/14006.html

前言

支付寶移動支付2.0版本對比1.0版本做了較大更新,新申請的商家都需要采用最新2.0版本 SDK 才可以成功接入,老版本需要升級的需要對 APP 進行重新簽約才可以。

老版本支付寶支付:
簽名方式rsa1(sha1),支付寶公鑰是確定的,每個商家的都是一樣的。

新版本支付寶支付:
簽名方式rsa2(sha256),支付寶公鑰每個商家都是不同的。

升級程序實現

老版本java服務端代碼:

返回訂單信息供客戶端調起支付寶客戶端:

public static String getOrderInfo(String subject, String body,
            String tradeNo, String price, String notifyurl) {
        // 簽約合作者身份ID
        String orderInfo = "partner=" + "\"" + getAliPartnerId(tradeNo)
                + "\"";

        // 簽約賣家支付寶賬號
        orderInfo += "&seller_id=" + "\"" + getAliSellerId(tradeNo)
                + "\"";

        // 商戶網站唯一訂單號
        orderInfo += "&out_trade_no=" + "\"" + tradeNo + "\"";

        // 商品名稱
        orderInfo += "&subject=" + "\"" + subject + "\"";

        // 商品詳情
        orderInfo += "&body=" + "\"" + body + "\"";

        // 商品金額
        orderInfo += "&total_fee=" + "\"" + price + "\"";

        // 服務器異步通知頁面路徑
        orderInfo += "¬ify_url=" + "\"" + notifyurl + "\"";

        // 服務接口名稱, 固定值
        orderInfo += "&service=\"mobile.securitypay.pay\"";

        // 支付類型, 固定值
        orderInfo += "&payment_type=\"1\"";

        // 參數編碼, 固定值
        orderInfo += "&_input_charset=\"utf-8\"";

        // 設置未付款交易的超時時間
        // 默認30分鍾,一旦超時,該筆交易就會自動被關閉。
        // 取值范圍:1m~15d。
        // m-分鍾,h-小時,d-天,1c-當天(無論交易何時創建,都在0點關閉)。
        // 該參數數值不接受小數點,如1.5h,可轉換為90m。
        // orderInfo += "&it_b_pay=\"30m\"";

        // extern_token為經過快登授權獲取到的alipay_open_id,帶上此參數用戶將使用授權的賬戶進行支付
        // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

        // 支付寶處理完請求后,當前頁面跳轉到商戶指定頁面的路徑,可空
        // orderInfo += "&return_url=\"m.alipay.com\"";

        // 調用銀行卡支付,需配置此參數,參與簽名, 固定值 (需要簽約《無線銀行卡快捷支付》才能使用)
        // orderInfo += "&paymethod=\"expressGateway\"";

        return orderInfo;
    }

支付完成之后回調:

String trade = getPara("out_trade_no");

       System.out.println("trade:" + trade);

       // 驗證支付寶請求
       HashMap<String, String> paraMap = new HashMap<>();
       Enumeration<String> paraNames = getParaNames();

       for (Enumeration<String> e = paraNames; e.hasMoreElements();)
       {
           String thisName = e.nextElement().toString();
           System.out.println(thisName + "-------------" + getPara(thisName));
           paraMap.put(thisName, getPara(thisName));
       }
       if (!AlipayNotify.verify(paraMap))
       {
           renderText("false");
           return;
       }

       // 訂單狀態判斷
       String trade_status = getPara("trade_status");
       if (trade_status.equals("WAIT_BUYER_PAY"))
       {
           logger.info("訂單創建,等待用戶支付");
           renderText("success");
           return;
       }else if (trade_status.equals("TRADE_SUCCESS")||trade_status.equals("TRADE_FINISHED")) {
           logger.info("訂單支付成功,服務器處理");
           if (dealWithOrder(trade, role, getPara("total_fee")))
           {
               renderText("success");
               return;
           }
       }
       renderText("false");
       return;



新版本支付寶

java: 支付寶公鑰每個商家相同

public static String getNewOrderInfo(String appId,String subject, String body,String tradeNo, String price, String notifyurl) throws AlipayApiException{
	    AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",appId,getAliPrivateKey(tradeNo),"json","utf-8",Constants.PAY_ZHIFUBAO_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();
        model.setBody(body);
        model.setSubject(subject);
        model.setOutTradeNo(tradeNo);
        model.setTimeoutExpress("30m");//一般用不到這個
        model.setTotalAmount(price);//這個嘛就是錢嘍
        model.setProductCode("QUICK_MSECURITY_PAY");//商家和支付寶簽約的產品碼,為固定值
        request.setBizModel(model);
        request.setNotifyUrl(notifyurl);//外網異步回調地址,是需要外網能夠訪問到的
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        return response.getBody();//這里直接把訂單信息給app端就好了,讓他直接拿着去調起支付寶
	}

支付寶回調:支付寶公鑰每個商家不同

    String trade = getPara("out_trade_no");
    // 驗證支付寶請求
    HashMap<String, String> params = new HashMap<>();
    Map<String,String []> requestParams = getParaMap();
    for (Iterator<String> 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);
     }
        if (!AlipaySignature.rsaCheckV1(params, aliPublicKey, "utf-8", "RSA2")) {
            renderText("false");
            return;
        }
        // 訂單狀態判斷
        String trade_status = getPara("trade_status");
        if (trade_status.equals("TRADE_SUCCESS") || trade_status.equals("TRADE_FINISHED")) {
            logger.info("訂單支付成功,服務器處理");
            if (dealWithOrder(trade, role, getPara("total_amount"))) {
                renderText("success");
                return;
            }
        }
        renderText("false");
        return;

項目結構圖:

項目運行圖:

其他

新老版本對比詳細鏈接:https://docs.open.alipay.com/203/106514商家 APP 如何接入新版支付寶支付,老版本商家如何升級

代碼地址如下:
http://www.demodashi.com/demo/14006.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

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



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