新版支付宝手机网站支付、支付宝pc支付、支付宝无密退款实现

前面我记录过老版本的支付以及退款,这次写的是新版本的支付和退款

还是那句话,先去看官方文档:https://openhome.alipay.com/developmentDocument.htm

和微信支付一样,用的是IJPay这个封装的jar,必须给大神点个赞,集成了微信支付宝支付,用的也是RSA2官方推荐的方式,给出接口调用即可


支付宝接口社区精华帖集锦-接口样例、常见问题:https://openclub.alipay.com/read.php?tid=2019&fid=25        这个很不错,很多问题都得到了解决


首先拿到支付宝相关信息,


appId,privateKey,publicKey
appId不是PID(2088xxxxxxxx),而是在开发者中心-我的应用里:比如:2016111201740164
生成应用公匙和应用私匙,记着RSA2是2048位的,生成方式上面链接有
将应用公匙上传到平台上,支付宝会返回一个支付宝公匙,复制下来备用
 
 
 
 
 
 
下好官方sdk,引入alipay-sdk-java2017xxxxxxxx.jar有两种方式
1、手动打入maven库然后引用
举例:mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-sdk -Dpackaging=jar -Dversion=java20170829142630 -Dfile=alipay-sdk-java20170829142630.jar -Dsources=alipay-sdk-java20170829142630-source.jar
引用:
 
 
<dependency>
      <groupId>com.alipay</groupId>
      <artifactId>alipay-sdk</artifactId>
      <version>java20170829142630</version>
    </dependency>

2、如果无法引入maven库中可以直接放到项目libs中,然后通过如下方式引用到
 
 
<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>alipay-sdk-java</artifactId>
      <version>java20170829142630</version>
      <scope>system</scope>
      <systemPath>${project.basedir}/libs/alipay-sdk-java20170829142630.jar</systemPath>
    </dependency>


当然如果maven库中有合适的sdk也可以直接引入


引入IJPay

 
 
 
 
<dependency>
      <groupId>com.github.javen205</groupId>
      <artifactId>IJPay</artifactId>
      <version>0.8</version>
</dependency>
 将appId,privateKey(应用私匙),publicKey(支付宝公匙,注意是支付宝公钥),serverUrl(网关)配置好 
 
 
 
 
 
public AliPayApiConfig getApiConfig(){
		return AliPayApiConfig.New()
				       .setAppId(appId)
				       .setAlipayPublicKey(publicKey)
				       .setCharset("UTF-8")
				       .setPrivateKey(privateKey)
				       .setServiceUrl(serverUrl)
				       .setSignType("RSA2")
				       .build();
	}


