Java 支付寶支付,退款,單筆轉賬到支付寶賬戶(支付寶支付)


  最近一直在接觸第三方,剛接入完支付寶的API做一下總結,個人能力薄弱有不對的地方望指教.  做的是一個小型電商項目,所以會接入第三方的支付和登入功能, 第一次接入第三方擼了很多官方文檔.

  進入主題, 支付寶支付先要去 螞蟻金服開放平台注冊賬號:https://open.alipay.com/platform/home.htm

  然后創建應用選擇需要接入的功能,有些應用是需要簽約的簽約就好了審核蠻快的.

  

  以上應用申請,功能申請的一些操作我就不多做解釋了網上很多例子, 

   Java支付寶支付

  這里有APP支付和手機網站支付, APP支付是針對Android和IOS的案例,  那么我做的是手機網站支付針對Java后台的案例.

  這里直達官方文檔:https://docs.open.alipay.com/203/105285/

   我直接貼我的代碼:

 /**
	  * 
	  * 說明:支付寶支付  (我只填了部分參數,如果有更多參數需求的 可以直接:https://docs.open.alipay.com/203/107090/ )
	  * @param orderNumber  商戶網站唯一訂單號
	  * @param orderMoney  訂單金額
	  * @param orderSubject  商品的標題,關鍵字 
	  * @param notifyUrl  異步回調地址(后台) 獲取訂單信息
	  * @param returnUrl  同步回調地址(APP) 處理業務及渲染頁面  
	  * @author ArLen
	  * @time:2018年12月11日 下午2:14:57
	  */
	@Override
	public void payment(String orderNumber,
			String orderMoney,
			String orderSubject,
			String notifyUrl,
			String returnUrl) {

        //填寫自己創建的app的對應參數
	private static AlipayClient alipayClient = new DefaultAlipayClient("支付寶網關", "appid", "私鑰", "json", "utf-8", "公鑰","RSA2");


		AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
		 // 封裝請求支付信息
	    AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
	    model.setOutTradeNo(orderNumber);
	    model.setTotalAmount(orderMoney);
	    model.setSubject(orderSubject);
	    model.setProductCode("QUICK_WAP_WAY");
	    alipayRequest.setBizModel(model);
	    //異步回調地址(后台)  
		alipayRequest.setNotifyUrl(notifyUrl);
	    // 同步回調地址(APP)
	    alipayRequest.setReturnUrl(returnUrl);
	   
		try {
                        //調用SDK生成表單
			String form = alipayClient.pageExecute(alipayRequest).getBody();
             
                    //打印,  可以直接response到頁面上
				System.out.println(form);
			} catch (AlipayApiException e) {
			e.printStackTrace();
			}
	
	}                            

    支付成功后支付寶會自動請求你寫的  notifyUrl (異步通知, 接收支付寶異步通知,從而獲取此訂單的狀態) 和 returnUrl  (支付完成后,支付寶會發送同步請求進行數據渲染,  這里我是用ModelAndView 渲染的數據)

   notifyUrl異步通知代碼    

  異步響應數據官方文檔: https://docs.open.alipay.com/203/105286/

         公共響應參數 : https://docs.open.alipay.com/api_1/alipay.trade.wap.pay

  

	/**
	 * 
	 * 說明:對於手機網站支付產生的交易,支付寶會根據原始支付API中傳入的異步通知地址notify_url,通過POST請求的形式將支付結果作為參數通知到商戶系統。
	 * @param request
	 * @return
	 * @author Arlen
	 * @time:2018年12月3日 下午4:51:35
	 */
    @RequestMapping("notifyUrl")  
    @ResponseBody  
    public String notify(HttpServletRequest request){
    	int im=0;
    	im++;
       //測試請求次數
    	System.out.println("次數:"+im);
        //獲取支付寶POST過來反饋信息  
        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] + ",";  
            }  
            //亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化  
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");  
            params.put(name, valueStr);  
        }  
          
        //獲取支付寶的通知返回參數,可參考技術文檔中頁面跳轉同步通知參數列表(以下僅供參考)//  
        //商戶訂單號  
        String out_trade_no = request.getParameter("out_trade_no");  
      
        //支付寶交易號  
        String trade_no = request.getParameter("trade_no");  
      
        //交易狀態  
        String trade_status = request.getParameter("trade_status");  
        System.out.println(trade_status);
      
		try {
			  boolean  verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2");

	        if(verify_result){
	        	//驗證成功  
	            //請在這里加上商戶的業務邏輯程序代碼  
	        	System.out.println("returnUrl_params:驗證成功");
	            //——請根據您的業務邏輯來編寫程序(以下代碼僅作參考)——  
	            boolean flg = false;  
	            if(trade_status.equals("TRADE_FINISHED")){  
	            	System.out.println("returnUrl_params:交易結束");
	            	//交易結束,不可退款
	                      
	                //注意:  
	                //退款日期超過可退款期限后(如三個月可退款),支付寶系統發送該交易狀態通知  
	            } else if (trade_status.equals("TRADE_SUCCESS")){  
	                //交易支付成功
	                      
	                //注意:  
	                //付款完成后,支付寶系統發送該交易狀態通知  
	                  
	                //根據訂單號將訂單狀態和支付寶記錄表中狀態都改為已支付  
	            	  System.out.println("returnUrl_params:交易支付成功");
	            	  flg = true; 
	            }  
	      
	            //——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——  
	                  
	            if(flg){  
	                return "success";  
	            }else{  
	                return "fail";  
	            }  
	      
	         
	        }else{//驗證失敗  
	            //out.print("fail");  
	            return "fail";  
	        } 
		} catch (AlipayApiException e) {
			e.printStackTrace();
			return "500";
		}
       
    }  

   returnUrl 同步通知代碼   

   我在這邊處理了業務邏輯,還在測試階段, 我覺得有些欠缺.

