欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-21 09:52:24
最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档. 进入主题, 支付宝支付先要去 蚂蚁金服开放平台注册账号:https://open.alipay.com/platf ......

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

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

  然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

  

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

   java支付宝支付

  这里有app支付和手机网站支付, app支付是针对android和ios的案例,  那么我做的是手机网站支付针对java后台的案例.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;  
			}
	
			
	}

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