码迷,mamicode.com
首页 > 编程语言 > 详细

Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

时间:2018-12-11 19:42:59      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:asn   根据   停止   业务流程   请求   使用   timestamp   mic   超过   

  最近一直在接触第三方,刚接入完支付宝的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 许奥伦
	  * @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

  

	/**
	 * 
	 * 说明:个人理解: 异步通知消息, 在支付完成之后支付宝会每隔一段时间来发送一次请求,直到返回success才会停止
	 * @param request
	 * @return
	 * @author 许奥伦
	 * @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;  
			}
	
			
	}

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

  

 

Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

标签:asn   根据   停止   业务流程   请求   使用   timestamp   mic   超过   

原文地址:https://www.cnblogs.com/aolun/p/10104017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!