1、需要jar包
2、请求支付
private static AlipayTradeService tradeService;
@Autowired
static {
/** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数
* Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录
*/
Configs.init("pay.properties");
/** 使用Configs提供的默认参数
* AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new
*/
tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();
}
/**
* 支付宝充值【当面付-扫码支付】
*/
@Login
@PostMapping("alipayReCharge")
public R alipayReCharge(@RequestBody Map<String,Object> params,HttpServletRequest request,@RequestAttribute(AuthorizationInterceptor.USER_KEY) Long userId){
String amount = String.valueOf(params.get("amount"));
String captchaCode = (String) params.get("captcha");
String uuid = (String) params.get("uuid");
boolean captcha = captchaService.validate(CaptchaEntity.RECHARGE_CAPTCHA_PREFIX+uuid, captchaCode);
if(!captcha){
return R.error("验证码不正确");
}
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
String outTradeNo = userId+"_" + System.currentTimeMillis() + (long) (Math.random() * 10000000L);
// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
String subject = "xxxx扫码充值";
// (必填) 订单总金额,单位为元,不能超过1亿元
// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
String totalAmount = amount;
// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
String body = "充值金额"+amount+"元";
// (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
String storeId = "test_store_id";
// 支付超时,定义为120分钟
String timeoutExpress = "1m";
// 创建扫码支付请求builder,设置请求参数
AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder()
.setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setBody(body)
.setStoreId(storeId)
.setTimeoutExpress(timeoutExpress)
.setNotifyUrl(AlipayUtils.RECHARGE_ALIPAY_NOTIFY);//支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置
AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);
switch (result.getTradeStatus()) {
case SUCCESS:
AlipayTradePrecreateResponse response = result.getResponse();
String qrCode = response.getQrCode();
RechargeOrderEntity rechargeOrder = new RechargeOrderEntity();
rechargeOrder.setAmount(new BigDecimal(amount));
rechargeOrder.setBuziType(RechargeOrderEntity.TYPE_ALI);
rechargeOrder.setOutTradeNo(outTradeNo);
rechargeOrder.setUserId(userId);
rechargeOrder.setStatus("0");
rechargeOrderService.save(rechargeOrder);
if(rechargeOrder.getId() > 0){
return R.ok().put("qrCode", qrCode).put("outTradeNo", outTradeNo);
}else{
return R.error("支付宝预下单失败!!!");
}
case FAILED:
return R.error("支付宝预下单失败!!!");
case UNKNOWN:
return R.error("系统异常,预下单状态未知!!!");
default:
return R.error("不支持的交易状态,交易返回异常!!!");
}
}
3、异步回调
/**
* 支付宝充值
* 支付结果获取有两种获取方式:1主动轮询查询状态;2通过异步通知。本充值是采用方式1主动轮询方式
*/
@PostMapping("asyncNotify.do")
public void asyncNotify(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException{
//获取支付宝POST过来反馈信息
Map<String,String> paramsMap = buildParamsMap(request);
//商户订单号
String out_trade_no = paramsMap.get("out_trade_no");
//支付宝交易号
String trade_no = paramsMap.get("trade_no");
//交易状态
String trade_status = paramsMap.get("trade_status");
//订单金额
String total_amount = paramsMap.get("total_amount");
//卖家支付宝用户号
String seller_id = paramsMap.get("seller_id");
//开发者的app_id
String app_id = paramsMap.get("app_id");
//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
RechargeOrderEntity order = rechargeOrderService.queryObject(out_trade_no);
if(order == null) {
response.getWriter().write("failure");
return;
}
//计算得出通知验证结果
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, Configs.getAlipayPublicKey(), AlipayUtils.INPUT_CHARSET,Configs.getSignType()); //调用SDK验证签名
if(signVerified){//验证成功
//请在这里加上商户的业务逻辑程序代码
if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
String status = order.getStatus();
double order_total_amount = order.getAmount().doubleValue();
double ali_total_amount = Double.valueOf(total_amount);
if(! Configs.getAppid().equals(app_id) || ! Configs.getPid().equals(seller_id) || ! (order_total_amount == ali_total_amount)){
response.getWriter().write("failure");
return;
}
if(StringUtils.equals(status, "1")) {
response.getWriter().write("success");
return;
} else if(StringUtils.equals(status, "0")) {
//买家支付宝账号
//String payAccount = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"),"UTF-8");
//买家支付宝用户号
Map<String,Object> other = new HashMap<String,Object>();
other.put("buziId", out_trade_no);
other.put("id", order.getId());
ucenterAccountService.recharge(order.getAmount(), order.getUserId(), SaleOrderEntity.ZHIFUBAO, other);
response.getWriter().write("success"); //请不要修改或删除
}
}else{
response.getWriter().write("failure");
return;
}
}else{
response.getWriter().write("failure");
return;
}
}