支付寶手機網站支付的開發文檔: https://docs.open.alipay.com/203html
開發者調用接口前須要先生成RSA2密鑰,RSA2密鑰包含應用私鑰(APP_PRIVATE_KEY)、應用公鑰(APP_PUBLIC_KEY)。生成密鑰後在開放平臺管理中心進行密鑰配置,配置完成後能夠獲取支付寶公鑰(ALIPAY_PUBLIC_KEY)。此爲一一對應。前端
生成好的公鑰上傳給支付寶,並記住支付對應的公鑰。基礎環境中的應用網關及受權回調地址須要開發者本身配置,前提是能夠在外網有申請能夠訪問的。
json
自用型應用。將所須要的功能進行簽約,商戶簽約須要營業執照,身份證等多種信息。api
簽約完成後,應用申請上線。瀏覽器
第一步:搭建和配置開發環境app
下載服務端SDKdom
第二步:調用接口異步
手機網站支付產品包含兩類API:jsp
1頁面跳轉類:須要從前端頁面以Form表單的形式發起請求,瀏覽器會自動跳轉至支付寶的相關頁面(通常是收銀臺或簽約頁面),用戶在該頁面完成相關業務操做後再回跳到商戶指定頁面。測試
2系統調用類:直接從服務端發起HTTP請求,支付寶會同步返回請求結果。
特別注意:
1.因爲前臺回跳的不可靠性,前臺回跳只能做爲商戶支付結果頁的入口,最終支付結果必須以異步通知或查詢接口返回爲準,不能依賴前臺回跳。
2.商戶系統接收到異步通知之後,必須經過驗籤(驗證通知中的sign參數)來確保支付通知是由支付寶發送的。詳細驗籤規則參考異步通知驗籤。
3.接受到異步通知並驗籤經過後,必定要檢查通知內容,包括通知中的app_id, out_trade_no, total_amount是否與請求中的一致,並根據trade_status進行後續業務處理。
1:手機網站支付alipay.trade.wap.pay:
對於頁面跳轉類API,SDK不會也沒法像系統調用類API同樣自動請求支付寶並得到結果,而是在接受request請求對象後,爲開發者生成前臺頁面請求須要的完整form表單的html(包含自動提交腳本),商戶直接將這個表單的String輸出到http response中便可。
1 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //得到初始化的AlipayClient 2 AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();//建立API對應的request 3 alipayRequest.setReturnUrl("http://domain.com/CallBack/return_url.jsp"); 4 alipayRequest.setNotifyUrl("http://domain.com/CallBack/notify_url.jsp");//在公共參數中設置回跳和通知地址 5 alipayRequest.setBizContent("{" + 6 " \"out_trade_no\":\"20150320010101002\"," + 7 " \"total_amount\":\"88.88\"," + 8 " \"subject\":\"Iphone6 16G\"," + 9 " \"product_code\":\"QUICK_WAP_PAY\"" + 10 " }");//填充業務參數 11 String form=""; 12 try { 13 form = alipayClient.pageExecute(alipayRequest).getBody(); //調用SDK生成表單 14 } catch (AlipayApiException e) { 15 e.printStackTrace(); 16 } 17 httpResponse.setContentType("text/html;charset=" + CHARSET); 18 httpResponse.getWriter().write(form);//直接將完整的表單html輸出到頁面 19 httpResponse.getWriter().flush(); 20 httpResponse.getWriter().close();
2:支付異步通知驗籤:
1 Map<String, String> paramsMap = ... //將異步通知中收到的全部參數都存放到map中 2 boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //調用SDK驗證簽名 3 if(signVerified){ 4 // TODO 驗籤成功後,按照支付結果異步通知中的描述,對支付結果中的業務內容進行二次校驗,校驗成功後在response中返回success並繼續商戶自身業務處理,校驗失敗返回failure 5 }else{ 6 // TODO 驗籤失敗則記錄異常日誌,並在response中返回failure. 7 }
3:交易退款接口alipay.trade.refund
1 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //得到初始化的AlipayClient 2 AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();//建立API對應的request類 3 request.setBizContent("{" + 4 " \"out_trade_no\":\"20150320010101001\"," + 5 " \"trade_no\":\"2014112611001004680073956707\"," + 6 " \"out_request_no\":\"1000001\"," + 7 " \"refund_amount\":\"2014112611001004680073956707\"" + 8 " }");//設置業務參數 9 AlipayTradeRefundResponse response = alipayClient.execute(request);//經過alipayClient調用API,得到對應的response類
1.在內網須要訪問外網的時候,須要使用代理路徑。在退款時候調用SDK,須要調用新的重構方法。
1 public DefaultAlipayClient(String serverUrl, String appId, String privateKey, String format, String charset, String alipayPublicKey, String signType,String proxyHost, int proxyPort) { 2 3 this(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType); 4 5 this.proxyHost = proxyHost; 6 7 this.proxyPort = proxyPort; 8 9 }
2.心得:時刻關注官方的文檔,當發現官方所提供的不支持本身須要時,需想官方提交問題,等待支付寶那邊將官網文檔完善。
3.在測試支付寶支付退款時候,選擇沙箱環境進行驗證,沙箱路徑與真實的網關路徑十分類似,寫網關的時候注意路徑是否正確。需保管好本身的沙箱帳戶。