@RequestMapping("/returnUrl")
	public ModelAndView result( HttpServletRequest request) {
		System.out.println("進來");
            //用ModelAndView 進行數據渲染
		 ModelAndView mv = new ModelAndView("alipay/return_url"); 
		//獲取支付寶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] + ",";
			}
			
			//亂碼解決,這段代碼在出現亂碼時使用。如果mysign和sign不相等也可以使用這段代碼轉化
			//	valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
				params.put(name, valueStr);
		}
			//交易訂單編號
			String out_trade_no = request.getParameter("out_trade_no");
			//交易金額
			String total_amount = request.getParameter("total_amount");
			//支付寶交易賬號
			//String trade_no = request.getParameter("trade_no");
			//訂單創建時間
			String timestamp = request.getParameter("timestamp");
			
			mv.addObject("out_trade_no", out_trade_no);  
			mv.addObject("total_amount", total_amount);  
			mv.addObject("timestamp", timestamp);

			//打印所有響應數據
			System.out.println("returnUrl_params:"+params);
			try {
				  boolean  verify_result = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "utf-8", "RSA2");

		        if(verify_result){
		        	//驗證成功  這里寫的是假代碼
		        	//系統處理根據支付寶回調更改訂單狀態或者其他關聯表的數據    (走業務流程, 根據訂單編號獲取訂單數據
		        	//Order order =orderService.queryOrderByNumber(out_trade_no);
		        	
		    /*        if(order !=null){  
		         //order不為null
		     			
		            	mv.addObject("verify_result", verify_result);
		            	mv.addObject("msg", "商戶訂單號不存在");
		            	
		            	
		            } */
		            
		       	 return mv;
		        }else{
		        	//驗證失敗   跳失敗頁面
		        	System.out.println("驗證失敗");  
		            return null;  
		        } 
			} catch (AlipayApiException e) {
				e.printStackTrace();
				//出現異常   跳失敗頁面
				  return null;  
			}
	
			
	}

    今天就先寫到 支付寶支付,明天再寫支付寶退款及其他操作.

  

 


免責聲明!

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



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