天天看點

簡單使用支付寶沙箱接口模拟支付(網頁&移動應用類)

  • 導入相關依賴

    <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
        <dependency>
          <groupId>com.alipay.sdk</groupId>
          <artifactId>alipay-sdk-java</artifactId>
          <version>4.13.50.ALL</version>
        </dependency>
               
  • 下載下傳對應的版本的支付樣例進行修改使用(本測試是使用手機網站支付DEMO)

簡單使用支付寶沙箱接口模拟支付(網頁&amp;移動應用類)
  • 在配置類中按要求進行相關配置

    本測試隻配置應用ID,商戶私鑰,支付寶公鑰,頁面跳轉同步通知路徑以及支付寶開發環境下的網關
    public class AlipayConfig {
    	
    //↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    
    	// 應用ID,您的APPID,收款賬号既是您的APPID對應支付寶賬号
    	public static String app_id = "";
    	
    	// 商戶私鑰,您的PKCS8格式RSA2私鑰
        public static String merchant_private_key = "";
        
    	// 支付寶公鑰,檢視位址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
        public static String alipay_public_key = "";
        
    	// 伺服器異步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常通路
    	public static String notify_url = "http://工程公網通路位址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
    
    	// 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常通路
    	public static String return_url = "http://localhost:8080/pay_war/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
    
    	// 簽名方式
    	public static String sign_type = "RSA2";
    	
    	// 字元編碼格式
    	public static String charset = "utf-8";
    	
    	// 支付寶網關
    	public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
    	
    	// 支付寶網關
    	public static String log_path = "C:\\";
    }
               
  • 将下載下傳DEMO中支付頁面以及支付後跳轉的頁面進行相關設定

簡單使用支付寶沙箱接口模拟支付(網頁&amp;移動應用類)

将兩個jsp頁面中的java代碼放到controller層進行相關配置

@RequestMapping("/pay")
    public void pay(String id, String money, HttpServletResponse response) throws AlipayApiException, IOException {
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //設定請求參數
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商戶訂單号,商戶網站訂單系統中唯一訂單号,必填
        String out_trade_no = id;
        //付款金額,必填
        String total_amount = money;
        //訂單名稱,必填
        String subject = id;
        //商品描述,可空
        String body = "";

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //若想給BizContent增加其他可選請求參數,以增加自定義逾時時間參數timeout_express來舉例說明
        //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
        //		+ "\"total_amount\":\""+ total_amount +"\","
        //		+ "\"subject\":\""+ subject +"\","
        //		+ "\"body\":\""+ body +"\","
        //		+ "\"timeout_express\":\"10m\","
        //		+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //請求參數可查閱【電腦網站支付的API文檔-alipay.trade.page.pay-請求參數】章節

        //請求
        String result = alipayClient.pageExecute(alipayRequest).getBody();

        //輸出
        //out.println(result);
        response.setContentType("text/html");
        response.getWriter().println(result);
    }

    @RequestMapping("/paysuccess")
    public String paysuccess(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
        //擷取支付寶GET過來回報資訊
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        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);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //調用SDK驗證簽名

        //——請在這裡編寫您的程式(以下代碼僅作參考)——
        if(signVerified) {
            //商戶訂單号
            String id = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //支付寶交易号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //付款金額
            String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");

            orderService.updateOrderStatue(id);
            return "redirect:/client/paysuccess.jsp";
            //out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);
        }else {
            //out.println("驗簽失敗");
            return "redirect:/client/fail.jsp";
        }
    }
otal_amount);
        }else {
            //out.println("驗簽失敗");
            return "redirect:/client/fail.jsp";
        }
    }