java集成支付宝(完整流程)

**

java集成支付宝(完整流程)

**

*申请支付能力
   1、准备好相关资料在支付宝官网申请你所需要的支付方式,例如app支付,或者h5支付。
   2、获取集成支付能力所需的参数:appid、支付宝公钥与私钥、(seller_id)卖家账号。
   
*开始集成(app支付)




    app支付集成
           DecimalFormat df = new DecimalFormat("######0.00"); 
		   //appid
			String  app_id=AlipayConfig.app_id;
			//商户私钥
			String  private_key=AlipayConfig.private_key_refund;
			//支付宝公钥验签
			String  alipay_public_key=AlipayConfig.alipay_public_key;
			//卖家账号
			String  seller_id=AlipayConfig.partner;
			//实例化客户端
			AlipayClientApp alipayClient = new                   DefaultAlipayClientApp("https://openapi.alipay.com/gateway.do", app_id, private_key, "json", "utf-8", alipay_public_key);
			//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
			AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
			//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
			AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
			String tradeId = RandomUtil.getRandomFileName();
			//业务订单主体内容
			model.setBody(body);
			//业务订单描述
			model.setSubject(subject);
			//商户订单号,也就是该笔订单的交易记录主键
			model.setOutTradeNo(tradeId);
			//该订单的商品总价格
			model.setTotalAmount(price);
			//签约卖家的账号
			model.setSellerId(seller_id);  
			//销售产品码
			model.setProductCode("QUICK_MSECURITY_PAY");
			//禁用支付方式     此处充值禁用信用卡支付
			if("3".equals(payType)){
				model.setDisablePayChannels("credit_group");				
			}
			//装载订单的业务参数
			request.setBizModel(model);
			//支付宝异步通知地址
			request.setNotifyUrl(Property.getProperty("noifyUrl").trim()); 
			
			 //定义orderString返回给客户端
			 String  orderString="";
			try {
			    //这里和普通的接口调用不同,使用的是sdkExecute
			    AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
			    //就是orderString 可以直接给客户端请求,无需再做处理。
			     System.out.println(response.getBody());  
			     orderString=response.getBody();
			    } catch (AlipayApiException e) {
			      e.printStackTrace();
			}
		
		异步通知集成开始
		@RequestMapping(value = "pay/ailipayNotify", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
public   @ResponseBody  String  ailipayNotify(HttpServletRequest request){
	log.info("支付宝调用了                Pay treasure to call。。。。。666666666。。。。。。。。");
	log.info("进入支付宝异步通知     Enter the pay treasure to asynchronous notification ******");
	DecimalFormat df = new DecimalFormat("######0.00");
	DecimalFormat dformat = new DecimalFormat("######0");
	//获取支付宝POST过来反馈信息
	Map<String,String> params = new HashMap<String,String>();
	Map requestParams = request.getParameterMap();
	log.info("支付宝异步返回结果为:"+requestParams);
	for (Iterator 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] + ",";
	  }
	  //乱码解决,这段代码在出现乱码时使用。
	  //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
	  params.put(name, valueStr);
	 }
	//支付宝公钥验签
	String  alipay_public_key=AlipayConfigSecond.ALIPAY_PUBLIC_KEY;
	log.info("异步通知参数为:params"+params);
	//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
	//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
	boolean  alipayFlag=false;
	try {
		//利用支付宝公钥验签
		alipayFlag= AlipaySignatureNew.rsaCheckV1(params, alipay_public_key, "utf-8", "RSA");
	} catch (AlipayApiException e) {
		e.printStackTrace();
		return "response fail";
	}
	//公钥验签通过
	if(alipayFlag){
		log.info("支付宝公钥验签通过了&&&&&&&&&&&&&&&&&&&&&");
		log.info("支付宝异步通知参数内容 :" + params);
		// 商户订单号
		String out_trade_no=params.get("out_trade_no");
		log.info("参数 22:" + out_trade_no);
		// 支付宝交易号
		String trade_no=params.get("trade_no");
		log.info("参数 e:" + trade_no);
		// 交易状态
		String trade_status=params.get("trade_status");
		log.info("参数66786 :" + trade_status);
		// 开发者账号
		String partner = params.get("seller_id");
		log.info("参数697979 :" + partner);
		String total_fee=params.get("receipt_amount");
		log.info("参数  实际支付金额:"+total_fee);
		// 交易记录表的id
		String tranId = out_trade_no.replace(" ","");
		log.info("参数 tranId:" + tranId);
		// 根据交易id查询一条交易记录
		Transaction tran = tranService.findById(tranId);
		
		//根据用户的交易记录判断
		if (tran!=null) {
			// 订单表的id
			String orderId = tran.getOrderId();
			log.info("参数 orderId:" + orderId);
			log.info("支付宝第四步     Pay the asynchronous notification of success  ");
			log.info("支付宝第五步     Pay the asynchronous notification of success  ");
			// 通过验证卖家账号和开发者账号是否是商户
			if (AlipayConfig.partner.equals(partner)){
				log.info("支付宝第六步     Pay the asynchronous notification of success  ");
				if (trade_status.equals("TRADE_FINISHED")||trade_status.equals("TRADE_SUCCESS")) {
				   //防止重复通知
					long size=requestRedisTemplate.boundValueOps("alipay:lock:"+trade_no).increment(1);
				 	requestRedisTemplate.expire("alipay:lock:"+trade_no,93,TimeUnit.DAYS);
					if(size==1){
						//插入异步通知日志
						asyncService.insertResrcord("alipay", tran.getUserId(), trade_no, total_fee, tranId);
						
						log.info("支付异步通知成功     Pay the asynchronous notification of success  ");
						// 支付宝交易号
						String payNo = trade_no.replace(" ","");
						// 业务处理
					
			 } else {
				log.info("支付宝异步通知请求失败了呜呜呜呜呜!!!!!"); 
				return "response fail";
			}
		}else{
			return "response fail";
		}
	}else{
		return "response fail";
	}
}else{
	return "response fail";
}
	return "success";
}	

  * 注意,以上所用的工具类都可以在支付宝官方demo中下载,进入开发者中心找到对应语言的demo即可下载。
  * 其他支付方式与此类似。
发布了11 篇原创文章 · 获赞 7 · 访问量 5043

猜你喜欢

转载自blog.csdn.net/rg201612/article/details/95172063