**
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即可下载。
* 其他支付方式与此类似。