支付宝wap支付
 
 
/*支付宝浏览器支付,已测试*/
	@RequestMapping(value = "/wapPay.do")
	public void wapPay(HttpServletResponse response) throws IOException {
		System.out.println("--------------------wap pay------------------------");
		String body = "我是测试数据";
		String subject = "77";
		String totalAmount = "1";
		String passbackParams = "1";
		String returnUrl = "http://xxx/alipay/return_url";
		String notifyUrl = "http://xxx/alipay/notify_url";		
		AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();	
		model.setBody(body);
		model.setSubject(subject);
		model.setTotalAmount(totalAmount);
		//model.setPassbackParams(passbackParams);	
		String outTradeNo = StringUtils.getOutTradeNo();
		System.out.println("wap outTradeNo---->"+outTradeNo);
		model.setOutTradeNo(outTradeNo);
		model.setProductCode("QUICK_WAP_PAY");		
		try {		
			AliPayApiConfigKit.putApiConfig(getApiConfig());//这个不能缺
			AliPayApi.wapPay(response, model, returnUrl, notifyUrl);		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

请求wapPay.do就能调起支付宝支付,效果如下
 
 
 
 
 
 
 
 
 
 
pc支付
 
 
 
 
/**
	 * PC支付 成功
	 */
	@RequestMapping(value = "/pcPay.do")
	@ResponseBody
	public void pcPay(HttpServletResponse response){
		try {
			String totalAmount = "0.1";
			String outTradeNo =StringUtils.getOutTradeNo();
			
			String returnUrl = "http://xxx/alipay/return_url";
			String notifyUrl = "http://xxx/alipay/notify_url";
			AlipayTradePayModel model = new AlipayTradePayModel();
			
			model.setOutTradeNo(outTradeNo);
			model.setProductCode("FAST_INSTANT_TRADE_PAY");
			model.setTotalAmount(totalAmount);
			model.setSubject("PC支付测试");
			model.setBody("我是20万");
			AliPayApiConfigKit.putApiConfig(getApiConfig());
			AliPayApi.tradePage(response,model , notifyUrl, returnUrl);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
访问pcPay.do就会跳转到支付页面
 
 
支付成功后都要保存订单号和商户订单号,待退款有用
 
 
无密退款
 
 
/**
    * 退款 成功  无密退款
    */
   @RequestMapping(value = "/tradeRefund.do")
   @ResponseBody
   public String tradeRefund() {
      try {
         AlipayTradeRefundModel model = new AlipayTradeRefundModel();
//       model.setOutTradeNo("042517111114931");
//       model.setTradeNo("2017042521001004200200236813");
         model.setOutTradeNo("10311418115094");
         model.setTradeNo("201710312100104740246541100");
         model.setRefundAmount("0.10");
         model.setRefundReason("正常退款");
         AliPayApiConfigKit.putApiConfig(getApiConfig());
         System.out.println("refund");
         return AliPayApi.tradeRefund(model);
      } catch (AlipayApiException e) {
         e.printStackTrace();
      }
      return null;
   }
传入订单号和商户订单号,访问tradeRefund.do直接退款成功,这里return可以返回你自己的路径,AlipayApi.tradeRefund(model)写前面去
返回的数据是:
 
 
 
 
 
 
@RequestMapping(value = "/return_url.do")
	@ResponseBody
	public String return_url(HttpServletRequest request) {
		try {
			// 获取支付宝GET过来反馈信息
			Map<String, String> map = AliPayApi.toMap(request);
			for (Map.Entry<String, String> entry : map.entrySet()) {
				System.out.println(entry.getKey() + " = " + entry.getValue());
			}
			
			boolean verify_result = AlipaySignature.rsaCheckV1(map, publicKey, "UTF-8",
					"RSA2");
			
			if (verify_result) {// 验证成功
				// TODO 请在这里加上商户的业务逻辑程序代码
				System.out.println("return_url 验证成功");
				
				return "success";
			} else {
				System.out.println("return_url 验证失败");
				// TODO
				return "failure";
			}
		} catch (AlipayApiException e) {
			e.printStackTrace();
			return "failure";
		}
	}
上面直接返回即可
notify_url异步通知处理业务,给支付宝返回success,如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,
去重一定要注意,当初我就坑了。。。支付一次业务处理好几次
去重方法:方案1、入库字段设置为唯一,
		方案2、有异步通知就通过订单查库判断是否存在
 
 
@RequestMapping(value = "/notify_url.do")
	@ResponseBody
	public String  notify_url(HttpServletRequest request) throws UnsupportedEncodingException {
		try {
			// 获取支付宝POST过来反馈信息
			Map<String, String> params = AliPayApi.toMap(request);
			
			for (Map.Entry<String, String> entry : params.entrySet()) {
				System.out.println(entry.getKey() + " = " + entry.getValue());
			}
			//交易状态
			String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");
			boolean verify_result = AlipaySignature.rsaCheckV1(params,publicKey, "UTF-8",
					"RSA2");
			
			if (verify_result) {// 验证成功
				if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
					// TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理
					System.out.println("notify_url 验证成功succcess");
					
					return "success";
				}
			} else {
				System.out.println("notify_url 验证失败");
				// TODO
				return "failure";
			}
		} catch (AlipayApiException e) {
			e.printStackTrace();
			return "failure";
		}
		return "fail";
	}
 
 
我的demo:https://download.csdn.net/download/goligory/10048415
相关链接: http://blog.csdn.net/zyw_java/article/details/71970972

 
 

 
 
 

猜你喜欢

转载自blog.csdn.net/Goligory/article/details/78402520