相对微信支付而言,支付宝的支付开发文档易懂。并且有封装好了的sdk.开发者很容易实现支付宝支付功能。先说说的支付宝的支付逻辑。我公司申请的是app支付。后台需要自己生成商户唯一的订单号,调用支付宝封装号的sdk接口。调用成功,支付宝返回一个加密的支付凭证。可以直接返回到前端app。不用再做处理,前端那到这个支付凭证。唤醒支付宝app支付金额。支付成功后,前端app会跳转一个界面。支付宝会异步调用一个自己服务器后端的一个方法。确定是否正在付款成功。最终是否付款成功也以这个回调服务器这个为准。代码如下。虽然有点乱。
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//实例化客户端
/*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(pingres.getBody());
model.setSubject(pingres.getSubject());
model.setOutTradeNo(pingres.getOut_trade_no());
model.setTimeoutExpress("30m");
model.setTotalAmount(pingres.getTotal_amount());
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("xxx/callbacks.do");Map<Object, Object> map=new HashMap<Object, Object>();
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
map.put("result", response.getBody());
return new AjaxResult(map);
} catch (AlipayApiException e) {
e.printStackTrace();
map.put("result", "-1");
return new AjaxResult(map);
}
支付宝的回掉解析:
@ResponseBody
@RequestMapping("/callbacks.do")
public String callbacks( HttpServletRequest request ) throws Exception {
//接收支付宝返回的请求参数
Map requestParams = request.getParameterMap();
JSONObject json = JSONObject.parseObject(JSON.toJSONString(requestParams));
String trade_status = json.get("trade_status").toString().substring(2,json.get("trade_status").toString().length()-2);
String out_trade_no = json.get("out_trade_no").toString().substring(2,json.get("out_trade_no").toString().length()-2);
String notify_id = json.get("notify_id").toString().substring(2,json.get("notify_id").toString().length()-2);
System.out.println("====================================================");
System.out.println(json.toString());
System.out.println("支付宝回调地址!");
System.out.println("商户的订单编号:" + out_trade_no);
System.out.println("支付的状态:" + trade_status);
if(trade_status.equals("TRADE_SUCCESS")) {
自己的业务逻辑
return "SUCCESS";
}
else {
自己的业务逻辑
return "error";
}
}