一、支付宝支付收单存在以下问题:
1、订单在支付页,不支付,一直刷新,订单过期了才支付,订单状态改为已支付了,但是库
存解锁了。
- 解决方法:使用支付宝自动收单功能解决。只要一段时间不支付,就不能支付了。
2、由于时延等问题。订单解锁完成,正在解锁库存的时候,异步通知才到
- 解决方法:订单解锁,手动调用收单
3、网络阻塞问题,订单支付成功的异步通知一直不到达
- 解决方法:查询订单列表时,ajax获取当前未支付的订单状态,查询订单状态时,再获取一下支付宝此订单的状态
4、其他各种问题
- 解决方法:每天晚上闲时下载支付宝对账单,一一进行对账
二、使用支付宝自动收单功能解决问题1—订单在支付页,不支付
1、设置支付超时时间:String timeout = aliPayConfig.getTimeout();
2.、使用相对时间"“timeout_express”:“” + timeout + “”,"
- 在application.properties配置超时时间
#支付超时时间,表示10分钟,两分钟后就会关单
alipay.timeout=10m
- 支付时setBizContent里添加超时时间
@Override
public String pay(PayVO order) throws AlipayApiException {
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayTemplate.gatewayUrl, AlipayTemplate.app_id, AlipayTemplate.merchant_private_key, "json", AlipayTemplate.charset, AlipayTemplate.alipay_public_key, AlipayTemplate.sign_type);
//1、根据支付宝的配置生成一个支付客户端
AlipayClient alipayClient = new DefaultAlipayClient(
aliPayConfig.getGatewayUrl(),
aliPayConfig.getApp_id(),
aliPayConfig.getMerchant_private_key(),
"json",
aliPayConfig.getCharset(),
aliPayConfig.getAlipay_public_key(),
aliPayConfig.getSign_type());
//2、创建一个支付请求 //设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(order.getReturn_url());
alipayRequest.setNotifyUrl(order.getNotify_url());
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = order.getOut_trade_no();
//付款金额,必填
String total_amount = order.getTotal_amount();
//订单名称,必填
String subject = order.getSubject();
//商品描述,可空
String body = order.getBody();
//超时时间
String timeout = aliPayConfig.getTimeout();
alipayRequest.setBizContent("{
\"out_trade_no\":\"" + out_trade_no + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"body\":\"" + body + "\","
+ "\"timeout_express\":\"" + timeout + "\","// TODO 使用相对时间
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
// 执行创建支付请求,返回支付页面
String result = alipayClient.pageExecute(alipayRequest).getBody();
//会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
System.out.println("支付宝响应:登录页面的代码\n" + result);
return result;
}
三、在订单关闭时,手动关闭支付宝订单页面
以下是使用RabbitMQ关闭订单,
如果此时订单未付款,且关闭了,调用 payService.closePay(order)手动关闭支付宝支付
@Slf4j
@RabbitListener(queues = MQConstant.order_release_queue)
@Component
public class OrderCloseListener {
@Autowired
OrderService orderService;
@Autowired
private PayService payService;
/**
* 定时关单,监听死信队列,如果死信队列 消息过期时间 1分钟 后没有消费,就该关单
* @param order
* @param message
* @param channel
* @throws IOException
*/
@RabbitHandler
public void handleOrderRelease(OrderEntity order, Message message, Channel channel) throws IOException {
log.debug("订单解锁,订单号:" + order.getOrderSn());
try {
orderService.closeOrder(order);
//手动关闭支付宝支付
payService.closePay(order);
// 手动删除消息
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
// 解锁失败 将消息重新放回队列,让别人消费
channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
}
}
}