当前位置: 移动技术网 > IT编程>开发语言>Java > Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

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

2018年12月12日  | 移动技术网IT编程  | 我要评论

  最近一直在接触第三方,刚接入完支付宝的api做一下总结,个人能力薄弱有不对的地方望指教.  做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档.

  进入主题, 支付宝支付先要去 蚂蚁金服开放平台注册账号:

  然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.

  

  以上应用申请,功能申请的一些操作我就不多做解释了网上很多例子, 

   java支付宝支付

  这里有app支付和手机网站支付, app支付是针对android和ios的案例,  那么我做的是手机网站支付针对java后台的案例.

  这里直达官方文档:

   我直接贴我的代码:

 /**
	  * 
	  * 说明:支付宝支付  (我只填了部分参数,如果有更多参数需求的 可以直接: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异步通知代码    

  异步响应数据官方文档: 

         公共响应参数 :

  

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

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

  

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网