支付宝支付收单时存在哪些问题,解决方法有哪些?

一、支付宝支付收单存在以下问题:

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);
        }
    }

}

猜你喜欢

转载自blog.csdn.net/lovoo/article/details/131450927