java服务器端集成支付宝
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java服务器端集成支付宝相关的知识,希望对你有一定的参考价值。
1.支付宝已经更新添加了封装好的签名方法,可以在自己的项目中直接调用进行签名,减少了自己手动签名产生的问题,主要是在进行方法调用时注意传参的要求,尤其是公钥使用的是支付宝的公钥,而不是APP的公钥
支付宝鼓励使用SDK进行签名,一般调用RSA2 进行签名,并将返回的值直接传递给前端,调用支付宝支付,举个例子:
组装参数:
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody("支付宝支付"); model.setSubject("App支付测试Java"); model.setOutTradeNo(order.getOrderNumber()); model.setTimeoutExpress("30m"); model.setTotalAmount(String.valueOf(order.getPrice())); model.setProductCode("QUICK_MSECURITY_PAY"); tring sign = creatAliPaySign(model);//调用生成签名的方法
调用签名方法,将组装好的参数传递给签名方法:
if(model!=null){ //实例化客户端 AlipayClient alipayClient = new DefaultAlipayClient(ALIPAY_URL, APP_ID, APP_PRIVATE_KEY, ALIPAY_FORMAT, ALIPAY_CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 aliRequest.setBizModel(model); aliRequest.setNotifyUrl(NOTIFY_URL); //这里和普通的接口调用不同,使用的是sdkExecute try { AlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliRequest); String sign = aliResponse.getBody(); return sign; } catch (AlipayApiException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; }
}
将生成的sign值直接返回给客户端即可
2.关于异步通知:
异步通知为支付宝支付完成后,对服务器端发送的通知,客户端返回的为同步通知,我们对订单的处理需要以服务器端的信息为准.异步调用的接口需要参与签名,并通过客户端传递个支付宝,必须为无参的方法.对其发送的异步通知,需要进行验签,已确定支付的唯一性.
可以通过request 获得支付宝异步通知返回的内容:
//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>(); Map requestParams = request.getParameterMap(); 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] + ","; } //乱码解决,这段代码在出现乱码时使用。 // try { // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); // } catch (UnsupportedEncodingException e) { // // TODO Auto-generated catch block // e.printStackTrace(); //} params.put(name, valueStr);
}
需要特别注意的是对乱码的处理,当返回结果没有乱码的时候,需要注释这段代码,不然会出来验签失败的情况.
对返回数据进行验签:
boolean flag = AlipaySignature.rsaCheckV1(params, getAliPayPublicKey(), "UTF-8","RSA2"); //flag=true 则为验签通过,用户可以添加自己的业务逻辑处理,并返回给支付宝服务器端success来通知其已经验签通过
3.支付宝公钥和私钥的生成,这不能算是一个坑,只因自己对此不了解,产生了误解,需要成对生成
以上是关于java服务器端集成支付宝的主要内容,如果未能解决你的问题,请参考以下文章
android 集成支付宝app支付(原生态)-包括android前端与java后台
android 集成支付宝app支付(原生态)-包括android前端与java后台
android 集成支付宝app支付(原生态)-包括android前端与java后台