zoukankan      html  css  js  c++  java
  • 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;  
    			}
    	
    			
    	}
    

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

      

  • 相关阅读:
    vue 页面设置title
    git clone 下载慢 解决方法 码云
    nestjs pm2 启动 静态文件404报错
    Linux释放内存空间
    DBMS_STATS.GATHER_SCHEME_STATS学习
    TPCH测试工具
    Oracle中shrink space命令
    java 测试框架 TestNG
    数据库与linux中quota的作用
    java 测试框架
  • 原文地址:https://www.cnblogs.com/aolun/p/10104017.html
Copyright © 2011-2022 走看看