支付宝APP支付Java服务端:
公司项目要求对接支付宝进行支付功能,这边做出整理方便以后使用(支付宝的支付对接还是很简单的)。
1):去支付宝开放平台,-1.注册账号,2.创建应用 3.配置应用 4.开启支付APP支付 5签约,在支付宝开放平台中跟着步骤走就可以完成的操作,为对接做准备工作。
2):上面几部操作完成之后前往 管理中心 查看你申请的应用的 AppID (建议在本地新建一个文档保存这些有用信息 )
3):设置私钥和公钥,点击下载:之后根据支付宝平台提供教程获取自己的私钥和公钥,获取之后保存到上面图片的地方
配置应用公钥之后,支付宝会给你支付宝的公钥;
注:1.应用私钥:用于请求支付宝数据加签
2.应用公钥:用于提供给支付宝,让支付宝去拿着公钥获取你私钥加签后的数据;
3.支付宝公钥:是用来接收支付宝回调信息的
4):将这些有用信息保存到自己新建的文档中,方便开发使用。SDK下载,进入此页面找到javaSDK并下载保存。
之后将所需jar包引入项目 如图:。
一般是maven项目,可在网上百度:将jar引入本地maven仓库,并上传私服。这里就不做教程网上很多。
做完这些之后,就只剩下代码了,相当简单。
5):
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
model.setOutTradeNo(outtradeno);
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("商户外网可以访问的异步地址");
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
} catch (AlipayApiException e) {
e.printStackTrace();
}
在这里我说个注意点(本人踩的坑):上面的demo是支付宝提供的demo,数据为死数据,当运行它之后,直接把返回结果给前端他们是可以唤起支付的,如果想要换成自己的数据,不能从参数中传值取值,只能是前端返回id之后再自己去查完添加model中。
注:
APP_PRIVATE_KEY:为应用私钥。 ALIPAY_PUBLIC_KEY:为应用公钥。具体作用上面有解释。 CHARSET:可直接写成="UTF-8"
6):回调代码直接粘贴即可使用。
注:回调地址拼接完成之后需要添加到 2):步骤下的那张图里 添加授权回调地址。
@RequestMapping(value="notify",produces = {
"application/json;charset=UTF-8" })
@ResponseBody
public String AliNotify(HttpServletRequest request) {
Map requestParams = request.getParameterMap();
/*
* 获取支付宝返回信息
*/
try {
HashMap<String, String> params = new HashMap<String, String>();
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] + ",";
}
if (name.equals("trade_status")) {
System.out.println("交易状态为:"+valueStr);
}
params.put(name, valueStr);
}
logger.info("支付宝返回数据信息:"+params);
//获取支付宝的通知返回参数
//商户订单号
String out_trade_no=new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no=new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//买家登录支付宝id
String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");
//交易时间
String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"),"UTF-8");
//交易金额
String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"),"UTF-8");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date =null;
try {
date = format.parse(gmt_payment);
} catch (Exception e) {
// TODO: handle exception
}
// poublicKey为应用公钥换取的支付宝公钥
// 验证签名
boolean b = AlipaySignature.rsaCheckV1(params, alipaypublicKey, "UTF-8");
//验证通过
if (b) {
//交易状态为成功
if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
/*
* 支付成功后的业务逻辑以后应该写在这里。
* 将支付信息存根
*/
return "SUCCESS";
}
}
return "error:验证签名失败";
} catch (Exception e) {
// TODO: handle exception
return "支付异常";
}
到这里支付宝的支付集成,就算完成了。